在CCCrypt进行AES加密后,DataSize发生了变化

时间:2012-07-09 10:41:14

标签: ios encryption

我正在尝试使用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文件加密后dataLength为27536
2012-07-09 18:29:20.800加密之前dataLength是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

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

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分: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);
.....
}

然后一切都好!