加密错误的AES-256-ecb加密

时间:2018-01-29 21:35:40

标签: node.js encryption cryptography aes

我试图加密" 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个不同的密文。

1 个答案:

答案 0 :(得分:1)

ECB模式不接受IV。但是,如果您将其删除,则会匹配this createCipher method that takes a password instead of a key方法签名。因此,您需要一些表示IV的对象来选择接受密钥而不是密码的方法,即使该对象随后被忽略。

不要在一些糟糕的在线工具上测试您的代码,而是使用NIST测试向量。不要使用ECB。并且,请注意糖,请确保仔细阅读API文档,特别是在您遇到问题之后。