iOS5和iOS6之间的CCCrypt差异

时间:2012-09-26 07:03:25

标签: objective-c ios ios5 encryption ios6

我有一个使用CCCrypt()的解密/加密方法,它在iOS5上运行得非常好。现在我正在使用iOS6 SDK并且从未更改过我的代码,但似乎有些东西被破坏了。我仍然可以使用密钥对字符串进行加密并对其进行解密,但如果我使用其他密钥来解密相同的字符串,则从CCCryptStatus返回的CCCrypt()仍然是0(kCCSuccess) - 即使解密失败,因为之后我的NSData没有填充。在iOS5上,我收到了错误消息-4303,我可以处理。任何想法现在都可能出错?

我的代码:

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!
}

编辑: 在iPad模拟器5上测试它。当我用另一个键进行解密时,我收到的状态是-4303。仅在ios6中,返回的状态为0。

2 个答案:

答案 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;
}

答案 1 :(得分:0)

有一个苹果developer forum thread正在讨论这个问题,它有关于该主题的大量信息。对于许多人来说,填充选项似乎是一个问题。评论#11是解决方案开始讨论的地方。