Crypto 3

本文介绍了RSA非对称加密算法的工作原理,涉及公钥和私钥的概念,以及密钥生成过程。重点讲解了如何通过扩展欧几里得算法和Python库gmpy2求解乘法逆元,以及如何使用RSA加密和解密函数。最后给出了一个实际问题的解密示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先了解一下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函数防止运算过程中因数据过大导致程序错误。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值