【问题标题】:Stanford Javascript Crypto Library. (SJCL) encrypt and decrypt without sending parameters斯坦福 Javascript 加密库。 (SJCL) 不发参数加解密
【发布时间】:2016-10-02 18:13:52
【问题描述】:

SJCL Demo 中有“随消息一起发送参数和验证数据”复选框。将消息减少为非常短的字符串。

我找不到用于加密(和解密)函数的有效参数列表:

var encryptedMessage = sjcl.encrypt(key,message, ??? );

var decryptedMessage = sjcl.decrypt(key,encryptedMessage);

【问题讨论】:

  • 当复选框被选中时,必要的参数将与消息一起发送,例如 iv 和密码 salt。如果接收者已经知道这些,则不需要发送。
  • 选项列出了here,你对哪些有问题?加密选项包含在“encryptedMessage”中,这是一种容器格式,因此您无需在解密期间指定它们。这能回答你的问题吗?
  • 请注意,这是一种愚蠢(不是 SJCL 的第一个愚蠢),因为它允许攻击者填写选项,例如较小的身份验证标签。你最好自己检查变量。

标签: javascript encryption cryptography sjcl


【解决方案1】:

如果您输入密码、文本并单击加密,结果将显示在密文框中,例如:
密码:“pass”,消息:“text”,认证数据:“xxx”

结果:

{
"iv":"tjp81jkAzUpW1bI9gLDDpg==", // iv Base64 encoded
"v":1,                           // version
"iter":1000,                     // iteration count
"ks":128,                        // key size in bits
"ts":64,                         // authentication strength
"mode":"ccm",                    // mode
"adata":"xxx",                   // authenticated data
"cipher":"aes",                  // cipher
"salt":"lx06UoJDNys=",           // key derivation salt
"ct":"Gv7ptKdTtUz6AGtX"          // ciphet text
}

来自site的示例用法:

sjcl.encrypt("password", "data") 
sjcl.decrypt("password", "encrypted-data")

问题在于,尽管有声明,CCMOCB2 模式并不普遍支持跨平台。

【讨论】:

    【解决方案2】:

    感谢您的帮助!!!为了使我的数据库中的消息开销最小,此解决方案适用于我:

      //Encrypt
      var encryptedMessage = sjcl.encrypt("myPassword","myMessage",{mode:"ccm",iter:1000,ks:128,ts:64,v:1,cipher:"aes",adata:"",salt:"myGeneratedSalt"});
      var parsedMessage = JSON.parse(encryptedMessage);
      delete parsedMessage.mode;
      delete parsedMessage.iter;
      delete parsedMessage.ks;
      delete parsedMessage.ts;
      delete parsedMessage.v;
      delete parsedMessage.cipher;
      delete parsedMessage.salt;
      delete parsedMessage.adata;
      encryptedMessageWithoutParameters = JSON.stringify(parsedMessage);
    
      //Decrypt
      var parsedMessage = JSON.parse(encryptedMessageWithoutParameters);
      jQuery.extend(parsedMessage,{mode:"ccm",iter:1000,ks:128,ts:64,v:1,cipher:"aes",adata:"",salt:"myGeneratedSalt"});
      messageWithParameters = JSON.stringify(parsedMessage);
      var decryptedMessage = sjcl.decrypt("myPassword",messageWithParameters);
    
      //Result > "myMessage"
    

    【讨论】:

      【解决方案3】:

      使用这个:

      <script type="text/javascript" src="js/sjcl.js"></script>
          <script type="text/javascript">
      
          var cypheredMsg = sjcl.encrypt("secret", "Hi Amresh!");
          var plainMsg = sjcl.decrypt("secret", cypheredMsg);
      
          console.log(cypheredMsg);
          console.log(plainMsg);
      
          </script>
      

      【讨论】:

        【解决方案4】:

        谢谢,史蒂芬。将选项分开可能会更简洁一些,因此我们可以遍历要删除的选项。另外,salt 必须是 base64,我们可以使用 JavaScript 的 btoa() 函数轻松生成。

          //Encrypt
          var salt = btoa( "myGeneratedSalt" );
          var options = {mode:"ccm",iter:1000,ks:128,ts:64,v:1,cipher:"aes",adata:"",salt:salt}
          var encryptedMessage = sjcl.encrypt("myPassword","myMessage",options);
          var parsedMessage = JSON.parse(encryptedMessage);
          var prop;
          for (prop in options) {
            delete parsedMessage[prop];
          }
          encryptedMessageWithoutParameters = JSON.stringify(parsedMessage);
        
          //Decrypt
          var parsedMessage = JSON.parse(encryptedMessageWithoutParameters);
          jQuery.extend(parsedMessage,options);
          messageWithParameters = JSON.stringify(parsedMessage);
          var decryptedMessage = sjcl.decrypt("myPassword",messageWithParameters);
        
          //Result > "myMessage"
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2014-03-13
          • 1970-01-01
          • 2014-09-27
          • 1970-01-01
          • 1970-01-01
          • 2014-04-20
          • 2015-11-18
          相关资源
          最近更新 更多