RSA算法推导及python实现

RSA算法推导及python实现

RSA算法原理

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

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

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

推导

已知加密时 c = m e ( m o d e   n ) c=m^e(mode \space n) c=me(mode n)解密时 m = c d ( m o d e   n ) m=c^d(mode \space n) m=cd(mode n), c d = ( m e ) d = m e d = m k ( p − 1 ) ( q − 1 ) + 1 = m ∗ m k ( p − 1 ) ( q − 1 ) = m ∗ ( m ( p − 1 ) ( q − 1 ) ) k c^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)})^k cd=(me)d=med=mk(p1)(q1)+1=mmk(p1)(q1)=m(m(p1)(q1))k

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

因为 a ∗ b   m o d   n = ( ( a   m o d   n ) ∗ ( b   m o d   n ) )   m o d   n a*b\space mod \space n=((a\space mod\space n)*(b\space mod\space n))\space mod\space n ab mod n=((a mod n)(b mod n)) mod n

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

欧拉扩展Fermat小定理

i f   g c d ( a , n ) = 1 , t h e n   a ϕ ( n )   m o d   n = 1 if\space gcd(a,n)=1,then \space a^{\phi(n)}\space mod\space n=1 if gcd(a,n)=1,then aϕ(n) mod n=1

证明:

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

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

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

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

所以 b 1 ∗ b 2 ∗ . . . ∗ b ϕ ( n )   m o d   n = a ϕ ( n ) ∗ b 1 ∗ b 2 ∗ . . . ∗ b ϕ ( n )   m o d   n b_1*b_2*...*b_{\phi(n)}\space mod\space n=a^{\phi(n)}*b_1*b_2*...*b_{\phi(n)}\space mod\space n b1b2...bϕ(n) mod n=aϕ(n)b1b2...bϕ(n) mod n …式1

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

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

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

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

那么在如何用到RSA中?RSA中的n=pq,欲证明 m ( p − 1 ) ( q − 1 )   m o d   n = 1 m^{(p-1)(q-1)}\space mod\space n=1 m(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 = p r , t h e n   ϕ ( n ) = ( p − 1 ) p r − 1 n=p^r,then\space {\phi(n)}=(p-1)p^{r-1} n=pr,then ϕ(n)=(p1)pr1,

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

g c d ( m 1 , m 2 ) = 1 gcd(m_1,m_2)=1 gcd(m1,m2)=1, t h e n   ϕ ( m 1 ∗ m 2 ) = ϕ ( m 1 ) ∗ ϕ ( m 2 ) 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

g c d ( m 2 ∗ x + m 1 ∗ y , m 1 ∗ m 2 ) = 1 gcd(m_2*x+m_1*y,m_1*m_2)=1 gcd(m2x+m1y,m1m2)=1, …式2

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

m 1 ∗ m 2 m_1*m_2 m1m2含有因子c,因为 g c d ( m 1 , m 2 ) = 1 gcd(m_1,m_2)=1 gcd(m1,m2)=1,即m1与m2不含公因子。那就只有一个数含因子c,不妨设m1含因子c, m 1 = k 1 ∗ c m_1=k_1*c m1=k1c,

m 2 ∗ x + m 1 ∗ y = k 2 ∗ c m_2*x+m_1*y=k_2*c m2x+m1y=k2c,所以带入m1, m 2 ∗ x + k 1 ∗ c ∗ y = k 2 ∗ c m_2*x+k_1*c*y=k_2*c m2x+k1cy=k2c,

m 2 ∗ x = c ( k 2 − k 1 y ) m_2*x=c(k_2-k_1y) m2x=c(k2k1y),因为m2不含因子c,又 m 2 ∗ x m_2*x m2x有因子c,那只能是x含因子c,又m1含因子c,那么 g c d ( m 1 , x ) = c gcd(m_1,x)=c gcd(m1,x)=c,与前述gcd(m1,x)=1矛盾。

因此式2成立。

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

得证。

综上
m ( p − 1 ) ( q − 1 )   m o d   n = 1 m^{(p-1)(q-1)}\space mod\space n=1 m(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、付费专栏及课程。

余额充值