【发布时间】:2015-11-13 08:10:39
【问题描述】:
我正在尝试使用使用 SJCL 的 RNCryptor-JS,但由于某种原因,SJCL 位数组连接似乎不起作用。
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);
当我在第一组sjcl.bitArray.concat 完成后记录message 的输出时,返回的只是version 和iv 的第一个串联。最终的十六进制输出就是第一个连接和hmac 连接。这加强了我的怀疑,即这可能是 CryptoJS 的错,因为输出连接有效并且位于两个 sjcl 变量之间。
我尝试使用 SJCL 随机位数组,但遇到了一些问题。 SJCL的生成器prng在使用时不工作
new sjcl.prng.randomWords(32/4);
或
new sjcl.prng(32/4);
而sjcl.random.randomWords 似乎不再起作用了。
【问题讨论】:
标签: javascript cryptojs bitarray rncryptor sjcl