首先了解一下RSA加密解密知识:
RSA加密算法是一种非对称加密算法,所谓非对称,就是指该算法加密和解密使用不同的密钥,即使用加密密钥(公钥)进行加密、解密密钥(私钥)进行解密。在RAS算法中,加密密钥(即公开密钥)PK是公开信息,而解密密钥(即秘密密钥)SK是需要保密的。加密算法E和解密算法D也都是公开的。虽然解密密钥SK是由公开密钥PK决定的,由于无法计算出大数n的欧拉函数phi(N),所以不能根据PK计算出SK。
也就是说,对极大整数做因数分解的难度决定了RSA算法的可靠性。理论上,只要其钥匙的长度n足够长,用RSA加密的信息实际上是不能被解破的。
RSA加密算法涉及到两个关键因素:公钥和私钥。公钥是可以公开的,而私钥只有其持有者才能访问。
(摘自RSA加密算法原理-优快云博客)
1.密钥生成
RSA加密算法密钥生成的过程如下:
(1)首先选取两个互为质数的数p,q(p 不等于q),求n
n = p * q
(2)求phi
phi= (p - 1) * (q - 1)
(3)选择一个整数e,1<e<phi,且e与phi互质
(4)计算d,满足ed ≡ 1 (mod phi)
“≡”是数论中表示同余的符号
如果 ed 和 1 满足 ed-1 能被 phi 整除,称为整数 ed 与 1 对模 phi 同余
换言之,d是关于 phi的乘法逆元。即ed % phi = 1,其中%表示求余运算。
公钥为(n,e),私钥为(n,d)
乘法逆元
在实数运算中,除以一个数,等于乘上这个数的倒数。而现在在模意义下,逆元就充当了“倒数”的角色,模意义下乘上逆元就相当于除以了一个数。
逆元定义:如果一个线性同余方程 ax ≡ 1 ( mod b ) ,则 x 称为 a mod b 的逆元,记作 a的-1次方 。所以求逆元实际上就是求如下方程的解:
ax ≡ 1 ( mod b)
(来自【精选】[学习笔记]乘法逆元_模意义下的乘法逆元_Dodgemin的博客-优快云博客)
那么如何求解呢?(这里只给出两种方法,其余方法可以自行搜索)
1.扩展欧几里得算法(辗转相除法)
(图片截至【精选】扩展欧几里得算法求逆元---乘法密码-优快云博客)
举例说明:根据5x≡1(mod 17)求5 mod 17的乘法逆元。
--------------------->5x+17y=1 (由ax%b=1转至ax+by=1)
--------------------->17=5*3+2 (辗转相除法逐一拆分)
--------------------->5=2*2+1 (直到最后余数为1结束)
--------------------->5=(17-5*3)*2+1(消去中间元素)
--------------------->5*7-17*2=1 (还原回原来式子)
解出:x = 7 , y = -2
2.利用python中的gmpy2库中的invert函数
例如:
d = gmpy2.invert(e,phi)
加密函数:c = m**e mod n
解密函数:m = c**d mod n
BUU
RSA
题目:在一次RSA密钥对生成中,假设p=473398607161,q=4511491,e=17
求解出d作为flga提交
使用python编写代码即可求出
注意使用gmpy2之前一定要先下载好这个库,才可以使用。
rsarsa
题目:Math is cool! Use the RSA algorithm to decode the secret message, c, p, q, and e are parameters for the RSA algorithm.
p = 9648423029010515676590551740010426534945737639235739800643989352039852507298491399561035009163427050370107570733633350911691280297777160200625281665378483
q = 11874843837980297032092405848653656852760910154543380907650040190704283358909208578251063047732443992230647903887510065547947313543299303261986053486569407
e = 65537
c = 83208298995174604174773590298203639360540024871256126892889661345742403314929861939100492666605647316646576486526217457006376842280869728581726746401583705899941768214138742259689334840735633553053887641847651173776251820293087212885670180367406807406765923638973161375817392737747832762751690104423869019034
Use RSA to find the secret message
要求找出最后的秘密信息就需要用到解密函数m = c**d mod n
同样使用python编程进行解密
使用pow函数防止运算过程中因数据过大导致程序错误。