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

Mil*_*0R3 5 encryption aes objective-c node.js ios

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');
Run Code Online (Sandbox Code Playgroud)

结果: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] );
}
Run Code Online (Sandbox Code Playgroud)

结果:raFGdTWYvSPWpkgtF9LJIg ==

[AES256EncryptWithKey:]在 这里

zap*_*aph 1

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

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

来自node.js文档:

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