CCCrypt加密结果问题

时间:2012-04-05 15:04:52

标签: objective-c encryption aes encryption-symmetric

我使用CCCrypt加密/解密字符串值。它似乎工作正常,因为解密值等于初始值,但问题是我无法从解密数据中提取适当的NSString对象。

@implementation NSData (AES256) 

- (NSData *)AES256EncryptWithKey:(NSString *)key 
{
    char keyPtr[kCCKeySizeAES256+1]; // room for terminator (unused)
    bzero(keyPtr, sizeof(keyPtr)); // fill with zeroes (for padding)

    // fetch key data
    [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];

    NSUInteger dataLength = [self length];

    size_t bufferSize = dataLength + kCCBlockSizeAES128;
    void *buffer = malloc(bufferSize);

    size_t numBytesEncrypted = 0;
    CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt, kCCAlgorithmAES128, kCCOptionPKCS7Padding,
                                        keyPtr, kCCKeySizeAES256,
                                        NULL /* initialization vector (optional) */,
                                        [self bytes], dataLength, /* input */
                                        buffer, bufferSize, /* output */
                                        &numBytesEncrypted);
    if (cryptStatus == kCCSuccess) { 
        return [NSData dataWithBytesNoCopy:buffer length:numBytesEncrypted];
    }

    free(buffer); //free the buffer;
    return nil;
}

- (NSData *)AES256DecryptWithKey:(NSString *)key {
    char keyPtr[kCCKeySizeAES256+1]; // room for terminator (unused)
    bzero(keyPtr, sizeof(keyPtr)); // fill with zeroes (for padding)

    // fetch key data
    [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];

    NSUInteger dataLength = [self length];

    size_t bufferSize = dataLength + kCCBlockSizeAES128;
    void *buffer = malloc(bufferSize);

    size_t numBytesDecrypted = 0;
    CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt, kCCAlgorithmAES128, kCCOptionPKCS7Padding,
                                        keyPtr, kCCKeySizeAES256,
                                        NULL /* initialization vector (optional) */,
                                        [self bytes], dataLength, /* input */
                                        buffer, bufferSize, /* output */
                                        &numBytesDecrypted);

    if (cryptStatus == kCCSuccess) {
        //the returned NSData takes ownership of the buffer and will free it on deallocation
        return [NSData dataWithBytesNoCopy:buffer length:numBytesDecrypted];
    }

    free(buffer); //free the buffer;
    return nil;
}

我无法得到错误的内容,所以如果有人可以提供帮助,我会非常感激。

问题的第二部分 - 如何为AES加密方法设置CBC模式。它在文档中说默认使用这种模式,但我应该把它作为CCCrypt方法中的第三个参数传递给我?

2 个答案:

答案 0 :(得分:1)

解决您在上一个答案中评论的问题,initWithData:encoding:函数将返回nil,因为加密数据不太可能与NSUTF8StringEncoding匹配,因为它是{{1}}加密。

相同的问题及彻底的答案:Why does my initWithData return nil indicating an error after converting NSData to NSString returning from encrypting via CommonCrypto?但是,作为旁白,base64不会使您的加密数据成为可见字符串,而是进一步改变它以生成可显示的ASCII字符串。不应假设此字符串与加密数据相同,也不应与加密数据相同,但是作为字符串使用,例如在钥匙串中,它可以正常工作。

答案 1 :(得分:0)

要在解密后获得确切的字符串,必须使用base64解码Decrypted Data,然后使用NSUTF8StringEncoding创建NSString。

    NSString decryptedString = [[NSString alloc]initWithData:decryptedData];

    NSData *data = [NSData dataByBase64DecodingString:decryptedString];

    decryptedString = [data dataUsingEncoding:NSUTF8StrinEncoding];

decryptedString在加密前保持字符串相同。

对于base64解码,请参阅this post。