gpt4 book ai didi

javascript - SJCL CBC模式无法解密

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

使用使用SJCL的RNCryptor。我正在尝试解密十六进制消息,但是当使用 CBC 模式时,事情变得很奇怪。显然,在使用 CBC 时必须声明一个注意声明,但我收到了一个错误。

function KeyForPassword(password, salt) {
console.log("Creating key...");
var hmacSHA256 = function (password) {
var hasher = new sjcl.misc.hmac(password, sjcl.hash.sha256);
this.encrypt = function () {
return hasher.encrypt.apply(hasher, arguments);
};
};
return sjcl.misc.pbkdf2(password, salt, 10000, 32 * 8, hmacSHA256);
};


function decrypt(password, message, options) {

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

options = options || {};

var version = sjcl.bitArray.extract(message, 0 * 8, 8);
var options = sjcl.bitArray.extract(message, 1 * 8, 8);

var encryption_salt = sjcl.bitArray.bitSlice(message, 2 * 8, 10 * 8);
var encryption_key = _this.KeyForPassword(password, encryption_salt);

var hmac_salt = sjcl.bitArray.bitSlice(message, 10 * 8, 18 * 8);
var hmac_key = _this.KeyForPassword(password, hmac_salt);

var iv = sjcl.bitArray.bitSlice(message, 18 * 8, 34 * 8);

var ciphertext_end = sjcl.bitArray.bitLength(message) - (32 * 8);
var ciphertext = sjcl.bitArray.bitSlice(message, 34 * 8, ciphertext_end);

var hmac = sjcl.bitArray.bitSlice(message, ciphertext_end);
var expected_hmac = new sjcl.misc.hmac(hmac_key).encrypt(sjcl.bitArray.bitSlice(message, 0, ciphertext_end));

// .equal is of consistent time
if (! sjcl.bitArray.equal(hmac, expected_hmac)) {
throw new sjcl.exception.corrupt("HMAC mismatch or bad password.");
}

var aes = new sjcl.cipher.aes(encryption_key);
sjcl.beware["CBC mode is dangerous because it doesn't protect message integrity."]()
var decrypted = sjcl.mode.cbc.decrypt(aes, ciphertext, iv);


return decrypted.toString(CryptoJS.enc.Utf8);
};

在盐、 key 和哈希方面,一切都与 Python 端的加密相匹配。但我收到此错误:

TypeError: Cannot read property 'CBC mode is dangerous because it doesn't protect message integrity.' of undefined

我认为该方法已被弃用,因此我尝试使用此 CryptoJS 方法:

var decrypted = CryptoJS.AES.decrypt(ciphertext, encryption_key, {iv:iv});

这只是返回一个空白字符串。

我觉得我已经很接近了,只是在最后一部分需要一些帮助,谢谢。

最佳答案

SJCL

如果您查看 configure on GitHub,预构建的 sjcl.js 中不包含 CBC。 。您必须在页面中单独包含 CBC 文件 (core/cbc.js),否则您需要操作 configure 文件以将 cbc 添加到启用的模块列表中。

加密JS

decrypted不是空字符串。 CryptoJS.<cipher>.decrypt()返回 WordArray负数为 sigBytes 的对象。此属性表示 WordArray 的字节数。预计将包含。负数意味着出现问题。它并不总是必须是负数。

可能存在很多问题:

  • 您没有正确的 key 。
  • 您没有正确切片的密文。
  • ciphertext不是 OpenSSL 格式的字符串或不是 CipherParams目的。尝试通过{ciphertext: ciphertext}相反。
  • key 和 IV 的格式不正确:它们应该是 WordArray对象。

关于javascript - SJCL CBC模式无法解密,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32192697/

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