CCCrypt Decoded Plain Text Wrong Length

Recently, I have been using CCCrypt to implement some self-critical algorithm. However, when I use CCCryptorUpdate to decrypt the encryption text, the output is always 8 bytes less than the original plain text. Below are my codes:

+ (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

Please note that 86b61bce b4342728 was at the end of the 1st block before encryption.

I also checked the start of the first block, and I'm sure I haven't messed up the data range. The data seems to be decrypted, but it is not retrieved until the next operation.

/, CCCrypt, Key Iv. CCCryptorRef, .

Hubert

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

!

+1

All Articles