gpt4 book ai didi

javascript - SJCL 不连接位数组

转载 作者:行者123 更新时间:2023-11-30 16:40:23 27 4
gpt4 key购买 nike

我正在尝试使用使用 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 似乎不再起作用了。

最佳答案

CryptoJS ( WordArray ) 和 SJCL ( bitArray ) 具有不同的数据内部表示。您不能简单地将它们连接起来。

最简单的方法可能是将其编码为中间格式,例如 Hex,然后让另一方解码为其内部格式:

message = sjcl.bitArray.concat(version, sjcl.codec.hex.toBits(iv.toString()));

WordArray#toString() 自动使用十六进制编码。您必须对所有行执行此操作,但这有点矫枉过正,因为您可以将十六进制字符串连接为字符串:

message = sjcl.codec.hex.toBits("03" + iv + encryption_salt + hmac_salt + iv);

这应该按预期工作,因为将 iv 之类的 WordArray 添加到字符串会自动调用其 toString() 函数,该函数反过来产生大端十六进制编码的字符串。

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


需要改变的地方:

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

关于javascript - SJCL 不连接位数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32105457/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com