RSA算法推导及python实现

本文深入探讨了RSA加密算法的原理,基于大数素因子分解的困难性,介绍了加密解密过程,并通过欧拉扩展的Fermat小定理证明了解密公式的合理性。此外,还提供了具体的Python代码实现加密和解密过程。

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

RSA算法推导及python实现

RSA算法原理

众所周知,所谓加密解密的好处就是我用很简单的路子就能解密,而不知道密码的人可能需要耗费极大的代价才能破解,而这样的代价在物理世界中几乎是不可能实现的。

RSA算法基于大数素因子分解的困难性,比如一个数n=187,并不容易知道它是11*17的结果,但我们直接一个乘法就能算出11 * 17 =187。

具体加解密的过程不再细说,网上很多。下面进行这种方式合理性的推导。

推导

已知加密时c=me(mode n)c=m^e(mode \space n)c=me(mode n)解密时m=cd(mode n)m=c^d(mode \space n)m=cd(mode n),cd=(me)d=med=mk(p−1)(q−1)+1=m∗mk(p−1)(q−1)=m∗(m(p−1)(q−1))kc^d=(m^e)^d=m^{ed}=m^{k(p-1)(q-1)+1}=m*m^{k(p-1)(q-1)}=m*(m^{(p-1)(q-1)})^kcd=(me)d=med=mk(p1)(q1)+1=mmk(p1)(q1)=m(m(p1)(q1))k

所以cdmod n=m∗(m(p−1)(q−1))k mod nc^d mod \space n=m*(m^{(p-1)(q-1)})^k \space mod \space ncdmod n=m(m(p1)(q1))k mod n

因为a∗b mod n=((a mod n)∗(b mod n)) mod na*b\space mod \space n=((a\space mod\space n)*(b\space mod\space n))\space mod\space nab mod n=((a mod n)(b mod n)) mod n

下面证明m(p−1)(q−1) mod n=1m^{(p-1)(q-1)}\space mod\space n=1m(p1)(q1) mod n=1,如果成立,那么cdmod n=m mod nc^d mod \space n=m\space mod \space ncdmod n=m mod n,证明了解密公式的正确性。

欧拉扩展Fermat小定理

if gcd(a,n)=1,then aϕ(n) mod n=1if\space gcd(a,n)=1,then \space a^{\phi(n)}\space mod\space n=1if gcd(a,n)=1,then aϕ(n) mod n=1

证明:

{b1,...bϕ(n)}\{b_1,...b_{\phi(n)}\}{b1,...bϕ(n)}是n的简化剩余系,

/*简化剩余系可以理解为在[0,n-1]中与n只有公因子1的元素组成的集合 */

{a∗b1,...a∗bϕ(n)}\{a*b_1,...a*b_{\phi(n)}\}{ab1,...abϕ(n)}也是n的简化剩余系

/* 因为如果a∗bi mod n=a∗bj mod na*b_i\space mod\space n=a*b_j\space mod\space nabi mod n=abj mod n,那么又gcd(a,n)=1,所以b可约,那么bi mod n=bj mod nb_i\space mod\space n=b_j\space mod\space nbi mod n=bj mod n,显然一个简化剩余系中两元素应该不同余,矛盾,得证 {a∗b1,...a∗bϕ(n)}\{a*b_1,...a*b_{\phi(n)}\}{ab1,...abϕ(n)}中每个元素不同余,而且gcd(a,n)=1,所以每个元素又与n无大于1的公因子,所以是简化剩余系*/

所以b1∗b2∗...∗bϕ(n) mod n=aϕ(n)∗b1∗b2∗...∗bϕ(n) mod nb_1*b_2*...*b_{\phi(n)}\space mod\space n=a^{\phi(n)}*b_1*b_2*...*b_{\phi(n)}\space mod\space nb1b2...bϕ(n) mod n=aϕ(n)b1b2...bϕ(n) mod n …式1

b1,b2,...,bϕ(n)b_1,b_2,...,b_{\phi(n)}b1,b2,...,bϕ(n)都与n无大于1的公因子,所以b1∗b2∗...∗bϕ(n)b_1*b_2*...*b_{\phi(n)}b1b2...bϕ(n)与n的最大公因子是1.

所以式1的两边可同时约去b1∗b2∗...∗bϕ(n)b_1*b_2*...*b_{\phi(n)}b1b2...bϕ(n)

/* 上边这个同余式两边约去c(c需要满足与模数m只有公因子1)仍成立的定理自己推吧 */

所以aϕ(n) mod n==1a^{\phi(n)}\space mod\space n==1aϕ(n) mod n==1

那么在如何用到RSA中?RSA中的n=pq,欲证明m(p−1)(q−1) mod n=1m^{(p-1)(q-1)}\space mod\space n=1m(p1)(q1) mod n=1,只需

ϕ(n)=(p−1)(q−1){\phi(n)}=(p-1)(q-1)ϕ(n)=(p1)(q1),下面讨论欧拉函数ϕ(n){\phi(n)}ϕ(n)

欧拉函数

ϕ(n){\phi(n)}ϕ(n)是n的简化剩余系中元素个数,若n=pr,then ϕ(n)=(p−1)pr−1n=p^r,then\space {\phi(n)}=(p-1)p^{r-1}n=pr,then ϕ(n)=(p1)pr1,

因为若一个小于p的数含因子p,那这个数可表示为p*a,其中1≤a≤pr−11\leq a\leq p^{r-1}1apr1,所以这样的数有pr−1p^{r-1}pr1个。

gcd(m1,m2)=1gcd(m_1,m_2)=1gcd(m1,m2)=1,then ϕ(m1∗m2)=ϕ(m1)∗ϕ(m2)then\space {\phi(m_1*m_2)}={\phi(m_1)}*{\phi(m_2)}then ϕ(m1m2)=ϕ(m1)ϕ(m2)

证明:

设x属于m1的简化剩余系,gcd(m1,x)=1,

y属于m1的简化剩余系,gcd(m2,y)=1

gcd(m2∗x+m1∗y,m1∗m2)=1gcd(m_2*x+m_1*y,m_1*m_2)=1gcd(m2x+m1y,m1m2)=1, …式2

若式2不成立,则假设存在c>1,使gcd(m2∗x+m1∗y,m1∗m2)=cgcd(m_2*x+m_1*y,m_1*m_2)=cgcd(m2x+m1y,m1m2)=c,

m1∗m2m_1*m_2m1m2含有因子c,因为gcd(m1,m2)=1gcd(m_1,m_2)=1gcd(m1,m2)=1,即m1与m2不含公因子。那就只有一个数含因子c,不妨设m1含因子c,m1=k1∗cm_1=k_1*cm1=k1c,

m2∗x+m1∗y=k2∗cm_2*x+m_1*y=k_2*cm2x+m1y=k2c,所以带入m1,m2∗x+k1∗c∗y=k2∗cm_2*x+k_1*c*y=k_2*cm2x+k1cy=k2c,

m2∗x=c(k2−k1y)m_2*x=c(k_2-k_1y)m2x=c(k2k1y),因为m2不含因子c,又m2∗xm_2*xm2x有因子c,那只能是x含因子c,又m1含因子c,那么gcd(m1,x)=cgcd(m_1,x)=cgcd(m1,x)=c,与前述gcd(m1,x)=1矛盾。

因此式2成立。

这样m1∗m2m_1*m_2m1m2的简化剩余系可有m2∗x+m1∗ym_2*x+m_1*ym2x+m1y来构造,x有ϕ(m1){\phi(m_1)}ϕ(m1)个,y有ϕ(m2){\phi(m_2)}ϕ(m2)个,因此m1∗m2m_1*m_2m1m2的简化剩余系中元素个数有ϕ(m1)∗ϕ(m2){\phi(m_1)}*{\phi(m_2)}ϕ(m1)ϕ(m2)个。

得证。

综上
m(p−1)(q−1) mod n=1m^{(p-1)(q-1)}\space mod\space n=1m(p1)(q1) mod n=1


n=187
e=3
d=107



def encry(mess):
    cry=''
    for item in mess:
        m=ord(item)
        c=pow(m,e)%n
        cry=cry+chr(c)
    return cry


def decry(cry):
    mes=''
    for item in cry:
        c=ord(item)
        m=pow(c,d)%n
        mes=mes+chr(m)
    return mes

if __name__=='__main__':
    mess = 'meet at NEU tomorow'
    cry=encry(mess)
    print(cry)
    mes=decry(cry)
    print(mes)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值