node js aes-256-cbc加密缓冲区和纯文本

时间:2016-04-06 09:13:23

标签: javascript node.js encryption

encryption_key = 0F777D55FDB154E7D8754C3C0E660A65

data = 112233440220160120165502121122334455660811223344156D6173746572706173735F757365720104800000000000

iv = 00000000000000000000000000000000

结果= 4A2D82F722F2720E58CE3170A2398783B5F8F1D40404D90A03019C1082DA47D3E855BD8A09F294D3B06076144286F7F1

当我在在线计算器上运行这些值时,结果是匹配的 http://extranet.cryptomathic.com/aescalc/index?key=0F777D55FDB154E7D8754C3C0E660A65&iv=00000000000000000000000000000000&input=112233440220160120165502121122334455660811223344156D6173746572706173735F757365720104800000000000&mode=cbc&action=Encrypt&output=

但是节点js代码不起作用:

var crypto, ALGORITHM, KEY;

crypto = require('crypto');

ALGORITHM = 'AES-256-CBC';
KEY = new Buffer('0F777D55FDB154E7D8754C3C0E660A65');

var IV = new Buffer('0000000000000000');
var cipher_text;
var encryptor;

encryptor = crypto.createCipheriv(ALGORITHM, KEY, IV);
encryptor.setEncoding('utf8');
encryptor.write('112233440220160120165502121122334455660811223344156D6173746572706173735F757365720104800000000000');
encryptor.end();

cipher_text = encryptor.read();
console.log(cipher_text);

1 个答案:

答案 0 :(得分:2)

Latin1“0”字符的编码与您在示例中使用的0x00字节不同。您应该将IV数据提供为十六进制:

var IV = new Buffer('00000000000000000000000000000000', 'hex');

顺便说一下,你的密钥只有32个六角形长度(16个实际字节),所以你使用的是AES-128而不是AES-256:ALGORITHM = 'AES-128-CBC';

安全注意事项:

使用固定IV不具有语义安全性。您需要为CBC模式使用不可预测的(读取:随机)IV。由于IV不需要保密,您可以将其与密文一起发送。一种常见的方法是将其添加到密文并在解密之前将其切掉。

此外,您应该以检测(恶意)密文更改的方式进行加密。这通常通过使用经过身份验证的模式(如GCM或EAX)进行身份验证加密,或者应用具有强MAC(如HMAC-SHA256)的加密 - 然后MAC方案来实现。