Reputation: 502
Recently, I am using CCCrypt to implement some self defined crypto algorithm. However, when i use CCCryptorUpdate to decrypt cipher text, the output is always 8 bytes less than origin plain text. Following is 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
Note that 86b61bce b4342728 was in the end of 1st block before encryption.
I also checked the begining of the 1st block, and I am sure that I did not mess up with the range of data. It seems that the data are decrypted, but they are not retrieved until the next operation.
I want to get a full block at each encrypt/decrypt operation, but I don't want to use function CCCrypt since I have to pass both Key and Iv bits to it. I just want to pass CCCryptorRef to it, which is relatively simple.
Hubert
Upvotes: 3
Views: 1019
Reputation: 149
I use CCCrypt function to DES encrypting something. When length of data to be encrypted is not multiple of 8 Byte, error size took place.
So I handle this as following:
- (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);
.....
}
Then everything ok!
Upvotes: 1
Reputation: 49687
You need to finish the encryption and decryption by calling CCCryptFinal
. This will take care of adding/removing padding.
Upvotes: 1