objective-c - CCCrypt iOS5 和 iOS6 的区别

标签 objective-c ios ios5 encryption ios6

我有一个使用 CCCrypt() 的解密/加密方法,它在 iOS5 上运行得非常好。现在我正在使用 iOS6 SDK 并且从未更改过我的代码,但似乎有什么地方坏了。我仍然可以用一个 key 加密一个字符串并解密它,但是如果我使用另一个 key 来解密同一个字符串,从 CCCrypt() 返回的 CCCryptStatus 仍然是 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 上对其进行了测试。当我使用另一个 key 进行解密时,我收到的状态是 -4303。只有在 ios6 中返回的状态是 0。

最佳答案

我不是加密方面的专家,但我遇到了同样的问题,并想出了一个解决方法,在有人找到真正的解决方案之前可能会很好。

我所做的就是确定哪个 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;
}

关于objective-c - CCCrypt iOS5 和 iOS6 的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12596280/

相关文章:

objective-c - 有没有一种简单的方法可以将 ISO8601 时间戳转换为格式化的 NSDate?

android - 如何从非 react 类发送 react 应用程序上下文?

ios - 有没有办法在没有按钮的情况下在 iOS 中创建类似 UIButton 的框架?

iphone - 收到的远程通知没有出现在通知中心,但出现了应用程序图标上的角标(Badge)编号

IOS - 圆角临时警报 - 如何实现?

ios - 自动布局 UILabel 高度在第二个 View 外观上发生变化

iphone - 从 UITableView 创建 UIImage

ios - swift:加载包含 300 张图像的数组

ios - App Store 发表评论/评价 iOS 8 Swift

带有 Storyboard 的 iOS 应用程序因 *'NSInternalInconsistencyException' 崩溃,原因 : 'The NIB data is invalid.'