2012-04-14 13 views
3

最近,我用CCCrypt來實現一些自定義的加密算法。但是,當我使用CCCryptorUpdate解密密文時,輸出始終比原始純文本少8個字節。以下是我的代碼:由CCCrypt解碼的明文長度有誤

+ (void) EncryptBy3DES:(NSInputStream*)strmSrc Output:(NSOutputStream*)strmDest CryptoRef:(CCCryptorRef)tdesCrypto 
{ 
    size_t dataOutMoved; 
    uint8_t inputBuf[BlockSize]; 
    uint8_t outputBuf[BlockSize]; 

    CCCryptorStatus cryptStatus; 
    int iBytesRead = 0; 

    while ((iBytesRead = [strmSrc read:inputBuf maxLength:BlockSize]) > 0) 
    { 
     NSLog(@"Bytes read from plain buffer: %d", iBytesRead); 
     [Util FillBuffer:inputBuf Length:BlockSize Current:iBytesRead]; 

     cryptStatus = CCCryptorUpdate(tdesCrypto, &inputBuf, BlockSize, &outputBuf, BlockSize, &dataOutMoved); 
     assert(dataOutMoved<=BlockSize && cryptStatus==noErr); 
     NSLog(@"EncDataOutMoved: %ld", dataOutMoved); 
     [Util FillBuffer:outputBuf Length:BlockSize Current:dataOutMoved]; 
     [strmDest write:outputBuf maxLength:BlockSize]; 
    } 
} 

+ (void) DecryptBy3DES:(NSInputStream*)strmSrc Output:(NSOutputStream*)strmDest CryptoRef:(CCCryptorRef)tdesCrypto 
{  
    size_t dataOutMoved; 
    uint8_t inputBuf[BlockSize]; 
    uint8_t outputBuf[BlockSize+kCCBlockSize3DES]; 

    CCCryptorStatus cryptStatus; 
    int iBytesRead = 0; 

    while ((iBytesRead = [strmSrc read:inputBuf maxLength:BlockSize]) > 0) 
    { 
     NSLog(@"Bytes read from cipher buffer: %d", iBytesRead); 
     cryptStatus = CCCryptorUpdate(tdesCrypto, &inputBuf, BlockSize, &outputBuf, BlockSize+kCCBlockSize3DES, &dataOutMoved); 
     NSLog(@"Lengh needed: %zu", CCCryptorGetOutputLength(tdesCrypto, BlockSize, YES)); 
     NSLog(@"DecDataOutMoved: %ld", dataOutMoved); 
     assert(dataOutMoved<=BlockSize && cryptStatus==noErr); 
     [strmDest write:outputBuf maxLength:dataOutMoved]; 
    } 
} 


I encrypted 3 buffer of 4096. When decrypting them, the log shows that the size of 1st decrypted data is 4088, BUT! The missing data is actually in the begining of the 2nd decrypted data. 

2012-04-14 15:17:41.929 otest[25168:7803] Bytes read from cipher buffer: 4096 
2012-04-14 15:17:41.929 otest[25168:7803] Lengh needed: 4104 
2012-04-14 15:17:41.930 otest[25168:7803] DecDataOutMoved: 4088 
end of 1st block:<..d71eaf27 affc4c8c b1c54afa c5434397 ebc17a49> 

2012-04-14 15:17:45.291 otest[25168:7803] Bytes read from cipher buffer: 4096 
2012-04-14 15:17:45.292 otest[25168:7803] Lengh needed: 4104 
2012-04-14 15:17:45.293 otest[25168:7803] DecDataOutMoved: 4096 
begining of 2nd block <**86b61bce b4342728** 88240a64 837327d4 0bb572a2 f5220928 

注意86b61bce b4342728是1塊加密之前結束。

我也檢查了第一塊的開始,我相信我沒有搞亂數據範圍。數據似乎被解密,但直到下一次操作纔會被檢索出來。

我想在每次加密/解密操作時獲得一個完整的塊,但我不想使用函數CCCrypt,因爲我必須將Key和Iv位傳遞給它。我只想將CCCryptorRef傳遞給它,這相對簡單。

休伯特

+0

如果您想使用'CCCryptorRef'或其他任何東西,那就好了,但是請指出您正在使用的密碼(密碼塊模式和填充),例如,通過展示你如何創建'CCCryptorRef'。這很有趣的猜測,但你可能會得到回報:) – 2012-05-08 21:12:21

回答

1

您需要通過調用CCCryptFinal完成加密和解密。這將負責添加/刪除填充。

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了!

+0

其實,關鍵是我重用了crypt引用,並沒有完成它。似乎我已經離開這個話題太久了。無論如何,謝謝你的回答:)對不起,浪費你的時間。 – 2013-09-04 06:51:40