1

我定期解密消息字符串。在研究了多个 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 的默认值,所以一切都应该正常工作。

4

1 回答 1

2

您是否尝试过更改:

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();
于 2013-10-02T21:01:08.557 回答