异或加密算法之后nsstring成nil

   最近在做异或加密,原有的key一直用的好好的,可是换了key之后突然就不能用了,加密之后的nsstring是nil,这可怎么办?

   以前都好好的,怎么突然就不行了呢?

   试了好多个key都不行,只有原来的那个key无论中文英文加密都没有问题。

   经过多次测试,我总结出一个规律,无论key是什么,只要加密的字符串中不含有中文,就没有问题,一旦有中文,那么十个有九个key转换成nsstring之后都会变成nil.

   在网上搜索了相关的内容,看了许多帖子之后才知道,原来异或加密之后的数据不能用Nsstring作为临时存储类型,否则会出现乱码甚至是nil,因为nsstring会改变原有的编码格式,如果将data转换成nsstring时用utf8编码的话,若是data中存在utf8不识别的非法字符,那么转换之后的nsstring就会变成nil,那么数据就丢失了,这肯定不是我们想要结果,对不对?

   所以,最终加密之后返回的数据类型就只能是nsdata了,保证不改变原有的编码格式,下面是算法:

/** 异或算法 */

+ (NSData *)p_obfuscate:(NSData *)data withKey:(NSString *)keyString

{

    int keyLen = (int)[keyString length];


    Byte *key = (Byte *)[[keyString dataUsingEncoding:NSUTF8StringEncoding] bytes];

    Byte *encryp =(Byte *)[data bytes];

    int i= 0,j=0;

    

    while (j != [data length])

    {

        

        for ( i = 0; i <=(keyLen-1) ; i++){

            encryp[j] = encryp[j] ^ key[i];

        }

        j++;

        

    }


    NSData *da =[NSData dataWithBytes:encryp length:[data length]];


    return da;

}

   但是我们跟服务器交互的时候不能传data过去啊,服务器根本不识别!

   这可难倒我了。

   服务器那边的大哥说要是能把中文转换成unicode或者其他基础的类型再加密,后者加密之后再转换成基础类型,再转nsstring就好了。

   真是一语惊醒梦中人呀!

   在网上找了许久没找到字符串转unicopde的方法,倒是有不少unicode转成nsstring的帖子,只好跟服务器的大哥协商好,我在加密之后的数据上包一层base64,他接到之后再解base64,这样编码格式就不会被修改了,实验证明方法可行,以下是加密解密方法:

/** 加密 */

+ (NSString *)p_stringEncrypt:(NSString *)string :(long)APPID :(NSString *)APPKEY{    

    NSData *data = [string dataUsingEncoding:NSUTF8StringEncoding];

    NSData *s =[self p_obfuscate:data withKey:APPKEY];

    //加密之后包一层base64保证编码格式不变

    NSString *str = [s base64EncodedStringWithOptions:NSDataBase64EncodingEndLineWithLineFeed];

    NSLog(@"%@",str);


    return str;

}

+ (NSString *)d_stringEncrypt:(NSString *)string :(long)APPID :(NSString *)APPKEY{

    

    //base64

    NSData *data =  [[NSData alloc] initWithBase64EncodedString:string options:0];

    NSData *s1 =[self p_obfuscate:data withKey:APPKEY];

 

    //解密后是个json

    NSString *s = [[NSString alloc] initWithData:s1 encoding:NSUTF8StringEncoding];

    return s;

}

   与此同时,我又请教了另一位ios的同事,他一开始也说用base64可以解决问题,但问题是这样就增加了数据长度,经过研究,他第二天给了我一份nsstring和unicode互转的方法,贴出来大家参考使用:

#import "NSString+KFUnicode.h"



@implementation NSString (KFUnicode)

-(NSString *)stringFromUTF8ToUnicode{

    NSMutableString *mString = [NSMutableString stringWithCapacity:0];

    int i;

    do {

        unichar _char = [self characterAtIndex:i];

        if ((_char <= '9' && _char >='0')||

            (_char >='a' && _char <= 'z')||

            (_char >='A' && _char <= 'Z')){

            [mString appendString:[self substringWithRange:NSMakeRange(i,1)]];

            i++;

            continue;

        }

        [mString appendFormat:@"\\u%x",[self characterAtIndex:i]];

        i++;

    } while (i<self.length);

    return mString;

}

-(NSString *)stringFromUnicodeToUTF8{

    NSString *mString = [self stringByReplacingOccurrencesOfString:@"\\u"withString:@"\\U"];

    mString = [mString stringByReplacingOccurrencesOfString:@"\""withString:@"\\\""];

    mString = [[@"\""stringByAppendingString:mString] stringByAppendingString:@"\""];

    NSData *mData = [mString dataUsingEncoding:NSUTF8StringEncoding];

    NSString *returnStr = [NSPropertyListSerialization propertyListWithData:mData

                                                                    options:NSPropertyListImmutable

                                                                     format:nil

                                                                      error:nil];

    return [returnStr stringByReplacingOccurrencesOfString:@"\\r\\n"withString:@"\n"];

}

@end






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值