在开发过程中,使用DES来进行加密和解密,服务器端使用java的javax.crypto.Cipher包来进行加密解密,客户端使用mac自带的<CommonCrypto/CommomCryptor.h>中的ccrypt()函数。
ios端解密代码如下:
+(NSString*) decryptUseDES:(NSString*)cipherText key:(NSString*)key {
NSData* cipherData = [cipherText hexToBytes];
size_t bufferPtrSize = 0;
bufferPtrSize=([cipherText length]+kCCBlockSize3DES)& ~(kCCBlockSize3DES-1);
uint8_t *buffer=NULL;
buffer=malloc(bufferPtrSize*sizeof(uint8_t));
memset((void*)buffer, 0, bufferPtrSize);
size_t numBytesDecrypted = 0;
CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt,
kCCAlgorithmDES,
kCCOptionECBMode,
[key UTF8String],
kCCKeySizeDES,
nil,
[cipherData bytes],
[cipherData length],
(void*)buffer,
bufferPtrSize,
&numBytesDecrypted);
NSString* plainText = nil;
if (cryptStatus == kCCSuccess) {
NSData* data = [NSData dataWithBytes:buffer length:(NSUInteger)numBytesDecrypted];
plainText = [[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding] autorelease];
}
return plainText;
}
在ios端的解密结果,总是会在后面多几个奇怪的字符,查找了半天,最后发现是由于DES的ECB模式是通过8字节的块来进行解密的,当输入的字符串被分割的最后一个块不是8字节时,cryptor不知道如何处理这个非8字节的块。
将
kCCOptionECBMode改为
kCCOptionPKCS7Padding | kCCOptionECBMode,问题得到解决~~