编程语言
首页 > 编程语言> > RSA算法

RSA算法

作者:互联网

RSA的加密过程

(1)选择两个大的参数,计算出模数 N = p * q
(2)计算欧拉函数 φ = (p-1) * (q-1),然后选择一个e (1 < e < φ) ,并且e和φ互质(互质:公约数只有1的两个整数)
(3)取e的模反数d,计算方法为:e * d ≡ 1 (mod φ)
(模反元素:如果两个正整数e和n互质,那么一定可以找到整数d,使得 e * d - 1 被n整除,或者说e * d被n除的余数是1。这时,d就叫做e的“模反元素”。欧拉定理可以用来证明模反元素必然存在。两个整数a,b,它们除以整数M所得的余数相等:a ≡ b(mod m);
比如说5除3余数为2,11除3余数也为2,于是可写成11 ≡ 5(mod 3)。)
(4)对明文m进行加密:c = pow(m, e, N),可以得到密文c。
(5)对密文c进行解密:m = pow(c, d, N),可以得到明文m。

p 和 q :大整数N的两个因子
N:大整数N,我们称之为模数
e 和 d:互为模反数的两个指数
c 和 m:分别是密文和明文
(N, e):公钥
(N, d):私钥
pow(x, y, z):效果等效pow(x, y)1 % z, 先计算x的y次方,如果存在另一个参数z,需要再对结果进行取模。

安全性:

对于RSA加密算法,公钥(N, e)为公钥,可以任意公开,破解RSA最直接(亦或是暴力)的方法就是分解整数N,然后计算欧拉函数φ(n)=(p-1) * (q-1),再通过d * e ≡ 1 mod φ(N),即可计算出 d,然后就可以使用私钥(N, d)通过m = pow(c,d,N)解密明文

例子

已知p、q、e以及c,可以通过前三个参数求出d

python脚本

import gmpy2
p = gmpy2.mpz(18443) #初始化大整数
q = gmpy2.mpz(49891)
e = gmpy2.mpz(19)
phi_n = (p-1)*(q-1)
d = gmpy2.invert(e,phi_n) #invert(x,m)返回y使得x * y == 1 modulo m,如果不存在y,则返回0
print("p=%s,q=%s,e=%s"%(p,q,e))
print("d is:\n%s"%d)

上面RSA相关内容来自https://blog.csdn.net/huanghelouzi/article/details/82943615

gmpy2用法

import gmpy2
gmpy2.mpz(n)#初始化一个大整数
gmpy2.mpfr(x)# 初始化一个高精度浮点数x
d = gmpy2.invert(e,n) # 求逆元,de = 1 mod n
C = gmpy2.powmod(M,e,n)# 幂取模,结果是 C = (M^e) mod n
gmpy2.is_prime(n) #素性检测
gmpy2.gcd(a,b)  #欧几里得算法,最大公约数
gmpy2.gcdext(a,b)  #扩展欧几里得算法
gmpy2.iroot(x,n) #x开n次根

上面gmpy2用法相关内容来自https://blog.csdn.net/qq_42250840/article/details/105153227

标签:gmpy2,pow,RSA,整数,算法,mpz,mod
来源: https://blog.csdn.net/since_2020/article/details/115822611