RSA算法简单回顾
RSA常见参数
RSA算法涉及三个参数,n,e,d,私钥为(n,d),公钥为(n,e)。
其中n是两个大素数p,q的乘积,
d是e模
$ varphi(n) $
的逆元,$ varphi(n) $
是n的欧拉函数。c为密文,m为明文,
在n,e是公开的情况下,想要知道d的值,必须要将n分解计算出n的欧拉函数值,而n是两个大素数p,q的乘积,将其分解是困难的,所以大数分解决定了该算法的安全性。
公钥与私钥的产生:
进行加密之前,首先找出2个不同的大质数p和q
计算n=p*q
根据欧拉函数,求得φ(n)=φ(p)φ(q)=(p−1)(q−1)
找出一个公钥e,e要满足: 1<e<φ(n) 的整数,且使e和φ(N)互质。
根据e*d除以φ(n)余数为1,找到私钥d。
公钥就是(n,e) 私钥就是(n,d)
所以公钥和私钥在原理上是可以互相替换的,在 公钥没有泄露的情况下 ,下发私钥并利用私钥进行加密,公钥进行解密完成可行。
问题由来
以前用openssl生成公私钥时,都是直接机械式复制那几条命令,没有深究。今天在生成公钥的时候,才发现openssl的公钥原来是从私钥中提取出来的,那如果公私钥互换,,,???
分析:
生成密钥与公钥
- 利用openssl生成密钥:
1 | (umask 066;openssl genrsa -out genrsa.pem 4096;umask 022) |
这里因为密钥一般只自已使用,所以直接用umask生成了600权限的密钥。
- 利用生成密钥提取公钥:
1 | openssl rsa -in genrsa.pem -out rsa.pub -pubout |
分析公私钥
- 使用openssl命令提取公钥的信息
1 | openssl rsa -pubin -in rsa.pub -text -modulus |
如下所示:
1 | Public-Key: (4096 bit) |
发现公钥(n,e)正常,
- 查看生成私钥
1 | openssl rsa -in genrsa.pem -text -noout |
由于私钥过长,此处加了‘-noout’参数,不显示私钥内容,如下所示:
1 | Private-Key: (4096 bit) |
发现该私钥中存在n,e,d,也就是说利用
openssl genrsa -out genrsa.pem 4096
命令生成的私钥,严格意义上来说并不是私钥,而是包含公钥与私钥的密钥对。所以用openssl工具生成公钥与私钥千万不能搞错。。。同时可以看到e,d 的值差距明显,在该例中,e=65537(现在默认)。当e=1,2,3时都有低加密指数分解攻击的风险,当e过大时,也可使用Boneh and Durfee attack等方式攻击,所以从性能与安全的角度综合考虑为65537,而生成的私钥e很大,如果置换后,可能带来性能与安全各种问题。