2012-07-09 94 views
0

我想使用CCCrypt加密我的数据,但一些不对的地方,我后加密的数据长度的改变,而解密并没有发生,这里是下面的代码。数据尺寸改变由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; 
} 

和这里为i打印数据长度出日志:

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

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

回答

1

护垫当您使用的是分组密码,使纯文本嵌入密码块被应用。 AES是分组密码,使用128位,16字节的块大小。尝试在CCOptions中使用显式填充和CBC模式,请参阅CCCrypt的Apple文档,了解如何做到这一点(虽然我的生活中再次见到了更好的密码方法描述)。

注意:尝试kCCOptionPKCS7Padding,CBC可能是默认设置。

+0

我试图KccOptionPKCS7Padding数据大小日志 之前加密数据长度是248 文件加密的数据长度为256 解密的数据长度之后是246 数据大小是正确的,但我无法打开文件解密后 – 2012-07-12 05:08:31

+0

再次尝试,它现在工作,thx你很多! – 2012-09-14 05:19:13

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); 
..... 
} 

然后一切就OK了!