encryption_key = 0F777D55FDB154E7D8754C3C0E660A65
data = 112233440220160120165502121122334455660811223344156D6173746572706173735F757365720104800000000000
iv = 00000000000000000000000000000000
结果= 4A2D82F722F2720E58CE3170A2398783B5F8F1D40404D90A03019C1082DA47D3E855BD8A09F294D3B06076144286F7F1
但是节点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);
答案 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方案来实现。