‘壹’ iOS RSA加密生成公钥私钥
该命令生成一个模长 2048 位,名字为 rsa_private_key.pem 、 PKCS1 格式的 RSA 私钥文件.
genrsa :指定生成算法使用 RSA
-out :后面参数是生成的私钥的文件名
2048 :生成私钥的模长,单位字节(bits)
根据生成的私钥 rsa_private_key.pem 文件,生成公钥 rsa_public_key.pem 文件
生成名字为 rsa_pkcs8_private_key.pem 的私钥文件
Java 和 android 用到的密钥:
公钥: rsa_public_key.pem
私钥: rsa_pkcs8_private_key.pem
终端会提示输入国家、省市、所在地、组织、组织单位、常用名称、邮箱地址等信息,按要求填写(可以随便填写), 输入完对应信息后会提示输入一个密码 :
最终会生成 rsacert.csr 文件
用最开始生成的私钥 rsa_private_key.pem 和 rsacert.csr 证书请求文件生成一个数字证书 rsacert.crt
使用 x509 工具自建CA。由于 x509 无法建立证书请求文件,所以只能使用 openssl req 来生成请求文件,然后使用 x509 来自签署, 也可以用来签署他人的证书请求,即为他人颁发证书。
知识点 :
终端会提示设置密码,该密码是 .p12 私钥的密码(用 private_key.p12 私钥解密时, 要用到该密码, 需要记录下 ), 会提示再次输入检验刚才输入的密码.
‘贰’ ios怎么实现RAS加密解密
转载最近几天折腾了一下如何在iOS上使用RSA来加密。iOS上并没有直接的RSA加密API。但是iOS提供了x509的API,而x509是支持RSA加密的。因此,我们可以通过制作自签名的x509证书(由于对安全性要求不高,我们并不需要使用CA认证的证书),再调用x509的相关API来进行加密。接下来记录一下整个流程。
第一步,制作自签名的证书
1.最简单快捷的方法,打开Terminal,使用openssl(Mac OS X自带)生成私钥和自签名的x509证书。
openssl req -x509 -out public_key.der -outform der -new -newkey rsa:1024 -keyout private_key.pem -days 3650
按照命令行的提示输入内容就行了。
几个说明:
public_key.der是输出的自签名的x509证书,即我们要用的。
private_key.pem是输出的私钥,用来解密的,请妥善保管。
rsa:1024这里的1024是密钥长度,1024是比较安全的,如果需要更安全的话,可以用2048,但是加解密代价也会增加。
-days:证书过期时间,一定要加上这个参数,默认的证书过期时间是30天,一般我们不希望证书这么短就过期,所以写上比较合适的天数,例如这里的3650(10年)。
事实上,这一行命令包含了好几个步骤(我研究下面这些步骤的原因是我手头已经由一个private_key.pem私钥了,想直接用这个来生成x509证书,也就是用到了下面的2-3)
1)创建私钥
openssl genrsa -out private_key.pem 1024
2)创建证书请求(按照提示输入信息)
openssl req -new -out cert.csr -key private_key.pem
3)自签署根证书
openssl x509 -req -in cert.csr -out public_key.der -outform der -signkey private_key.pem -days 3650
2.验证证书。把public_key.der拖到xcode中,如果文件没有问题的话,那么就可以直接在xcode中打开,看到证书的各种信息。
第二步,使用public_key.der来进行加密。
1.导入Security.framework。
2.把public_key.der放到mainBundle中(一般直接拖到Xcode就行啦)。
3.从public_key.der读取公钥。
4.加密。
下面是参考代码(只能用于加密长度小于等于116字节的内容,适合于对密码进行加密。使用了ARC,不过还是要注意部分资源需要使用CFRealse来释放)
RSA.h
//
// RSA.h
//
#import <Foundation/Foundation.h>
@interface RSA : NSObject {
SecKeyRef publicKey;
SecCertificateRef certificate;
SecPolicyRef policy;
SecTrustRef trust;
size_t maxPlainLen;
}
- (NSData *) encryptWithData:(NSData *)content;
- (NSData *) encryptWithString:(NSString *)content;
@end
RSA.m
//
// RSA.m
//
#import "RSA.h"
@implementation RSA
- (id)init {
self = [super init];
NSString *publicKeyPath = [[NSBundle mainBundle] pathForResource:@"public_key"
ofType:@"der"];
if (publicKeyPath == nil) {
NSLog(@"Can not find pub.der");
return nil;
}
NSDate *publicKeyFileContent = [NSData dataWithContentsOfFile:publicKeyPath];
if (publicKeyFileContent == nil) {
NSLog(@"Can not read from pub.der");
return nil;
}
certificate = SecCertificateCreateWithData(kCFAllocatorDefault, ( __bridge CFDataRef)publicKeyFileContent);
if (certificate == nil) {
NSLog(@"Can not read certificate from pub.der");
return nil;
}
policy = SecPolicyCreateBasicX509();
OSStatus returnCode = (certificate, policy, &trust);
if (returnCode != 0) {
NSLog(@" fail. Error Code: %ld", returnCode);
return nil;
}
SecTrustResultType trustResultType;
returnCode = SecTrustEvaluate(trust, &trustResultType);
if (returnCode != 0) {
NSLog(@"SecTrustEvaluate fail. Error Code: %ld", returnCode);
return nil;
}
publicKey = SecTrustCopyPublicKey(trust);
if (publicKey == nil) {
NSLog(@"SecTrustCopyPublicKey fail");
return nil;
}
maxPlainLen = SecKeyGetBlockSize(publicKey) - 12;
return self;
}
- (NSData *) encryptWithData:(NSData *)content {
size_t plainLen = [content length];
if (plainLen > maxPlainLen) {
NSLog(@"content(%ld) is too long, must < %ld", plainLen, maxPlainLen);
return nil;
}
void *plain = malloc(plainLen);
[content getBytes:plain
length:plainLen];
size_t cipherLen = 128; // 当前RSA的密钥长度是128字节
void *cipher = malloc(cipherLen);
OSStatus returnCode = SecKeyEncrypt(publicKey, kSecPaddingPKCS1, plain,
plainLen, cipher, &cipherLen);
NSData *result = nil;
if (returnCode != 0) {
NSLog(@"SecKeyEncrypt fail. Error Code: %ld", returnCode);
}
else {
result = [NSData dataWithBytes:cipher
length:cipherLen];
}
free(plain);
free(cipher);
return result;
}
- (NSData *) encryptWithString:(NSString *)content {
return [self encryptWithData:[content dataUsingEncoding:NSUTF8StringEncoding]];
}
- (void)dealloc{
CFRelease(certificate);
CFRelease(trust);
CFRelease(policy);
CFRelease(publicKey);
}
@end
使用方法:
RSA *rsa = [[RSA alloc] init];
if (rsa != nil) {
NSLog(@"%@",[rsa encryptWithString:@"test"]);
}
else {
NSLog(@"init rsa error");
}
‘叁’ 怎么在ios中应用“RSA的私钥加密或公钥加密算法”
1、用公钥加密,用私钥解密。 2、给别人发信息,就从服务器上拉下来别人的公钥,加密后发给他。 3、对方拿到信息后用自己的私钥解密。 4、这样,公钥加密后除了私钥持有人,别人都看不到信息
‘肆’ iOS怎么使用模和指数进行RSA加密
首先确认你要加密的数据有多大,如果比较大建议先使用对称算法进行加密,将对称算法的密钥使用RSA加密即可。
现在定义:
你所拿到的公钥模为 N,指数为E
N的位长度为 len(N)
N占用的字节数为 k = (len(N)+7)/8
要加密的数据为D (可以是你原始的数据或者对称算法密钥)
如果你的加密数据比较小的话也可以直接进行RSA加密,比较小的意思为:被加密数据的长度必须能够满足填充条件,如果采用PKCS1_1.5的填充方式,D占用的字节要小于 k-11
运算过程很简单: 将D进行填充到D1, 要求D1所占用的字节数为 k (即同N的长度相同)
则计算密文E的过程为 DE = (D1 ^ E) % N ( ^ 表示指数运算)
在程序中实现建议你采用一些现成的库,如果有OpenSSL则可以网上搜索一下,资料应该不少。
如果没有的话可以直接引入一些大数计算的库直接进行模指运算(别分开,太慢)。
‘伍’ RSA加密原理
RSA加密是一种非对称加密。可以在不直接传递密钥的情况下,完成解密。这能够确保信息的安全性,避免了直接传递密钥所造成的被破解的风险。是由一对密钥来进行加解密的过程,分别称为公钥和私钥。公钥加密--私钥解密,私钥加密--公钥解密
在 整数 中, 离散对数 是一种基于 同余 运算和 原根 的一种 对数 运算。而在实数中对数的定义 log b a 是指对于给定的 a 和 b ,有一个数 x ,使得 b x = a 。相同地在任何群 G 中可为所有整数 k 定义一个幂数为 b K ,而 离散对数 log b a 是指使得 b K = a 的整数 k 。
当3为17的 原根 时,我们会发现一个规律
对 正整数 n,欧拉函数是小于或等于n的正整数中与n 互质 的数的数目(因此φ(1)=1)。有以下几个特点
服务端根据生成一个随机数15,根据 3 15 mod 17 计算出6,服务端将6传递给客户端,客户端生成一个随机数13,根据 3 13 mod 17 计算出12后,将12再传回给服务端,客户端收到服务端传递的6后,根据 6 13 mod 17 计算出 10 ,服务端收到客户端传递的12后,根据 12 15 mod 17 计算出 10 ,我们会发现我们通过 迪菲赫尔曼密钥交换 将 10 进行了加密传递
说明:
安全性:
除了 公钥 用到 n 和 e ,其余的4个数字是 不公开 的(p1、p2、φ(n)、d)
目前破解RSA得到的方式如下:
缺点
RSA加密 效率不高 ,因为是纯粹的数学算法,大数据不适合RSA加密,所以我们在加密大数据的时候,我们先用 对称加密 算法加密大数据得到 KEY ,然后再用 RSA 加密 KEY ,再把大数据和KEY一起进行传递
因为Mac系统内置了OpenSSL(开源加密库),所以我们开源直接在终端进行RSA加密解密
生成RSA私钥,密钥名为private.pem,密钥长度为1024bit
因为在iOS中是无法使用 .pem 文件进行加密和解密的,需要进行下面几个步骤
生成一个10年期限的crt证书
crt证书格式转换成der证书
‘陆’ iOS逆向(1)-密码学(RSA)
要讲逆向,那么肯定少不了密码学,因为所有的逆向(攻防)都是对已加密的数据进行解密。所以我们必须初步了解加密的方式有哪些,毕竟知己知彼,才能百战百胜。
接下来,我将从以下四方面来讲述密码学相关的内容:
1、什么是密码学
2、RSA数学原理
3、RSA终端命令
4、总结
密码学的历史大致可以追溯到两千年前,相传古罗马名将凯撒大帝为了防止敌方截获情报,用密码传送情报。凯撒的做法很简单,就是对二十几个罗马字母建立一张对应表。这样,如果不知道密码本,即使截获一段信息也看不懂。
从凯撒大帝时代到上世纪70年代这段很长的时间里,密码学的发展非常的缓慢,因为设计者基本上靠经验。没有运用数学原理。
在1976年以前,所有的加密方法都是同一种模式:加密、解密使用同一种算法。在交互数据的时候,彼此通信的双方就必须将规则告诉对方,否则没法解密。那么加密和解密的规则(简称密钥),它保护就显得尤其重
要。传递密钥就成为了最大的隐患。这种加密方式被成为对称加密算法(symmetric encryption algorithm)。
1976年,两位美国计算机学家 迪菲(W.Diffie)、赫尔曼( M.Hellman ) 提出了一种崭新构思,可以在不直接传递密钥的情况下,完成密钥交换。这被称为“迪菲赫尔曼密钥交换”算法。开创了密码学研究的新方向。
1977年三位麻省理工学院的数学家 罗纳德·李维斯特(Ron Rivest)、阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起设计了一种算法,可以实现非对称加密。这个算法用他们三个人的名字命名,叫做RSA算法。
也就是说“迪菲赫尔曼密钥交换”在密码学历史的车轮中成为了一个转折点。
咱们这里先把所有需要用到的公式定理列出来:
1、取模运算
2、欧拉函数φ
3、欧拉定理,费马小定理
4、模反元素
5、迪菲赫尔曼密钥交换
取模运算(“Molo Operation”)和取余运算(“Complementation ”)两个概念有重叠的部分但又不完全一致。主要的区别在于对负整数进行除法运算时操作不同。
在这列出各种负数情况的例子供大家理解:
7 mod 4 = 3(商 = 1 或 2,1<2,取商=1)
-7 mod 4 = 1(商 = -1 或 -2,-2<-1,取商=-2)
7 mod -4 = -1(商 = -1或-2,-2<-1,取商=-2)
-7 mod -4 = -3(商 = 1或2,1<2,取商=1)
函数值符号规律(余数的符号) mod(负,正)=正 mod(正,负)=负
结论:两个整数求余时,其值的符号为除数的符号。
可以简单理解为:
如果n可以分解为 两个互质(不一定是两个质数) 的数之积A和B,那么:
φ(n) = φ(A) * φ(B)
如果 A和B 又同时为质数,那么:
φ(n) = (A-1) * (B-1)
首先这里说一下,定制之所以是定理是被人证明过的,如何证明的不管,当然你也可以增加去证明下,反正我不管(……&%¥%……&%&……&%),哈哈
如果m、n为正整数,且m、n互质,那么:
如果n为质数,那么:
公式转换:
如果两个正整数e和x互质,那么一定可以找到整数d,使得 e*d-1 被x整除。那么d就是e对于x的“模反元素”。
如上图:
客户端持有一个随机数13 ,服务端持有随机数15,再选一对特殊的数,3是17的原根(啥是 原根 ?)。
两端交换的都是密文,就算中间被劫持,也不知道最后需要的传输的内容是10
那么这个10就是最后真正的秘钥。
证明过程
设
那么:
又由于上面模反元素 最后得出
所以得出最终结论:
这个公式也就是我们最后的RSA加密公式!!!
其中:
补充:
1、n会非常大,长度一般为1024个二进制位。(目前人类已经分解的最大整数,232个十进制位,768个二进制位)
2、由于需要求出φ(n),所以根据欧函数特点,最简单的方式n 由两个质数相乘得到: 质数:p1、p2
Φ(n) = (p1 -1) * (p2 - 1)
3、最终由φ(n)得到e 和 d 。
总共生成6个数字:p1、p2、n、φ(n)、e、d
关于RSA的安全:
除了公钥用到了n和e 其余的4个数字是不公开的。
目前破解RSA得到d的方式如下:
1、要想求出私钥 d 。由于e d = φ(n) k + 1。要知道e和φ(n);
2、e是知道的,但是要得到 φ(n),必须知道p1 和 p2。
3、由于 n=p1*p2。只有将n因数分解才能算出。
由于Mac系统内置OpenSSL(开源加密库),所以我们可以直接在终端上使用命令来玩RSA. OpenSSL中RSA算法常用指令主要有三个:
1、由于RSA加密解密用的不是一套数据,所以其保证了安全性。
2、由于私钥过大,所以效率较低
3、如果有一天量子计算机被普及(计算速度极快),那么1024位已经不足以让RSA安全。
‘柒’ RSA 加密算法(原理篇)
前几天看到一句话,“我们中的很多人把一生中最灿烂的笑容大部分都献给了手机和电脑屏幕”。心中一惊,这说明了什么?手机和电脑已经成为了我们生活中的一部分,所以才会有最懂你的不是你,也不是你男朋友,而是大数据。
如此重要的个人数据,怎样才能保证其在互联网上的安全传输呢?当然要靠各种加密算法。说起加密算法,大家都知道有哈希、对称加密和非对称加密了。哈希是一个散列函数,具有不可逆操作;对称加密即加密和解密使用同一个密钥,而非对称加密加密和解密自然就是两个密钥了。稍微深入一些的,还要说出非对称加密算法有DES、3DES、RC4等,非对称加密算法自然就是RSA了。那么当我们聊起RSA时,我们又在聊些什么呢?今天笔者和大家一起探讨一下,有不足的地方,还望各位朋友多多提意见,共同进步。
RSA简介:1976年由麻省理工学院三位数学家共同提出的,为了纪念这一里程碑式的成就,就用他们三个人的名字首字母作为算法的命名。即 罗纳德·李维斯特 (Ron Rivest)、 阿迪·萨莫尔 (Adi Shamir)和 伦纳德·阿德曼 (Leonard Adleman)。
公钥:用于加密,验签。
私钥:解密,加签。
通常知道了公钥和私钥的用途以后,即可满足基本的聊天需求了。但是我们今天的主要任务是来探究一下RSA加解密的原理。
说起加密算法的原理部分,肯定与数学知识脱不了关系。
我们先来回忆几个数学知识:
φn = φ(A*B)=φ(A)*φ(B)=(A-1)*(B-1)。
这个公式主要是用来计算给定一个任意的正整数n,在小于等于n的正整数中,有多少个与n构成互质的关系。
其中n=A*B,A与B互为质数,但A与B本身并不要求为质数,可以继续展开,直至都为质数。
在最终分解完成后,即 φ(N) = φ(p1)*φ(p2)*φ(p3)... 之后,p1,p2,p3都是质数。又用到了欧拉函数的另一个特点,即当p是质数的时候,φp = p - 1。所以有了上面给出的欧拉定理公式。
举例看一下:
计算15的欧拉函数,因为15比较小,我们可以直接看一下,小于15的正整数有 1、2、3、4、5、6、7、8、9、10、11、12、13、14。和15互质的数有1、2、4、7、8、11、13、14一共四个。
对照我们刚才的欧拉定理: 。
其他感兴趣的,大家可以自己验证。
之所以要在这里介绍欧拉函数,我们在计算公钥和私钥时候,会用到。
如果两个正整数m 和 n 互质,那么m 的 φn 次方减1,可以被n整除。
其中 .
其中当n为质数时,那么 上面看到的公式就变成了
mod n 1.
这个公式也就是着名的 费马小定理 了。
如果两个正整数e和x互为质数,那么一定存在一个整数d,不止一个,使得 e*d - 1 可以被x整除,即 e * d mode x 1。则称 d 是 e 相对于 x的模反元素。
了解了上面所讲的欧拉函数、欧拉定理和模反元素后,就要来一些化学反应了,请看图:
上面这幅图的公式变化有没有没看明白的,没看明白的咱们评论区见哈。
最终我们得到了最重要的第5个公式的变形,即红色箭头后面的:
mod n m。
其中有几个关系,需要搞明白,m 与 n 互为质数,φn = x,d 是e相对于x的模反元素。
有没有看到一些加解密的雏形。
从 m 到 m。 这中间涵盖了从加密到解密的整个过程,但是缺少了我们想要的密文整个过程。
OK,下面引入本文的第四个数学公式:
我们来看一下整个交换流程:
1、客户端有一个数字13,服务端有一个数字15;
2、客户端通过计算 3的13次方 对 17 取余,得到数字12; 将12发送给服务端;同时服务端通过计算3的15次方,对17取余,得到数字6,将6发送给客户端。至此,整个交换过程完成。
3、服务端收到数字12以后,继续计算,12的15次方 对 17取余,得到 数字10。
4、客户端收到数字 6以后,继续计算,6的13次方 对 17 取余,得到数字 10。
有没有发现双方,最终得到了相同的内容10。但是这个数字10从来没有在网络过程中出现过。
好,讲到这里,可能有些人已经恍然大悟,这就是加密过程了,但是也有人会产生疑问,为什么要取数字3 和 17 呢,这里还牵涉到另一个数学知识,原根的问题。即3是17的原根。看图
有没有发现规律,3的1~16次方,对17取余,得到的整数是从1~16。这时我们称3为17的原根。也就是说上面的计算过程中有一组原根的关系。这是最早的迪菲赫尔曼秘钥交换算法。
解决了为什么取3和17的问题后,下面继续来看最终的RSA是如何产生的:
还记得我们上面提到的欧拉定理吗,其中 m 与 n 互为质数,n为质数,d 是 e 相对于 φn的模反元素。
当迪菲赫尔曼密钥交换算法碰上欧拉定理会产生什么呢?
我们得到下面的推论:
好,到这里我们是不是已经看到了整个的加密和解密过程了。
其中 m 是明文;c 是密文; n 和 e 为公钥;d 和 n 为私钥 。
其中几组数字的关系一定要明确:
1、d是e 相对于 φn 的模反元素,φn = n-1,即 e * d mod n = 1.
2、m 小于 n,上面在讲迪菲赫尔曼密钥交换算法时,提到原根的问题,在RSA加密算法中,对m和n并没有原根条件的约束。只要满足m与n互为质数,n为质数,且m < n就可以了。
OK,上面就是RSA加密算法的原理了,经过上面几个数学公式的狂轰乱炸,是不是有点迷乱了,给大家一些时间理一下,后面会和大家一起来验证RSA算法以及RSA为什么安全。
‘捌’ ios开发rsa加密怎么生成秘钥
1、加密解密的第一步是生成公钥、私钥对,私钥加密的内容能通过公钥解密(反过来亦可以) 下载开源RSA密钥生成工具openssl(通常Linux系统都自带该程序),解压缩至独立的文件夹,进入其中的bin目录,执行以下命令: 代码如下: openssl genrsa -out rsa_private_key.pem 1024 openssl pkcs8 -topk8 -inform PEM -in rsa_private_key.pem -outform PEM -nocrypt -out private_key.pem openssl rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem 第一条命令生成原始 RSA私钥文件 rsa_private_key.pem,第二条命令将原始 RSA私钥转换为 pkcs8格式,第三条生成RSA公钥 rsa_public_key.pem 从上面看出通过私钥能生成对应的公钥,因此我们将私钥private_key.pem用在服务器端,公钥发放给android跟ios等前端 2、php中用生成的公钥、私钥进行加密解密,直接上代码 代码如下: $fp=fopen("rsa/rsa_private_key.pem","r"); //你的私钥文件路径 $private_key=fread($fp,8192); fclose($fp); $fp1=fopen("rsa/rsa_public_key.pem","r"); //你的公钥文件路径 $public_key=fread($fp1,8192); fclose($fp1); //echo $private_key; $pi_key=openssl_pkey_get_private($private_key);//这个函数可用来判断私钥是否是可用的,可用返回资源id Resource id $pu_key=openssl_pkey_get_public($public_key );//这个函数可用来判断公钥是否是可用的 print_r($pi_key);echo "n"; echo "<br>"; print_r($pu_key);echo "n"; echo "<br>"; echo "<hr>"; $data='php ras加密算法'; $encrypted = ""; $decrypted = ""; echo "加密的源数据:".$data."n"; echo "<br>"; echo "private key encrypt:n"; echo "<br>"; openssl_private_encrypt($data,$encrypted,$pi_key);//私钥加密 $encrypted = base64_encode($encrypted);//加密后的内容通常含有特殊字符,需要编码转换下,在网络间通过url传输时要注意base64编码是否是url安全的 echo '私钥加密后:'.$encrypted."n"; echo "<br>";echo "<br>"; echo "public key decrypt:n"; echo "<br>"; openssl_public_decrypt(base64_decode($encrypted),$decrypted,$pu_key);//私钥加密的内容通过公钥可用解密出来 echo '公钥解密后:'.$decrypted."n"; echo "<br>"; echo "<hr>"; echo "public key encrypt:n"; echo "<br>"; openssl_public_encrypt($data,$encrypted,$pu_key);//公钥加密 $encrypted = base64_encode($encrypted); echo $encrypted,"n"; echo "<br>"; echo "private key decrypt:n"; echo "<br>"; openssl_private_decrypt(base64_decode($encrypted),$decrypted,$pi_key);//私钥解密 echo $decrypted,"n"; echo "<br>"; PHP的RSA配置常见问题: ●PHP开发语言的代码示例中openssl文件夹中的3个DLL文件用法 1、如果你的系统是windows系统,且system32文件目录下没有libeay32.dll、ssleay32.dll这两个文件 那么需要拷贝这两个文件到system32文件目录。 2、如果您的php安装目录下(phpext)中没有php_openssl.dll 那么请把php_openssl.dll放在这个文件夹中 喜欢加密解密的小伙伴一定要好好看看这篇文章,受益匪浅。。。
‘玖’ IOS中怎么做RSA加密算法
RSA加密以及解密实现步骤:
1、使用openssl生成密匙对。
代码如下:(代码源于github开源社区)
#!/usr/bin/envbash
echo"GeneratingRSAkeypair..."
echo"1024RSAkey:private_key.pem"
opensslgenrsa-outprivate_key.pem1024
echo":rsaCertReq.csr"
opensslreq-new-keyprivate_key.pem-outrsaCertReq.csr
echo"createcertificationusingx509:rsaCert.crt"
opensslx509-req-days3650-inrsaCertReq.csr-signkeyprivate_key.pem-outrsaCert.crt
echo"createpublic_key.derForIOS"
opensslx509-outformder-inrsaCert.crt-outpublic_key.der
echo"createprivate_key.p12ForIOS.Pleaserememberyourpassword.ThepasswordwillbeusediniOS."
opensslpkcs12-export-outprivate_key.p12-inkeyprivate_key.pem-inrsaCert.crt
echo"creatersa_public_key.pemForJava"
opensslrsa-inprivate_key.pem-outrsa_public_key.pem-pubout
echo"createpkcs8_private_key.pemForJava"
opensslpkcs8-topk8-inprivate_key.pem-outpkcs8_private_key.pem-nocrypt
echo"finished."
2、加载证书后即可进行加密算法。
代码:
RSAEncryptor*rsa=[[RSAEncryptoralloc]init];
NSLog(@"encryptorusingrsa");
NSString*publicKeyPath=[[NSBundlemainBundle]pathForResource:@"public_key"ofType:@"der"];
NSLog(@"publickey:%@",publicKeyPath);
[rsaloadPublicKeyFromFile:publicKeyPath];
NSString*securityText=@"hello~";
NSString*encryptedString=[rsarsaEncryptString:securityText];
NSLog(@"encrypteddata:%@",encryptedString);
对应解密代码:
NSLog(@"decryptorusingrsa");
[rsaloadPrivateKeyFromFile:[[NSBundlemainBundle]pathForResource:@"private_key"ofType:@"p12"]password:@"123456"];
NSString*decryptedString=[rsarsaDecryptString:encryptedString];
NSLog(@"decrypteddata:%@",decryptedString);
RSA基本原理:
RSA使用"秘匙对"对数据进行加密解密.在加密解密数据前,需要先生成公钥(public key)和私钥(private key)。
公钥(public key): 用于加密数据. 用于公开, 一般存放在数据提供方, 例如iOS客户端。
私钥(private key): 用于解密数据. 必须保密, 私钥泄露会造成安全问题。