iOS 关于DES加密文本中有中文的问题

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;
}

你可能感兴趣的:(iOS 关于DES加密文本中有中文的问题)