最近公司做的是关于银行的项目,需要用到加密,RSA需要,但是老大怕以后一银行要统一使用国钥加密,所以让集成两种加密方式,加密的方法通过传值不同加密类型和公钥,进行加密。
网上找了好多,都没有OC的加密集成,大都是java和c的。本人菜鸟c小白,不知道怎么使用c,找了好多网上的东西,给大家分享下,我集成好的过程。如果c比较好的去git上下载集成,自己使用。
一.方法一基于GmSSL的实现
1.第一篇文章的链接iOS开发实现SM2加密(基于GmSSL的实现)
2.第二篇文章的链接IOS编译和安装GmSSL
刚开始在网上看到这两篇文章。这两篇文章最关键的部分就是编译 GmSSL,我电脑上不知道,是不是因为安装了openssl,编译刚开始的时候,第一篇文章执行到------ sudo make install这行命令就报错,和他说的错误差不多,后执行几次, 因为 架构不同要重复更改后面的(armv7 armv7s arm64),就出现奇葩的错误,在网上找了好长时间都没有这样的错误,醉了。看了他们的步骤没有几步,如果你们可以编译通过最后把模拟器和真机的 xxxx.a 合并出来导入工程就可以用了。
二.方法二----基于openssl的实现
1.参考文章的链接在iOS中调用C语言的国密算法SM2以替换RSA (这个有下载的git的 demo)
下载的demo里面出了加密还有加签,验签。
因为公司要写个sdk,让客户使用sdk传值加密类型(RSA或者SM2)和公钥,进行加密。
demo中作者给的是直接的 px和py(因为sm2圆锥曲线加密,要把公钥分成 px,py,这个可以在网上查查)。因为老大给的公钥是base64后的字符串数据。所以在网上看一些sm2知识,然后看了下c代码需要的参数,于是通过一下步骤得到 px,py;
1.1先拿到base64后的字符串base64_decode,反编译,让后得到64位的字节数组,前32位px,后32位py。代码如下:
//公钥是错误的
NSData * data11 = base64_decode(@"LZIF3FiM0RomSeBpNaUBU+LvRvHGAgkYwXKrrzd/DCl8ryAky1YMOHbH1G75s57qO+Md9mEnY73VHECxKMIsDGQ==");
//base64解码data
static NSData *base64_decode(NSString *str){
NSData *data = [[NSData alloc] initWithBase64EncodedString:str options:NSDataBase64DecodingIgnoreUnknownCharacters];
return data;
}
1.2将data数据转化为Byte数组。让后得到px,py
Byte *testByte = (Byte *)[data11 bytes];
NSString *hexStr1=@"";
NSString *hexStr2=@"";
for(int i=0;i<[data11 length];i++)
{
if (i < 32) {
NSString *newHexStr = [NSString stringWithFormat:@"%x",testByte[i]&0xff];///16进制数
if([newHexStr length]==1)
hexStr1 = [NSString stringWithFormat:@"%@0%@",hexStr1,newHexStr];
else
hexStr1 = [NSString stringWithFormat:@"%@%@",hexStr1,newHexStr];
} else {
NSString *newHexStr = [NSString stringWithFormat:@"%x",testByte[i]&0xff];///16进制数
if([newHexStr length]==1)
hexStr2 = [NSString stringWithFormat:@"%@0%@",hexStr2,newHexStr];
else
hexStr2 = [NSString stringWithFormat:@"%@%@",hexStr2,newHexStr];
}
}
NSLog(@"gongyao:%@==outputString1:%@", hexStr1,hexStr2);
NSString *px_ = [hexStr1 stringByReplacingOccurrencesOfString:@" " withString:@""];
//NSString *py_ = [@"E481C0D9EE8A98D4EEB6D6C6D7E74F8E3E707C8A438529492E663CD4373A2F24" stringByReplacingOccurrencesOfString:@" " withString:@""];
NSString *py_ = [hexStr2 stringByReplacingOccurrencesOfString:@" " withString:@""];
1.3私钥解密步骤也一样,这样替换了你自己的 公钥和私钥就行了。
//私钥是错误的
NSData * data = base64_decode(@"YjuIufQqjTHO77Xe3TKuMRzgqR62LXMmTpyagNWaGG+w=");
Byte *bytes = (Byte *)[data bytes];
NSString *hexStr=@"";
for(int i=0;i<[data length];i++)
{
NSString *newHexStr = [NSString stringWithFormat:@"%x",bytes[i]&0xff];///16进制数
if([newHexStr length]==1)
hexStr = [NSString stringWithFormat:@"%@0%@",hexStr,newHexStr];
else
hexStr = [NSString stringWithFormat:@"%@%@",hexStr,newHexStr];
}
NSLog(@"bytes 的16进制数为:%@",hexStr);
NSString *pri_ = [hexStr stringByReplacingOccurrencesOfString:@" " withString:@""];
1.4然后把demo中的作者给的公钥私钥替换你自己的公钥就行了。第一种方法有时间我在尝试下,在研究下。