简体   繁体   English

斯坦福Javascript加密库。 (SJCL)加密和解密而不发送参数

[英]Stanford Javascript Crypto Library. (SJCL) encrypt and decrypt without sending parameters

In the SJCL Demo there is the checkbox "Send the parameters and authenticated data along with the message." SJCL演示中,有一个复选框“与消息一起发送参数和已验证的数据”。 to reduce the message to a very short string. 将消息减少为非常短的字符串。

I can´t find a list with valid parameters for the use in the encrypt (and decrypt) function: 我找不到包含用于加密(和解密)功能的有效参数的列表:

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

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

If you enter a password, text and click encrypt the result will be in the Ciphertext box, ex: 如果输入密码,文本并单击加密,则结果将在密文框中,例如:
password:"pass", message:"text", Authenticated data:" xxx" 密码:“ pass”,消息:“ text”,认证数据:“ xxx”

Result: 结果:

{
"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
}

Example usage from the site : 站点的用法示例:

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

The catch is that notwithstanding the availability stated the modes CCM and OCB2 are not commonly supported across platforms. 问题是,尽管有可用性说明,跨平台通常不支持模式CCMOCB2

Thanks for your help!!! 谢谢你的帮助!!! For a minimal message overhead in my database this solution works for me: 为了使数据库中的消息开销最小,该解决方案适用于我:

  //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"

Use this: 用这个:

<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>

Thanks, Steffen. 谢谢,史蒂芬。 It might be a little cleaner to separate the options, so then we can iterate through the options to delete. 分离选项可能会更干净一些,因此我们可以遍历选项进行删除。 Also, the salt needs to be base64, which we can easily generate with JavaScript's btoa() function. 另外,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"

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM