这是我之前问题的追踪: 如何从OpenSSL加密数据中获取初始化向量(IV)
我正在使用OpenSSL
命令行实用程序加密字符串,然后尝试在iPhone上使用<CommonCrypto/CommonCryptor.h>
解密字符串。使用Dropbox SDK,一个带有加密字符串的xml文件被加载到iPhone上,我的应用程序试图解析并解密此文件中的字符串。
这是OpenSSL命令的示例:
printf %s "Hello" | openssl enc -aes-128-cbc -K 00ff349830193845af43984758690213 -iv 0 -base64
上述的base64字符串被放置在一个XML文件中,然后由应用程序解析。
我正在使用Matt Gallagher的NSData这个扩展来解码base64文本。我假设它能正常工作;我目前还没有找到一个好的测试方法。(来源:http://cocoawithlove.com/2009/06/base64-encoding-options-on-mac-and.html)。
以下是解密加密字符串的方法。
在这种情况下,密钥是一个NSString,等于
@"00ff349830193845af43984758690213"
。+ (NSString *)string:(NSString *)encryptedString withAES128Key:(NSString *)key {
// decode base64, from Matt Gallagher's NSData category
NSData *b64DecodedData = [NSData dataFromBase64String:encryptedString];
NSData *keyData = [key dataUsingEncoding:NSUTF8StringEncoding];
// fyi, I plan to replace this later with a random iv
NSData *ivData = [@"00000000000000000000000000000000" dataUsingEncoding:NSUTF8StringEncoding];
// decrypt the string
NSData *decodedData = [self doCipher:b64DecodedData iv:ivData key:keyData context:kCCDecrypt];
NSString *unencryptedString = [[NSString alloc] initWithBytes:[decodedData bytes] length:[decodedData length] encoding:NSUTF8StringEncoding];
return [unencryptedString autorelease];
}
以下是实际解密的方法:(此方法的信用归功于另一个stackoverflow用户。)
+ (NSData *)doCipher:(NSData *)dataIn
iv:(NSData *)iv
key:(NSData *)symmetricKey
context:(CCOperation)encryptOrDecrypt
{
CCCryptorStatus ccStatus = kCCSuccess;
size_t cryptBytes = 0; // Number of bytes moved to buffer.
NSMutableData *dataOut = [NSMutableData dataWithLength:dataIn.length + kCCBlockSizeAES128];
ccStatus = CCCrypt( encryptOrDecrypt,
kCCAlgorithmAES128,
kCCOptionPKCS7Padding,
[symmetricKey bytes],
kCCKeySizeAES128,
iv,
dataIn.bytes,
dataIn.length,
dataOut.mutableBytes,
dataOut.length,
&cryptBytes);
// error occurs here, error -4304 kCCDecodeError
if (ccStatus != kCCSuccess) {
// Handle error
NSLog(@"CCCrypt status: %d", ccStatus);
}
dataOut.length = cryptBytes;
return dataOut;
}
发生了一个错误,错误代码为
-4304
,即kCCDecodeError
,因为ccStatus
不等于kCCSuccess
。我感觉密钥和iv没有被正确地设置为NSData对象。 OpenSSL要求密钥和iv是十六进制值,我已经这样做,并仔细将它们设置为恰好128位。 但是,我认为在将这些字符串转换为
doCipher
方法的NSData时漏掉了某些东西。非常感谢任何帮助! 我一整天都在尝试解决这个问题。