满足以下公式
加 密 : c i = p i + k i ( m o d 26 ) 解 密 : p i = c i − k i ( m o d 26 ) 加密:c_i = p_i + k_i (mod26)\\ 解密:p_i = c_i - k_i(mod 26) 加密:ci=pi+ki(mod26)解密:pi=ci−ki(mod26)
什么意思呢,我们刚刚不是将字母转成数字了吗,我们来运算一下,密文的第一个字母为(13 + 18) % 26 = 5 -> F
第二个字母为 (18 + 22) % 26 = 14 -> O
…
最终的密文为FOHWLB
选择一个小于 φ(N)的整数 e,使 e 和 φ(N) 互质。并求得 e 关于 φ(N) 的模反元素,命名为 d,有 ed≡1(modφ(N))
将 p和 q的记录销毁,此时,(N,e)是公钥,(N,d) 是私钥。
消息加密
c = m^e mod N
m = c^d mod N 一些数学名词的解释
质数(素数):就是它只能被1和它本身整除的数
欧拉函数φ(N):就等于(p-1)*(q-1)
模运算
模运算与基本四则运算有些相似,但是除法除外。其规则如下:
(a + b) % p = (a % p + b % p) % p
(a - b) % p = (a % p - b % p) % p
(a * b) % p = (a % p * b % p) % p
a ^ b % p = ((a % p) ^ b) % p
结合律
((a + b) % p + c) = (a + (b + c) % p) % p
((a * b) % p * c) = (a * (b * c) % p) % p
交换律
(a + b) % p = (b + a) % p
(a * b) % p = (b * a) % p
分配律
(a + b) % p = (a % p + b % p) % p
((a + b) % p * c) % p = ((a * c) % p + (b * c) % p
模逆元
逆元是指在数学领域群G中任意一个元 a,都在G中有唯一的逆元a’,具有性质 a · a’ = a’ · a = e ( · 为该群中定义的运算)。其中,e为该群的单位元。逆元其实是加法中的相反数以及乘法中的倒数的拓展思想。
在模运算中,单位元便是1。
a mod p的逆元便是可以使 a * a’ mod p = 1 的最小a’。
因为 b’ 为 b 的逆元,b * b’ mod p = 1;
所以 (a / b) mod p = (a * b’) mod p ,但要求a | b;
这样我们便可以应用 (a * b) % p = (a % p * b % p) % p 这一条性质缩小中间运算结果了。
错误版本!!!
1234 ∗ d = ( 5 − 1 ∗ ( 1234 − 246 ∗ 5 ) ) m o d p h i n = ( 5 − 1234 + 246 ∗ 5 ) m o d p h i n = ( 247 ∗ 5 − 1234 ) m o d p h i n = [ 247 ∗ ( 11111 − 9 ∗ 1234 ) − 1234 ] m o d p h i n = ( 11111 ∗ 247 − 9 ∗ 247 ∗ 1234 − 1234 ) m o d p h i n = ( 11111 ∗ 247 − 2224 ∗ 1234 ) m o d p h i n ∵ p h i n = 11111 , 11111 ∗ 247 m o d 11111 = 0 ∴ 1234 ∗ d = − 2224 ∗ 1234 m o d 11111 这 里 我 写 错 了 兄 弟 们 ! ! 最 后 一 步 是 对 − 2224 取 模 d = 2224 是 错 的 ! ! \begin{aligned} 1234*d &= (5-1*(1234-246*5))\ mod \ phin\\ &=(5-1234+246*5)\ mod \ phin\\ &=(247*5 - 1234) \ mod \ phin\\ &=[247*(11111-9*1234) - 1234] \ mod \ phin\\ &=(11111*247-9*247*1234-1234) \ mod \ phin\\ &=(11111*247 - 2224*1234) \ mod \ phin\\ &\because phin\ = 11111,11111*247 \ mod \ 11111 = 0\\ &\therefore \ 1234*d= -2224*1234 \ mod \ 11111\\ &这里我写错了兄弟们!!\\ &最后一步是对-2224取模\\ d &=2224是错的!! \end{aligned} 1234∗dd=(5−1∗(1234−246∗5)) mod phin=(5−1234+246∗5) mod phin=(247∗5−1234) mod phin=[247∗(11111−9∗1234)−1234] mod phin=(11111∗247−9∗247∗1234−1234) mod phin=(11111∗247−2224∗1234) mod phin∵phin =11111,11111∗247 mod 11111=0∴ 1234∗d=−2224∗1234 mod 11111这里我写错了兄弟们!!最后一步是对−2224取模=2224是错的!!
负数取模
x m o d y = x − y ∗ [ x y ] ( 向 下 取 整 ) = − 2224 − 11111 ∗ ( − 2224 11111 ) = − 2224 + 11111 = 8887 ∴ d = 8887 \begin{aligned} x \ mod \ y &= x - y * [\frac{x}{y}](向下取整)\\ &= -2224 - 11111 * (\frac{-2224}{11111})\\ &= -2224 + 11111\\ &= 8887\\ \therefore d&=8887 \end{aligned} x mod y∴d=x−y∗[yx](向下取整)=−2224−11111∗(11111−2224)=−2224+11111=8887=8887
感谢同学指出的错误 如何计算m^emod n
使用快速幂取模算法,原理我没研究过,就不班门弄斧了,以老师ppt上的例子为例
采用快速取模指数算法求c1=m1^e(mod n) =104^13 mod 2537 的值?
复制代码
我们来解读这段代码
第一轮代码
t = 0 , c = 1 , i = 3 t = t ∗ 2 ( t = 0 ) c = c ∗ c m o d 2537 ( c = 1 ) i f b 3 = = 1 ( 满 足 ) : t = t + 1 ( t = 1 ) c = 1 ∗ 104 m o d 2537 ( c = 104 ) \begin{aligned} &t=0,c=1,i=3\\ &t = t*2\ (t=0)\\ &c = c*c \ mod \ 2537 \ (c=1)\\ &if \ b_3 == 1(满足):\\ &t = t+1 \ (t=1)\\ &c = 1*104\ mod\ 2537\ (c=104)\\ \end{aligned} t=0,c=1,i=3t=t∗2 (t=0)c=c∗c mod 2537 (c=1)if b3==1(满足):t=t+1 (t=1)c=1∗104 mod 2537 (c=104)
第二轮代码
t = 1 , c = 104 , i = 2 t = t ∗ 2 ( t = 2 ) c = c ∗ c m o d 2537 ( c = 668 ) i f b 2 = = 1 ( 满 足 ) : t = t + 1 ( t = 3 ) c = 668 ∗ 104 m o d 2537 ( c = 973 ) \begin{aligned} &t=1,c=104,i=2\\ &t = t*2\ (t=2)\\ &c = c*c \ mod \ 2537 \ (c=668)\\ &if \ b_2 == 1(满足):\\ &t = t+1 \ (t=3)\\ &c = 668*104\ mod\ 2537\ (c=973)\\ \end{aligned} t=1,c=104,i=2t=t∗2 (t=2)c=c∗c mod 2537 (c=668)if b2==1(满足):t=t+1 (t=3)c=668∗104 mod 2537 (c=973)
第三轮代码
t = 3 , c = 973 , i = 1 t = t ∗ 2 ( t = 6 ) c = c ∗ c m o d 2537 ( c = 428 ) i f b 1 = = 1 ( 不 满 足 ) : \begin{aligned} &t=3,c=973,i=1\\ &t = t*2\ (t=6)\\ &c = c*c \ mod \ 2537 \ (c=428)\\ &if \ b_1 == 1(不满足):\\ \end{aligned} t=3,c=973,i=1t=t∗2 (t=6)c=c∗c mod 2537 (c=428)if b1==1(不满足):
第四轮代码
t = 6 , c = 428 , i = 1 t = t ∗ 2 ( t = 12 ) c = c ∗ c m o d 2537 ( c = 520 ) i f b 1 = = 1 ( 满 足 ) : t = t + 1 ( t = 13 ) c = 520 ∗ 104 m o d 2537 ( c = 803 ) \begin{aligned} &t=6,c=428,i=1\\ &t = t*2\ (t=12)\\ &c = c*c \ mod \ 2537 \ (c=520)\\ &if \ b_1 == 1(满足):\\ &t = t+1 \ (t=13)\\ &c = 520*104\ mod\ 2537\ (c=803)\\ \end{aligned} t=6,c=428,i=1t=t∗2 (t=12)c=c∗c mod 2537 (c=520)if b1==1(满足):t=t+1 (t=13)c=520∗104 mod 2537 (c=803)
此时代码运行完毕,c就是我们最终的结果803,我们用python验证一下
正确的。 RSA算法的安全性
RSA算法的安全性是基于大整数分解的难题,所以攻击方式也很简单粗暴,因为公钥是公开的,n = p*q,e已知,e * d = 1 mod phiN,所以我们只要能分解N为两个素数p,q,就能破解出d,以下介绍几种常见的攻击方式(考试应该不会考,感兴趣的同学可以看看)
<ol> 暴力分解
可以使用yafu这款工具,使用方式如下: