ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

RSA算法

2021-04-18 11:57:11  阅读:330  来源: 互联网

标签:gmpy2 pow RSA 整数 算法 mpz mod


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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有