我正在定期解密消息字符串。在研究了多个 jsperf 之后,我注意到 forge 和 stanford 比 cryptojs 更快 - 我需要额外的速度,因为我必须支持较旧的移动设备,所以我正在尝试迁移。
这是工作 crpto-js 代码:
var feed = message.data.msg;
var iv = CryptoJS.enc.Hex.parse(_iv);
var key = CryptoJS.enc.Hex.parse(_key);
var decrypted = CryptoJS.AES.decrypt(feed.substr(32), key, { iv: iv });
feed = decrypted.toString(CryptoJS.enc.Utf8);
现在是非工作伪造代码:
var feed = message.data.msg;
var iv = forge.util.hexToBytes(_iv);
var key = forge.util.hexToBytes(_key);
var buffer = forge.util.createBuffer( feed.substr(32) );
var cipher = forge.aes.createDecryptionCipher(key);
cipher.start( iv );
cipher.update( buffer );
cipher.finish();
feed = cipher.output.toHex();
用 forge 解密后,我得到了随机困惑的字符。在单步执行代码时,唯一值得注意的是 forge/aes.js 第 969 行中的失败:
if(count > (Nb << 2)) {
rval = false;
}
正在触发并返回 false。
我在这里不知所措,因为两个库都使用 CBC 作为 AES 的默认值,所以一切都应该正常工作。
最佳答案
您是否尝试过更改:
var buffer = forge.util.createBuffer( feed.substr(32) );
致:
var buffer = forge.util.createBuffer( forge.util.decode64( feed.substr(32) ) );
改变:
feed = cipher.output.toHex();
致:
feed = cipher.output.getBytes();
关于javascript - AES 解密在 forge 中失败,但在 crypto-js 中有效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19140185/