美文网首页
ios 包含中文的异或加密

ios 包含中文的异或加密

作者: Mossion | 来源:发表于2019-01-04 20:34 被阅读17次

中文的异或加密有一个很诡异的现象,就是可能会secretKey的值不一样而导致异或后得到的数据为nil,所以在异或加密之前,我们需要将所要加密的字符串转义。代码如下

/**
 异或加密
 
 @param plainText 要加密的字符串
 @param secretKey 秘钥
 @return 加密后返回的字符传
 */
- (NSString *)stringXOREncryptWithPlainText:(NSString *)plainText secretKey:(NSString *)secretKey {
    
    NSData *codeKeyData =  [secretKey dataUsingEncoding:NSUTF8StringEncoding];
    Byte codeKeyByteAry[codeKeyData.length];
    for (int i = 0 ; i < codeKeyData.length; i++) {
        NSData *idata = [codeKeyData subdataWithRange:NSMakeRange(i, 1)];
        codeKeyByteAry[i] =((Byte*)[idata bytes])[0];
    }
    
    NSMutableData *returnData = [[NSMutableData alloc] init];
    
    NSString *charactersToEscape = @"?!@#$^&%*+,:;='\"`<>()[]{}/\\| ";
    NSCharacterSet *allowedCharacters = [[NSCharacterSet characterSetWithCharactersInString:charactersToEscape] invertedSet];
    // 对需要加密的数据进行转义
    plainText = [plainText stringByAddingPercentEncodingWithAllowedCharacters:allowedCharacters];
    NSData *strData =  [plainText dataUsingEncoding:NSUTF8StringEncoding];
    for (int i = 0 ; i < strData.length; i++) {
        NSData *idata = [strData subdataWithRange:NSMakeRange(i, 1)];
        Byte byte =((Byte*)[idata bytes])[0];
        Byte byte2 = codeKeyByteAry[i%codeKeyData.length];
        Byte returnbyte = byte^byte2;
        Byte returnbyteAry[1];
        returnbyteAry[0] = returnbyte;
        [returnData appendBytes:returnbyteAry length:1];
    }
    NSString *returnStr =  [[NSString alloc] initWithData:returnData encoding:NSUTF8StringEncoding];
    return returnStr;
}

当然,在解密的时候要移除转义

/**
 异或解密
 */
- (NSString *)stringXORDeocodeWithPlainText:(NSString *)plaintext secretKey:(NSString *)secretKey {
    
    NSData *codeKeyData =  [secretKey dataUsingEncoding:NSUTF8StringEncoding];
    Byte codeKeyByteAry[codeKeyData.length];
    for (int i = 0 ; i < codeKeyData.length; i++) {
        NSData *idata = [codeKeyData subdataWithRange:NSMakeRange(i, 1)];
        codeKeyByteAry[i] =((Byte*)[idata bytes])[0];
    }
    
    NSData *strData =  [plaintext dataUsingEncoding:NSUTF8StringEncoding];
    
    NSMutableData *returnData = [[NSMutableData alloc] init];
    for (int i = 0 ; i < strData.length; i++) {
        NSData *idata = [strData subdataWithRange:NSMakeRange(i, 1)];
        Byte byte =((Byte*)[idata bytes])[0];
        Byte byte2 = codeKeyByteAry[i%codeKeyData.length];
        Byte returnbyte = byte^byte2;
        Byte returnbyteAry[1];
        returnbyteAry[0] = returnbyte;
        [returnData appendBytes:returnbyteAry length:1];
    }
    NSString *returnStr =  [[NSString alloc] initWithData:returnData encoding:NSUTF8StringEncoding];
    // 要移除转义
    returnStr = [returnStr stringByRemovingPercentEncoding];
    return returnStr;
}

运行测试结果如下

    NSString *input = @"这里是中文异或";
    NSString *codeKey = @"secretkey";
    NSString *encodeString = [self stringXOREncryptWithPlainText:input secretKey:codeKey];
    NSString *decodeString = [self stringXORDeocodeWithPlainText:encodeString secretKey:codeKey];
    NSLog(@"加密前:%@",input);
    NSLog(@"加密后:%@",encodeString);
    NSLog(@"解密后:%@",decodeString);
1546605145262.jpg

OK!

相关文章

  • ios 包含中文的异或加密

    中文的异或加密有一个很诡异的现象,就是可能会secretKey的值不一样而导致异或后得到的数据为nil,所以在异或...

  • iOS-异或加密

    iOS-异或加密 原理 对待加密数据的每个二进制字节,做异或操作(就是把原来的0变成1,1变成0),从而达到加密的...

  • iOS 异或加密(XOR)

    原文链接源码见文末 异或简介 异或,二元运算; 符号^; 口诀:相同为0,不相同为1; 举例10011101^10...

  • iOS异或加密算法

    废话不多说,直接上代码

  • 汇编 进制练习

    加密:对一个数进行异或的结果再进行异或会得到最开始的数据。这就是加密的本质。秘钥是进行异或的数,原始数据是被异或的...

  • TS异或加密并输出Base64字符串

    在做游戏或应用的时候,一些本地数据为了安全需要加密。最简单的加密方式当然是异或加密了,但异或之后输出的是数据块,并...

  • 异或加密解密

    异或,英文为exclusive OR,或缩写成xor异或(xor)是一个数学运算符。它应用于逻辑运算。异或的数学符...

  • 简单异或加密

    Dont’ use XOR encryption only when you encrypt data. It’s...

  • android异或加密

    异或加密 参考文档:https://www.cnblogs.com/whoislcj/p/5944917.html...

  • 简单的异或加密

网友评论

      本文标题:ios 包含中文的异或加密

      本文链接:https://www.haomeiwen.com/subject/vwjdlqtx.html