RSA加密
符号说明
MOD
此符号有两个含义 由于网上资料对此符号的混用,故特此说明
同余符号 给定正整数m,如果两个整数a和b满足a-b能被m整除,即m|(a-b),那么就称整数a与b对模m同余,记作a≡b(mod m)
取余符号 a mod b = c 表示整数a除以整数b所得余数为c
gcd()
RSA加解密方法
欲加密明文m
选择两个大质数p和q
计算n=p*q,安全要求n至少为1024位长
计算φ(n)=(p-1)(q-1)
选择公钥e,满足1≤e<φ(n),gcd(e,φ(n))=1 (gcd最大公约数)
选择私钥d,满足于e*d≡1(mod φ(n) )
加密 传递e、n给对方 ,加密明文m为c方法如下
解密 已知d、n时 ,将密文c解密为明文方法如下
数学原理
欧拉函数 φ(n)的计算
定义:φ(n) 表示在小于等于 n 的正整数之中,与 n 构成互质关系的数的个数。
如果 n = p * q,p 与 q 均为质数,则
明白了对于任意数n的φ(n)的计算方法即可得出上述结论
对于任意数n的φ(n)的计算
再说一遍:φ(n) 表示在小于等于 n 的正整数之中,与 n 构成互质关系的数的个数。
1~N共有N个数,去掉其中N的因数,剩下的就是与 n 构成互质关系的数。由此即可求出φ(n) 。
先对N进行质因数分解:
1~N中,任一质数p的倍数的个数为[N/p]取整,另一质数q的倍数的个数为[N/q]取整。
1~N中除去p与q的倍数。剩下的,与 n 构成互质关系的数的,个数为
PS: 因为pq的倍数被多去了一次,所以要加上[N/pq]取整。使用了容斥原理。
由质因数分解的定义可得,N的全部因数为
有
化简得
上述方法的python实现:
xxxxxxxxxxdef phi(n): res = n i = 2 while i * i <= n: if n % i == 0: res //= i res *= (i - 1) while n % i == 0: n //= i i += 1 if n > 1: res //= n res *= (n - 1) return respython按欧拉函数定义计算任意数的欧拉函数
xxxxxxxxxximport fractions
def phi(n): amount = 0 for k in range(1, n + 1): if fractions.gcd(n, k) == 1: amount += 1 return amount公钥私钥的生成
公钥的选择条件 gcd(e,φ(n))=1 保证了私钥d的存在,既e的逆元存在模φ(n)
为什么呢,需要理解 模的逆元 这个概念
模的逆元
定义:模m意义下,e与m互质时,存在k, 有de=km+1既de≡1(mod m ),则称d为e的逆元
逆元存在的充要条件
模m意义下,e的逆元存的冲要条件就是
证明则需要使用 辗转相除法 的知识,见下文
辗转相除法
也叫欧几里得算法,对于e、φ(n)有s、d,有下式
当 gcd(e,φ(n))=1时,上式为
可写成下式,后文的证明需要使用此式
证明解密是加密的逆过程
当我们知道d、n可对密文c进行如下操作得到明文m。 证明解密是加密的逆过程即证明下式成立
证:
考虑到
对于c可进行如下代换
将上式带入后有
对于ed有下式
带入右式有
其中,由快速幂取模(后文有解释)有
欧拉定理(后文有解释)得出
带入后右式有
由于0≤m<n则右式有
证毕
证明加密是解密的逆过程同理可证
快速幂取模
公式:
证明:
这里,a、b和m都是整数,我们假设a和b的模除以m的结果分别为A和B,那么根据取模的定义我们有:
我们把这两个表达式带入到等式左边得到:
然后,再看一下等式的右边:
证毕
欧拉定理
对任何两个互质的正整数a, m(即 gcd(a,m) = 1),m>2,有m
证明:
欧拉定理是数论中的一个重要定理,由著名数学家欧拉提出。欧拉定理可以表示为:如果a和n是互质的正整数,那么 a^(φ(n)) ≡ 1 (mod n),其中φ(n) 是欧拉φ函数,表示小于n并且与n互质的正整数数量。
证明:
首先,我们考虑一个集合S,这个集合包含了所有小于n并且与n互质的正整数。记φ(n)=m。
然后,我们考虑另一个集合T,它是由a乘以集合S的每个元素并且对n取模得到的。根据a和n互质,我们知道这样得到的集合T的元素是不重复的,并且与集合S一一对应。记作
我们考虑集合S的元素的乘积与集合T的元素的乘积,并且都对n取模,由于S和T是一一对应的,它们的乘积应该相等,即有:
因为等式左边和n互质,我们可以得到:
因为m=φ(n)
证毕