加密算法之后nsstring成nil"/>
异或加密算法之后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
更多推荐
异或加密算法之后nsstring成nil
发布评论