在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来工作。