首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SJCL不连接位数组

SJCL不连接位数组
EN

Stack Overflow用户
提问于 2015-08-19 20:51:10
回答 1查看 462关注 0票数 1

我试图使用使用SJCL的RNCryptor-JS,但由于某种原因,SJCL位数组连接似乎不起作用。

代码语言:javascript
复制
var SALT_SIZE = 64/8;

var plaintext = "Hello, World!";

var password = "myPassword";

function keyForPassword(password, salt){
    // Using CryptoJS for pbkdf2, aes, sha256, and random word arrays
    var pbkdf2_key = CryptoJS.PBKDF2(
        password,
        salt,
        {
          keySize: 256/32,
          iterations: 1000,
          hasher: CryptoJS.algo.SHA256
        }
      );
    return pbkdf2_key;
}

var encryption_salt = CryptoJS.lib.WordArray.random(SALT_SIZE);
var encryption_key = keyForPassword(password, encryption_salt);

var hmac_salt = CryptoJS.lib.WordArray.random(SALT_SIZE);
var hmac_key = keyForPassword(password, hmac_salt);

var iv = CryptoJS.lib.WordArray.random(128/8);

var version = sjcl.codec.hex.toBits("03");
var options = sjcl.codec.hex.toBits("01");

var message = sjcl.bitArray.concat(version, iv);
message = sjcl.bitArray.concat(message, encryption_salt);
message = sjcl.bitArray.concat(message, hmac_salt);
message = sjcl.bitArray.concat(message, iv);

// Progressive cipher
var aesEncryptor = CryptoJS.algo.AES.createEncryptor(encryption_key, {iv: iv});
var ciphertext = aesEncryptor.process(plaintext);

message = sjcl.bitArray.concat(message, ciphertext);    

var hmac = new sjcl.misc.hmac(hmac_key).encrypt(message);

var encrypted_data = sjcl.bitArray.concat(message, hmac);
var output = sjcl.codec.hex.fromBits(encrypted_data);

console.log(output);

当我在完成第一组message之后记录sjcl.bitArray.concat的输出时,所有返回的都是versioniv的第一个级联。最后的十六进制输出只是第一次连接和hmac连接。这增强了我的怀疑,即这可能是CryptoJS的错误,因为输出连接工作,并且在两个sjcl变量之间。

我尝试使用SJCL随机位数组,但遇到了一些问题。SJCL的生成器prng在使用

代码语言:javascript
复制
new sjcl.prng.randomWords(32/4);

代码语言:javascript
复制
new sjcl.prng(32/4);

sjcl.random.randomWords似乎不再起作用了。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-08-19 21:31:09

CryptoJS (WordArray)和SJCL (bitArray)对数据有不同的内部表示。你不能简单地把它们连在一起。

最简单的方法可能是将其编码为中间格式(如十六进制),并让另一方解码为其内部格式:

代码语言:javascript
复制
message = sjcl.bitArray.concat(version, sjcl.codec.hex.toBits(iv.toString()));

WordArray#toString()自动使用十六进制编码。您必须对所有行都这样做,但这有点过分,因为您可以将十六进制字符串连接为字符串:

代码语言:javascript
复制
message = sjcl.codec.hex.toBits("03" + iv + encryption_salt + hmac_salt + iv);

这应该会像预期的那样工作,因为向字符串中添加WordArray (如iv )会自动调用它的toString()函数,而toString()函数又会生成一个大端十六进制编码的字符串。

我想知道为什么你要使用iv两次。也许你指的是其中之一的options

需要改变的是:

代码语言:javascript
复制
function convert(wordArray){
    return sjcl.codec.hex.toBits(wordArray.toString());
}
var message = "0301" + encryption_salt + hmac_salt + iv;

var ciphertext = CryptoJS.AES.encrypt(plaintext, encryption_key, {iv: iv}).ciphertext;

message += ciphertext;
message = sjcl.codec.hex.toBits(message);

var hmac = new sjcl.misc.hmac(convert(hmac_key)).encrypt(message);

var encrypted_data = sjcl.bitArray.concat(message, hmac);
var output = sjcl.codec.hex.fromBits(encrypted_data);

console.log(output);
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32105457

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档