AES256加密在node.js和objective-c之间得到不同的结果

时间:2013-11-19 07:39:16

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

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 ==

。目的-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

1 个答案:

答案 0 :(得分:1)

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

答案是使用crypto.createCipher(algorithm, password)代替{{1}}。

来自node.js文档:

  

根据OpenSSL建议使用pbkdf2而不是EVP_BytesToKey,建议您使用crypto.pbkdf2派生一个密钥并使用iv来创建密码流。