RSA原理理解
起源:
RSA是一种公钥密码算法,它的名字是由它的三位开发者,即Ron Rivest、Adi Shamir 和 Leonard Adleman 的姓氏的首字母组成的。
简介:
RSA加密算法是一种非对称加密算法,在公开密钥加密和电子商业中被广泛使用。对极大整数做因数分解的难度决定了RSA算法的可靠性。换言之,对一极大整数做因数分解愈困难,RSA算法愈可靠。假如有人找到了一种快速因数分解的算法,那么用RSA加密的信息的可靠性就会极度下降。但找到这样算法的可能性是非常小的。今天只有短的RSA钥匙才可能被暴力方式破解。到目前为止(2021年),世界上还没有任何可靠的攻击RSA算法的方式。只要其密钥的长度足够长,用RSA加密的信息实际上是不可能被破解的。
加密过程
加密由公钥,私钥,明文,密文,四部分组成。
前提:公钥(7,33)和私钥(3,33)中的,7,33(这两个33是同一个数字)只有私钥中的3是不公开的。
过程1:现在假设我们用这个公私钥对去发送消息C A O,假如字符转换为的十进制数字的规则就是序号顺序,那么C A O 对应的就是3 1 15
过程2:这时候就用到了公钥中的第一个数字7,也就是对3进行7次方,1进行7次方,15进行7次方,结果分别是2187 1 170859375
过程3:使用公钥的第二个数字33,对上面数字进行求余。2187%33=9 1%33=1 170859375%33=27 最后得到的9 1 27就是密文
将得到的密文发送给接收方,接收方再进行解密
解密过程:
1.由发送方可以得到9 1 27,依次对其进行3次方,这里的3次方的3就是私钥中的3.分别得到 729 1 19683
2.再对上面求得数字进行求余 729%33=3 1%33=1 19683%33=15 这里的33就是公钥和私钥公开的数字
3.上一步求解得到的3 1 15是不是很眼熟,没错就是要发送的信息,也就是明文
那么可以用公钥加密,私钥解密,那也可以用私钥解密,公钥加密
总结
如果用E代表7 ,N代表33 D代表3,那么
公钥:(E,N)私钥:(D,N)
得到密文(也就是加密)的公式: 密文=明文的E次方%N
解出明文的公式: 明文=密文的D次方%N
那么公钥和私钥该如何确定?
五个步骤: 1.任意选择两个质数 2.两个质数相乘 3.计算欧拉函数 4.选公钥e的时候,要求不是t的因子还必须是大于1小于T,那么就是gcd(e,T)=1(即是e和T的最大公因数是1)
5.计算私钥d--逆元
逆元---逆元是什么?为什么突然讨论逆元?
还记得上面求解私钥指数d的公式吗?
e*d mod T=1
这个公式也可以写成
e*d ≡ 1(mod T)
定义:如果一个线性同余方程 ax ≡ 1(mod b),则 x 称为 a mod b 的逆元,记作a-1 (a的-1次方)。一个数有逆元的充分必要条件是gcd(a,b)=1,此是逆元唯一存在 。
此处为什么讨论逆元呢?其一,RSA中有逆元的概念;其二,中国剩余定理(CRT)可与 RSA 算法结合来进行加解密,CRT又逃不开逆元的概念,所以就说了。逆元也是数论中一个十分重要的概念,当我们要求 (a / b) mod p的值,且a很大,大到会溢出;或者说b很大,达到会爆精度。无法直接求得a/b的值时,我们就要用到乘法逆元。
所以上述求解私钥指数d,可以说 e 的逆元是 d mod T
计算方法 inverse--- gmpy2.invert
注意求d在python中可以使用求逆函数inverse
#给出p和q,e的数值.引用求逆函数inverse
from Crypto.Util.number import inverse
p=473398607161
q=4511491
e=17
#计算欧拉函数T
t=(p-1)*(q-1)
#计算d
d=inverse(e,t)
print(d)
这个库实在python3.12下执行的,其他版本的可能需要将下载的Crypto的包改为大写
#给出p和q,e的数值.引用求逆函数gmpy2
import gmpy2
p=473398607161
q=4511491
e=17
\#计算欧拉函数T
t=(p-1)*(q-1)
\#计算d
d=gmpy2.invert(e,t)
print(d)
使用gmpy2这个库的时候,我们使用的是3.10的python,其他版本可能会报错