我想使用RNCryptor-JS使用SJCL,但由於某種原因,SJCL位數組連接似乎不起作用。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);
當我登錄的message
輸出的第一套sjcl.bitArray.concat
完成後,所有的返回是version
和iv
第一個串聯。最後的十六進制輸出只是第一個級聯和hmac
級聯。這加強了我的懷疑,即它可能是CryptoJS的錯,因爲輸出串接工作並且在兩個sjcl變量之間。
我試過使用SJCL隨機位陣列,但有一些麻煩。使用
new sjcl.prng.randomWords(32/4);
或
new sjcl.prng(32/4);
而且sjcl.random.randomWords
時似乎並沒有工作了SJCL的發電機,prng
,沒有工作。
是啊,這應該是選項。忘了改變調試。感謝您的解決方案。這部分工作,但現在密文沒有被包括在內,'hmac'緊接在'iv'之後。感謝您的反饋! – PizzaPleb
忘了向下滾動。其他功能也一樣。您需要轉換表示。 –
試圖通過'message + ciphertext'和'message + hmac'將'toBits'串聯應用到各種字符串格式組合的結尾,但是這樣會持續出現帶有許多0的字符串。編碼不是我的包。感謝您的耐心等待。 – PizzaPleb