在iOS中解码OpenSSL AES256string

CLI

$ echo -n "TEST1" | openssl enc -aes256 -k FUUU -nosalt -a bYbkQJcDFZt3y3UQEMbEeg== 

iOS版

 NSString *leSYT = @"bYbkQJcDFZt3y3UQEMbEeg=="; NSData *data = [NSData dataFromBase64String:leSYT]; NSLog(@"%@",[data AES256DecryptWithKey:@"FUUU"]); 

iOS失败后不输出任何内容。 我错过了什么?

NSData增加: http : //pastie.org/426530 // Matt Gallagher的NSData + Base64

OpenSSL的enc实用程序中的-k选项从您的密码“FUUU”中派生出AES密钥和IV。 您可以使用-p选项让OpenSSL打印它派生的AES256密钥和IV:

 $ echo -n "TEST1" | openssl enc -aes256 -k FUUU -nosalt -a -p key=59C12FFF74992ED40F4DF80A56AB55AE7C513B17CB4B8CF8342E9444C7F7AF3B iv =0BEE68AD25123B7076B91A5AFB549E33 bYbkQJcDFZt3y3UQEMbEeg== 

AES256DecryptWithKey期望一个32字节的AES密钥,正如评论所说:

 - (NSData *)AES256DecryptWithKey:(NSString *)key { // 'key' should be 32 bytes for AES256, will be null-padded otherwise char keyPtr[kCCKeySizeAES256+1]; // room for terminator (unused) bzero(keyPtr, sizeof(keyPtr)); // fill with zeroes (for padding) 

但是,即使将密钥string从OpenSSL转换为一串字节(不是64个ASCII字符,32个字节),仍然无法解密并获取原始string。 这是因为OpenSSL正在使用IV,但AES256DecryptWithKey不是:

 CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt, kCCAlgorithmAES128, kCCOptionPKCS7Padding, keyPtr, kCCKeySizeAES256, NULL /* initialization vector (optional) */, [self bytes], dataLength, /* input */ buffer, bufferSize, /* output */ &numBytesDecrypted); 

(请参阅为NULL传递的NULL?这不适合你)

所以你需要使用一个encryption和解密方法,它们都使用相同的AES密钥和IV来工作。