RSA加密算法
RSA加密算法是一种非对称加密算法。应用场景:
加密特点:相对安全、加密效率低、加密数据小
使用RSA加密算法完整的流程是:
- 产生对应的公钥和私钥
- 使用算法对数据加密
- 使用对应算法对加密后的数据解密
1.公钥私钥的产生
涉及到几个概念:欧拉函数、模逆元,我们逐个看一下
欧拉函数
概念:任意给定正整数n,求出在小于等于n的正整数之间有多少个与n构成互质关系。
计算这个值的方式叫做欧拉函数,使用
ϕ
(
n
)
\phi (n)
ϕ(n)表示如
ϕ
(
8
)
=
4
\phi(8)=4
ϕ(8)=4,计算8的欧拉函数,1、2、3、4、5、6、7、8,其中1357互质,个数为4.
ϕ
(
7
)
=
6
\phi(7)=6
ϕ(7)=6,1、2、3、4、5、6均是,个数为6.
函数特点
模逆元
概念:也称模反元素,如果两个正整数e和x互质,那么一定可以找到整数d,是的ed-1被x整除。
(
e
∗
d
)
%
x
=
1
(e*d)\%x=1
(e∗d)%x=1对应的
e
∗
d
=
k
∗
x
+
1
e*d=k*x+1
e∗d=k∗x+1,此时d就是e的对于x的模反元素。
2.加密消息
3.解密消息
整理流程图
其中:
公钥:n和e
私钥:n和d
明文:m
密文:m
说明:
1.n会非常大,长度一般为1024个二进位,目前人类已经分解的最大整数,232个十进制比特位,768个二进制位。
2.由于要求出
ϕ
(
n
)
\phi(n)
ϕ(n),根据欧拉函数特点,最简单的方式就是n由两个质数相乘得到p1,p2,
ϕ
(
n
)
=
(
p
1
−
1
)
(
p
2
−
1
)
\phi(n)=(p1-1)(p2-1)
ϕ(n)=(p1−1)(p2−1)
3.最终由
ϕ
(
n
)
\phi(n)
ϕ(n)得到e和d,根据上面的模反元素。
关于RSA的安全:
除了公钥用到了n和e其余4个数字是不公开的,目前破解RSA得到d的方式如下:
1.要想求出d,由于
e
∗
d
=
ϕ
(
n
)
∗
k
+
1
e*d=\phi(n)*k+1
e∗d=ϕ(n)∗k+1。
2.e是知道的,但是要知道
ϕ
(
n
)
\phi(n)
ϕ(n).,必须知道p1和p2.
3.由于n=p1*p2.只有将n因数分解才能算出来。
终端命令演示
Mac系统内置了OpenSSL(开源加密库),所以我们可以直接使用敏玲来玩RSA,
命令 | 含义 |
---|---|
genrsa | 生成并输入一个RSA私钥 |
rsautl | 使用RSA秘钥进行加密、解密、签名、验证等运算 |
rsa | 处理RSA秘钥的格式转换等问题 |
- 生成RSA秘钥,秘钥长度为1024bit.
- 从私钥中提取公钥
-生成文件如下
- 将私钥转换成明文
- 通过公钥加密数据,私钥解密数据
- 通过私钥进行加密,公钥解密数据
代码方式实现:
//1.加载公钥
[[RSACryptor sharedRSACryptor] loadPublicKey:[[NSBundle mainBundle] pathForResource:@"rsacert.der" ofType:nil]];
//2.加载私钥
[[RSACryptor sharedRSACryptor] loadPrivateKey: [[NSBundle mainBundle] pathForResource:@"p.p12" ofType:nil] password:@"123456"];
NSData * result = [[RSACryptor sharedRSACryptor] encryptData:[@"hello" dataUsingEncoding:NSUTF8StringEncoding]];
//base64编码
NSString * base64 = [result base64EncodedStringWithOptions:0];
NSLog(@"加密之后:%@\n",base64);
//解密
NSData * dcStr = [[RSACryptor sharedRSACryptor] decryptData:result];
NSLog(@"%@",[[NSString alloc] initWithData:dcStr encoding:NSUTF8StringEncoding]);