NDY*_*NDY 13 encryption objective-c ios ios5 ios6
我有一个解密/加密方法使用CCCrypt(),在iOS5上运行得非常好.现在我正在使用iOS6 SDK并且从未更改过我的代码,但似乎有些东西被破坏了.我仍然可以使用密钥对字符串进行加密并对其进行解密,但是如果我使用另一个密钥来解密相同的字符串,则即使在解密失败时,仍然CCCryptStatus会返回- 因为之后我的NSData未被填充.在iOS5上,我收到了错误消息-4303,我可以处理.任何想法现在可能出错了吗?CCCrypt()0(kCCSuccess)
我的代码:
char keyPtr[kCCKeySizeAES256+1];
bzero(keyPtr, sizeof(keyPtr)); // fill with zeroes (for padding)
// fetch key data
[key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];
if (encryptOrDecrypt == kCCDecrypt)
{
data = [GTMBase64 decodeData:data];
}
NSUInteger dataLength = [data length];
size_t bufferSize = dataLength + kCCBlockSizeAES128;
void *buffer = malloc(bufferSize);
size_t numBytesDecrypted = 0;
CCCryptorStatus cryptStatus = CCCrypt(encryptOrDecrypt,
kCCAlgorithmAES128,
kCCOptionPKCS7Padding,
keyPtr,
kCCKeySizeAES256,
NULL ,
[data bytes], dataLength,
buffer, bufferSize,
&numBytesDecrypted);
if (cryptStatus != kCCSuccess){
// do something, but cryptStatus is always 0!
}
Run Code Online (Sandbox Code Playgroud)
编辑:在iPad模拟器5上测试它.当我用另一个键进行解密时,我收到的状态是-4303.仅在ios6中,返回的状态为0.
小智 3
我不是加密专家,但我有同样的问题,并想出了一个解决方法,也许在有人找到真正的解决方案之前会很好。
我所做的就是确定哪个 iOS 正在运行,对于 6+,我将 CCCrypt 调用更改为无填充(0 表示无填充,1 是 kCCOptionPKCS7Padding 的枚举)
float version = [[UIDevice currentDevice].systemVersion floatValue];
if (version >= 6)
{
CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt, kCCAlgorithmAES128, 0,
keyPtr, kCCKeySizeAES128,
ivPtr,
[self bytes], dataLength,
buffer, bufferSize,
&numBytesDecrypted );
if( cryptStatus == kCCSuccess )
{
return [NSData dataWithBytesNoCopy:buffer length:numBytesDecrypted];
}
free( buffer );
return nil;
}
else
{
CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt, kCCAlgorithmAES128, 1,
keyPtr, kCCKeySizeAES128,
ivPtr,
[self bytes], dataLength,
buffer, bufferSize,
&numBytesDecrypted );
if( cryptStatus == kCCSuccess )
{
return [NSData dataWithBytesNoCopy:buffer length:numBytesDecrypted];
}
free( buffer );
return nil;
}
Run Code Online (Sandbox Code Playgroud)