ios 包含中文的异或加密

中文的异或加密有一个很诡异的现象,就是可能会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!

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,174评论 1 32
  • 之前的项目中接触过一些加密的方法,也没有太仔细的进行记录和研究。最近在写SDK时,加密模块的占比相当之大;借此时机...
    过半_e764阅读 645评论 0 0
  • 引言 如今手机app五彩缤纷,确保手机用户的数据安全是开发人员必须掌握的技巧,下面通过实例介绍DES在androi...
    freesan44阅读 1,187评论 1 1
  • /**ios常见的几种加密方法: 普通的加密方法是讲密码进行加密后保存到用户偏好设置( [NSUserDefaul...
    彬至睢阳阅读 3,077评论 0 7
  • 概述 之前一直对加密相关的算法知之甚少,只知道类似DES、RSA等加密算法能对数据传输进行加密,且各种加密算法各有...
    Henryzhu阅读 3,081评论 0 14