我试图加密" aaaaaaaaaaa"在aes-256-ecb
var encrypt = function(cryptkey, cleardata) {
var encipher = crypto.createCipher('aes-256-ecb', cryptkey);
return Buffer.concat([
encipher.update(cleardata),
encipher.final()
]);
}
var hex_key = [0x2A,0x46,0x29,0x4A,0x40,0x4E,0x63,0x52,0x66,0x55,0x6A,0x58,0x6E,0x32,0x72,
0x35,0x75,0x38,0x78,0x2F,0x41,0x3F,0x44,0x28,0x47,0x2B,0x4B,0x61,0x50,0x64,0x53,0x67]
var _text = new Buffer([0x61,0x61,0x61,0x61,0x61,0x61,0x61,0x61,0x61,0x61,0x61])
console.log(encrypt(hex_key,_text));
//prints
<Buffer 2c 2d 90 b3 0f ef 3d 6f 73 68 db da 72 34 9c 80>
我注意到它与此加密工具的结果不匹配 http://aes.online-domain-tools.com/link/10a8ee2gzyiHxWlCJr/
编辑:最后我阅读了文档并得到了签名错误(正如Maarten Bodewes所建议的那样),现在我对输出有疑问:
节点加密使用createCipheriv() AND pyCrypto(python)输出:
8f c9 89 36 ba 7b 16 2a a8 bc 11 a4 b4 cd e3 08
在线工具 AND c ++库:
ad 5f 91 18 2c ed d1 d1 db 0d ab 34 8c 1c 8b
谁没事?
解决方案:最终我得到了它, c ++库,该在线工具使用0-padding方法来填充块。不知道在节点crypto和pyCrypto中处理填充的默认方式是什么,无论如何,这就是为什么我从4个aes实现中得到2个不同的密文。
答案 0 :(得分:1)
ECB模式不接受IV。但是,如果您将其删除,则会匹配this createCipher
method that takes a password instead of a key的方法签名。因此,您需要一些表示IV的对象来选择接受密钥而不是密码的方法,即使该对象随后被忽略。
不要在一些糟糕的在线工具上测试您的代码,而是使用NIST测试向量。不要使用ECB。并且,请注意糖,请确保仔细阅读API文档,特别是在您遇到问题之后。