2012-07-09 82 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了!