【问题标题】:AES256 encryption get different result between node.js and objective-cAES256加密在node.js和objective-c之间得到不同的结果
【发布时间】:2013-12-02 15:59:12
【问题描述】:

1.Node.js

    var crypto = require('crypto');
    var key = "my password";
    var text = "text to encrypt";  
    var cipher = crypto.createCipher('aes-256-cbc',key);  
    var crypted =cipher.update(text,'utf8','base64');
    crypted+=cipher.final('base64');

结果:ZeYCYOrR/w7qSAZVYht8+Q==

2.Objective-C

{
    NSString *key = @"my password";
    NSString *text = @"text to encrypt";
    NSData *plain = [secret dataUsingEncoding:NSUTF8StringEncoding];
    NSData *cipher = [plain AES256EncryptWithKey:key];
    NSLog(@"%@\n", [cipher base64Encoding] );
}

结果:raFGdTWYvSPWpkgtF9LJIg==

[AES256EncryptWithKey:]HERE

【问题讨论】:

  • 我的猜测是 node.js 会自动生成 IV 值,而 iOS 使用的是全零向量。尝试为两者指定相同的 IV 值(文档表明有一个 node.js 方法也可以接受 IV)。
  • @borrrden 有一个方法crypto.createCipheriv(algorithm, key, iv),我应该如何设置iv?
  • 就是任意一个128位长的二进制字符串,你可以任意选择,只要两边都用同一个即可。
  • 其实我认为你需要先将node.js中的字符串转换成二进制,就像你在Objective-C版本中所做的那样,但我不确定如何(不熟悉node)。
  • 我通过执行你的 node.js 代码得到了不同的结果。这是使用给定键和给定文本的结果,还是来自您的生产代码?

标签: ios objective-c node.js encryption aes


【解决方案1】:

问题在于 node.js crypto.createCipher 在内部使用密钥派生函数 EVP_BytesToKey()key = "my password" 生成 AES 密钥和 iv。因此,对于 node.js 和 Common Crypto,实际的 AES 密钥是不同的。

答案是使用crypto.createCipheriv(algorithm, key, iv) 代替crypto.createCipher(algorithm, password)

来自 node.js 文档:

根据 OpenSSL 建议使用 pbkdf2 而不是 EVP_BytesToKey,建议您使用 crypto.pbkdf2 自己派生密钥和 iv,然后使用 createCipheriv() 创建密码流。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-16
    • 2012-07-12
    • 2013-09-16
    • 2015-04-23
    • 2018-01-19
    • 1970-01-01
    • 2013-03-01
    相关资源
    最近更新 更多