0

我正在尝试使用 CCCrypt 加密我的数据,但它有问题,我加密后数据长度发生了变化,但解密时没有发生,这是以下代码。

- (NSData *)AES256EncryptWithKeyGenerateIV:(NSString *)key {
    char keyPtr[kCCKeySizeAES128+1];
    bzero(keyPtr, sizeof(keyPtr));

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

    char ivPtr[kCCKeySizeAES128+1];

    unsigned char result[CC_MD5_DIGEST_LENGTH];
    CC_MD5([key UTF8String], strlen([key UTF8String]), result);

    NSString* resultString = [NSString stringWithFormat:
                              @"%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x",
                          result[0], result[1], result[2], result[3],
                          result[4], result[5], result[6], result[7],
                          result[8], result[9], result[10], result[11],
                          result[12], result[13], result[14], result[15]
                          ];
    resultString = [resultString substringToIndex:16];

    bzero(ivPtr, sizeof(ivPtr));
    [resultString getCString:ivPtr maxLength:sizeof(ivPtr)     encoding:NSUTF8StringEncoding];
    NSUInteger dataLength = [self length];

    NSLog(@"Before encrypt dataLength is %d",dataLength);

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

    size_t numBytesDecrypted = 0;
    CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt, kCCAlgorithmAES128,
                                      0,
                                      keyPtr, kCCBlockSizeAES128,
                                      ivPtr,
                                      [self bytes], dataLength,
                                      buffer, bufferSize,
                                      &numBytesDecrypted);

    NSLog(@"After file encrypted dataLength is %d",numBytesDecrypted);
    if (cryptStatus == kCCSuccess) {
        return [NSData dataWithBytesNoCopy:buffer length:numBytesDecrypted];
    }

    free(buffer);
    return nil;
}

这是我打印数据长度的日志:

2012-07-09 18:29:20.787 加密前 dataLength 为 248
2012-07-09 18:29:20.788 文件加密后 dataLength 为 240
2012-07-09 18:29:20.789 加密前 dataLength 为 20
2012-07- 09 18:29:20.790 文件加密后 dataLength 为 16
2012-07-09 18:29:20.792 加密前 dataLength 为 583
2012-07-09 18:29:20.792 文件加密后 dataLength 为 576
2012-07-09 18: 29:20.795 加密前 dataLength 为 31120
2012-07-09 18:29:20.796 文件加密后 dataLength 为 31120
2012-07-09 18:29:20.797 加密前 dataLength 为 27551
2012-07-09 18:29:20.798 后文件加密数据长度为 27536
2012-07-09 18:29:20.800 加密前数据长度为 1266
2012-07-09 18:29:20.800 文件加密后 dataLength 为 1264
2012-07-09 18:29:20.802 加密前 dataLength 为 431315
2012-07-09 18:29:20.809 文件加密后 dataLength 为 431312
2012-07 -09 18:29:20.815 加密前 dataLength 为 204
2012-07-09 18:29:20.815 文件加密后 dataLength 为 192
2012-07-09 18:29:20.817 加密前 dataLength 为 1083
2012-07-09 18: 29:20.817 文件加密后 dataLength 为 1072
2012-07-09 18:29:20.818 加密前 dataLength 为 440
2012-07-09 18:29:20.819 文件加密后 dataLength 为 432

有人可以告诉我为什么吗?

4

2 回答 2

1

使用分组密码时必须应用填充,以使纯文本适合密码块。AES 是一种分组密码,使用 128 位、16 字节的分组大小。尝试在 CCOptions 中使用显式填充和 CBC 模式,请参阅 CCCrypt 的 Apple 文档如何做到这一点(尽管我再次看到了对加密方法的更好描述)。

[编辑] 注意:尝试kCCOptionPKCS7Padding,CBC 可能是默认值。

于 2012-07-09T11:10:28.657 回答
1

我使用 CCCrypt 函数对某些东西进行 DES 加密。当要加密的数据长度不是 8 字节的倍数时,就会发生错误大小。

所以我处理如下:

- (NSString *) encryptUseDES:(NSString *)plainText key:(NSString *)key
{
    NSString *ciphertext = nil;
    const char *textBytes = [plainText UTF8String];
    NSUInteger dataLength = [plainText length];
    NSUInteger len1=dataLength % 8;

    if(len1!=0)
    {
        dataLength+=(8-len1);
    }    
    unsigned char buffer[1024];
    memset(buffer, 0, sizeof(char));
    size_t numBytesEncrypted = 0;

    Byte iv[] = {0x02, 0x00, 0x01, 0x02, 0x00, 0x06, 0x00, 0x05};

    CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt, kCCAlgorithmDES,
                                          NULL,
                                          [key UTF8String], kCCKeySizeDES,
                                          iv,
                                          textBytes, dataLength,
                                          buffer, 1024,
                                          &numBytesEncrypted);
.....
}

然后一切正常!

于 2013-08-09T06:48:03.823 回答