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

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:]就在这里

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

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

从node.js文档:

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