使用RNCryptor,它使用SJCL。我试图解密一条十六进制信息,但当使用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);
};所有内容都与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});这只是返回了一个空字符串。
我觉得我真的很亲密,只是在最后的部分需要一些帮助,谢谢。
发布于 2015-10-02 01:47:22
正如Artjom .所说的,cbc.js和bitArray.js (解密的必要部分和我缺少的东西)一样是必需的。原来的代码现在运行良好。
正如罗伯纳皮尔所指出的,在PBKDF2迭代计算中,它是缓慢的。然而,对于这种情况(解密),10K计数工作得很快,但是对于加密,我在1000次迭代时用CryptoJS的PBKDF2来补充kdf (用sjcl获取bitArray错误)。
发布于 2015-08-25 08:29:43
SJCL
如果您查看sjcl.js,CBC不包含在预构建的基于GitHub的配置中。您必须在页面中单独包含CBC文件(core/cbc.js),否则需要操作配置文件以将cbc添加到已启用模块的列表中。
CryptoJS
decrypted不是空字符串。CryptoJS.<cipher>.decrypt()返回一个负数为sigBytes的WordArray对象。此属性表示期望WordArray包含的字节数。负数意味着出了问题。它不一定总是一个负数。
可能会有一些问题:
ciphertext不是OpenSSL格式的字符串,也不是CipherParams对象。试着通过{ciphertext: ciphertext}。WordArray对象。https://stackoverflow.com/questions/32192697
复制相似问题