【发布时间】:2013-12-10 01:20:37
【问题描述】:
我的应用程序中有一些加密和解密类方法。我可以使用“密钥”加密“数据”,效果很好。我可以将该数据写入磁盘,然后稍后使用应用程序读取数据并调用 decryptWithKey 来解密数据块。一切都很好。但是,如果我将此 .m 类文件包含到另一个应用程序中,编译该应用程序并尝试解密使用第一个应用程序加密的相同数据,CCCrypt(decrypt) 调用失败......嗯,不完全是,它返回 Success但数据未解密。我已经比较了两个应用程序中的数据和键值,它们是相同的,精确到字节。
有什么想法吗?
+(BOOL)encryptWithKey:(NSMutableData*)data withKey:(NSString *)key
{
CCCryptorStatus result = kCCSuccess;
@try
{
char keyPtr1[kCCKeySizeAES256+1]; // room for terminator (unused)
bzero( keyPtr1, sizeof(keyPtr1) ); // fill with zeroes (for padding)
[key getCString: keyPtr1 maxLength: sizeof(keyPtr1) encoding: NSUTF8StringEncoding];
size_t numBytesEncrypted = 0;
size_t dataInLength = [data length];
size_t dataOutLength = 18*dataInLength;
[data setLength:dataOutLength];
result = CCCrypt( kCCEncrypt,kCCAlgorithmAES128,kCCOptionPKCS7Padding,
(const void*)keyPtr1, kCCKeySizeAES256, 0 /* initialization vector (optional) */,
[data mutableBytes], dataInLength, /* input */
[data mutableBytes], dataOutLength, /* output */
&numBytesEncrypted );
[data setLength:numBytesEncrypted];
}
@catch (NSException *exception)
{
WDCATCH(exception);
}
return ( result == kCCSuccess );
}
+(BOOL)decryptWithKey:(NSMutableData*)data plaintext:(NSString**)plaintext withKey:(NSString *)key
{
CCCryptorStatus result = kCCSuccess;
@try
{
// 'key' should be 32 bytes for AES256, will be null-padded otherwise
char keyPtr[kCCKeySizeAES256+1]; // room for terminator (unused)
char szPlaintext[1024]={0};
bzero( keyPtr, sizeof(keyPtr) ); // fill with zeroes (for padding)
[key getCString: keyPtr maxLength: sizeof(keyPtr) encoding: NSUTF8StringEncoding];
size_t numBytesEncrypted = 0;
result = CCCrypt( kCCDecrypt, kCCAlgorithmAES128, kCCOptionPKCS7Padding,
(const void*)keyPtr, kCCKeySizeAES256,
0 /* initialization vector (optional) */,
[data mutableBytes], [data length], /* input */
szPlaintext,1024,// [data mutableBytes], dataOutLength, /* output */
&numBytesEncrypted );
if (result == kCCSuccess)
{
szPlaintext[numBytesEncrypted] = 0;
*plaintext = [[NSString alloc] initWithFormat:@"%s",szPlaintext];
}
}
@catch (NSException *exception)
{
WDCATCH(exception);
} return ( result == kCCSuccess );
}
【问题讨论】:
-
请注意,上面的代码非常不安全(详见robnapier.net/blog/aes-commoncrypto-564)。
18*dataInLength也很奇怪。最多需要dataInLength+16,但这仍然可以解决(它太大了)。奇怪的是,您加密原始数据,然后期望解密 ASCII(甚至不是 UTF-8)字符串。当你说解密失败时,是numBytesEncrypted大于0吗?也许 %s ASCII 转换失败(尽管你应该得到垃圾)。当您说“不解密”时,实际症状是什么? -
CCCrypt(kCCDecrypt)执行后,numBytesEncrypted(应该改名为numBytesDecrypted)为0,szPlainText为空,结果为=0/kCCSuccess。
-
我做了更多的探索,看起来它可能与应用程序“A”有关,加密应用程序针对 OSX 10.7 部署/baseSDK 和应用程序 B,解密应用程序,针对 OSX 10.9 部署/baseSDK; @RobNapier,这会导致问题吗?
标签: objective-c encryption cryptography