我定期解密消息字符串。在研究了多个 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/aes.js 中的错误,第 969 行:
if(count > (Nb << 2)) {
rval = false;
}
正在触发并返回 false。
我在这里不知所措,因为两个库都使用 CBC 作为 AES 的默认值,所以一切都应该正常工作。