Objective-C rc4+Base64加解密

最近公司新项目决定换一种数据加密方式,之前用的是des+Base64,现在决定用rc4+Base64,在网上找了不少用c写的rc4 不过一直和服务端对不上,这里有个小坑,一会再说。

方法一

文件有点大,里面有写用不到和重复的自己删除下吧,有些人可能用的到,需要的文件  密码:pome

1.首先,把文件里的openssl库,拖到项目里

2.在项目中导入lib-ios里的两个库:libcrypto.a和libssl.a,打开工程,Build Setting ->Header Search Paths 添加字段$(SRCROOT)/OpenSSL-master/include-ios (这里根据具体路径来),Library Search Paths 添加字段$(PROJECT_DIR)/工程名/文件夹名字(这里根据具体路径来)

3.从下载文件里找到zhyrc4.c、zhyrc4.h、base64.c、base64.h,拖进项目里。


4.使用:导入头文件#include "zhyrc4.h",


接下来编译不报错的话就可以了


接下来你可以建立一个工具类



+ (NSString *)encode:(NSString *)data key:(NSString *)key {


const char *pwd = [key UTF8String];


const char * cData = [data UTF8String];


char *base64_data = NULL;


zhyencode(pwd, cData, strlen(cData), &base64_data);


NSString * str = [NSString stringWithUTF8String:base64_data];


if (base64_data) {


free(base64_data);


base64_data = NULL;


}


return str;


}


+ (NSString *)decode:(NSString *)data key:(NSString *)key {


const char *pwd = [key UTF8String];


const char * cData = [data UTF8String];


char *data1=NULL;


zhydecode(pwd, cData, &data1);


NSString * str = [NSString stringWithUTF8String:data1];


if (data1) {


free(data1);


data1 = NULL;


}


return str;


}


外部调用就可以了,只要路径写的没问题

这里进行了一次base64加密,如果不需要base64加密,在zhyrc4.c、zhyrc4.h改改就行了,因为代码很少,直接发demo的话可能忘了写路径,

这就没什么东西了,说说为什么之前和服务器那边对不上,因为这次项目接口是PHP写的,他那边的加密秘钥如果不满256位的话会用null填充

但是我这边的c却不是这样,所以导致加密后我们两个对不上,最后他把填充那一步去掉了,应该也没问题,至少现在没有,或者把c改了,不过我们试过,我想应该是没问题的

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

方法二

这种方法就简单了,公司c++大神写的 短小精悍,项目一直再用链接: 文件下载地址 密码: qf5v   ,文件两个c文件,分别是rc4加密和base64加密,EncodeControl这是一个我用OC封装的一个工具类,

+ (NSString *)encode:(NSString *)data key:(NSString *)key;

+ (NSString *)decode:(NSString *)data key:(NSString *)key;

上面分别为加密、解密数据,key是秘钥,data是要加密的字符串,json的话当然是要转成json字符串进行加密

+(NSString *)encodeData:(NSDictionary *)data;

+(NSDictionary *)convertDataToDic:(NSString *)data;

这个是我自己用的了,秘钥外部定死,更换也方便,分别是加密、解密,加密是把把字典加密成加密串,解密是把加密串解密成字典,各位看官按照具体需要再改吧,都是很简单,就不太细说了

希望能帮到各位,有问题请留言。

推荐阅读更多精彩内容