DES加密中,遇到加密的文本中含有中文的情况:

image.png
记录一下这个问题
解密之后遇到这种情况
一般来说,DES加密的时候明文一般都是按照64位进行分组,密钥的长度是64位(8个字节)
在我加密的时候,长度是直接取的明文长度,一般来说是对的,每一个字符占一个字节
size_t dataLength = [plainText length];
但是当明文中有中文的时候,遍历打印
for (int i=0; i < plainText.length; i++) {
NSRange range = NSMakeRange(i, 1);
NSString *subStr = [plainText substringWithRange:range];
const char *c = [subStr UTF8String];
NSLog(@"%lu",strlen(c));
}
发现中文是三个字符

image.png
但是在加密之后呢,中文只被添加了一个字符,需要在遍历的时候在添加两个字符,注意是两个,不是三个,我在测试的时候就添加了三个,解密是成功了,但是还是有问题的。
完整代码:
+ (NSString *)encryptUseDES:(NSString *)plainText key:(NSString *)key{
NSString *ciphertext;
size_t dataLength = [plainText length];
for (int i=0; i < plainText.length; i++) {
NSRange range = NSMakeRange(i, 1);
int chinessCount = 0;
NSString *subStr = [plainText substringWithRange:range];
const char *c = [subStr UTF8String];
if (strlen(c) == 3) {
chinessCount ++;
}
dataLength = dataLength + chinessCount * 2;//不要算错了,是2,不是3.
}
void const *textBytes = [plainText UTF8String];
uint8_t *bufferPtr = NULL;
size_t bufferPtrSize = 0;
size_t movedBytes = 0;
bufferPtrSize = (dataLength + kCCBlockSizeDES) & ~(kCCBlockSizeDES - 1);
bufferPtr = malloc(bufferPtrSize * sizeof(uint8_t));
memset((void *)bufferPtr, 0x0, bufferPtrSize);
CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt,
kCCAlgorithmDES,
kCCOptionPKCS7Padding|kCCOptionECBMode,
[key UTF8String],
kCCKeySizeDES,
NULL,
textBytes,
dataLength,
(void *)bufferPtr,
bufferPtrSize,
&movedBytes);
if (cryptStatus == kCCSuccess) {
NSData *base64Data = [NSData dataWithBytes:(const void *)bufferPtr length:(NSUInteger)movedBytes];
NSData *data = [base64Data base64EncodedDataWithOptions:NSDataBase64EncodingEndLineWithCarriageReturn];
ciphertext = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
}
return ciphertext;
}