CCCrypt加密结果问题

问题描述 投票:0回答:3

我使用 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 方法中传递什么作为第三个参数?

objective-c encryption aes encryption-symmetric
3个回答
1
投票

解决您在上一个答案中评论的问题,

initWithData:encoding:
函数将返回
nil
,因为加密数据不太可能与
NSUTF8StringEncoding
匹配,因为它是加密的。

同样的问题和彻底的答案:为什么我的 initWithData 在将 NSData 转换为通过 CommonCrypto 加密返回的 NSString 后返回 nil 指示错误? 顺便说一句,base64 不会使您的加密数据成为可见字符串,而是进一步改变它制作可显示的 ASCII 字符串。 该字符串不应被假定为与加密数据相同,也不应与加密数据相同,但作为字符串使用(例如在钥匙串中),它可以正常工作。


0
投票

要在解密后获得准确的字符串,您必须进行 Base64 解码

Decrypted Data
,然后使用 NSUTF8StringEncoding 创建 NSString。

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

    NSData *data = [NSData dataByBase64DecodingString:decryptedString];

    decryptedString = [data dataUsingEncoding:NSUTF8StrinEncoding];

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

有关 Base64 解码,请参阅this 帖子。


0
投票

问题不在于解密,而在于解密的结果 NSData。它很可能包含非 UTF 格式的数据,这导致数据到 NNString 的转换失败。 Objective C 仍然更能容忍处理不完美的 UTF 数据字节,swift 每次都会因为选项而失败。

© www.soinside.com 2019 - 2024. All rights reserved.