大佬的原文更详细,本人菜鸟记的笔记有瑕疵
一. RSA简介:
RSA是公钥密码体制,是一种使用不同的加密密钥与解密密钥的加密方式,是一种算法,广泛用于现代通讯加密。
RSA涉及三个参数,n,e,d,其中n,d是私钥,n,e是公钥n是两个素数乘积,两个素数一般用p,q表示,e是一个素数,一般选择两个大素数p和q,计算出模数N = p * q,然后计算φ(N) = (p−1) * (q−1) ,即N的欧拉函数,然后选择一个e (1<e<φ(N)),且e和φN互素,取e的模反数为d(逆元)
计算方法: e * d ≡ 1 (mod φ(N))
对明文m进行加密:c=m^e%N : c = pow(m, e, N),得到的c即为密文
对密文c进行解密:m=c^d%N : m = pow(c, d, N),得到的m即为明文
私钥d:
d=gmpy2.invert(e,(p-1)*(q-1)) (python中的gmpy2库)
二. 算法原理
1. 费马小定理:
p为素数,则a^(p-1)=1%p
dp=d%(p-1)
dq=d%(q-1)
d=dp+k(p-1)=dq+k(q-1)
2. 欧拉定理:
a. 欧拉函数:
任意给定正整数n,计算在小于等于n的正整数之中,有多少个与n构成互质关系?计算这个值 的方法就叫做欧拉函数,以φ(n)表示.
在RSA算法中,欧拉函数对以下定理成立:
1.如果n可以分解成两个互质的整数之积,即n=p×q,则有:φ(n)=φ(pq)=φ( p )φ( q );
2.当p为质数,φ( p )=p-1
所以有φ(n)=(p-1)(q-1)
b. 欧拉定理与模反元素
“欧拉定理”指的是:
如果两个正整数a和n互质,则n的欧拉函数φ(n)可以让下面的等式成立:
a^φ(n)≡1(modn)
也就是说,a的φ(n)次方被n除的余数为1
模反元素的推导过程如下:
根据欧拉定理,有:
a^φ(n) = a × a^(φ(n)−1)≡1%n
令b=a^(φ(n)−1),得:
ab≡1%n
b就是a的模反元素
所以,如果两个正整数a和n互质,那么一定可以找到整数b使得ab-1被n整除,或者说ab被n除的余数是1,所以求私钥d的公式:d*e≡1%(p-1)(q-1),其中{φ(n) = (p-1)(q-1),φ(n) 与e互质,k为正整数}。
推导公式:d*e≡1mod φ(n)
可得:(d*e-1) / φ(n) =k
可化为:d= (k*φ(n)+1)/e
#已知 p,q,dp,dq,c求m的算法:
import gmpy2
I = gmpy2.invert(q,p)
mp = pow(c,dp,p)
mq = pow(c,dq,q) #求幂取模运算
m = (((mp-mq)*I)%p)*q+mq #求明文公式
print(hex(m)) #转为十六进制
3. 模运算
模运算与基本四则运算有些相似,但是除法除外。其规则如下:
(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)%p = (a + (b + c) % p) % p
((a * b) % p * c) %p= (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
重要定理:
若 a ≡ b (mod p),则对于正整数 c,都有(a**c) ≡ (b**c) (mod p)
若 a ≡ b (mod p),则对于任意的 c,都有(a + c) ≡ (b + c) (mod p)
若 a ≡ b (mod p),则对于任意的 c,都有(a * c) ≡ (b * c) (mod p)
如果ac≡bc (mod m),且c和m互质,则a≡b (mod m)。 '≡'是数论中表示同余的符号
同余的定义如下:给定一个正整数m,如果两个整数a和b满足a - b能被m整除,即(a - b)modm=0,
ps:88 = 12 ·7 + 4 因此88 ≡ 4 mod 12
那么就称整数a与b对模m同余,记作a ≡ b ( mod m),同时可成立a mod m = b
[理解:当且仅当c和m互质,c^-1存在,等式左右可同乘模逆。]
如果a≡b (mod m),a≡b (mod n),且n和m互质,则a≡b (mod mn)
若 a ≡ b (mod p),c ≡ d (mod p),则
(a + c) ≡ (b + d) (mod p)
(a - c) ≡ (b - d) (mod p)
(a * c) ≡ (b * d) (mod p)
(a / c) ≡ (b / d) (mod p)
除法规则:
在模n意义下,a/b不再仅仅代表这两个数相除,而是指 a+k1*n 和 b+k2*n这两个组数中任意两个相除,使商为整数,因此也就可以理解,除以一个数等价于乘以它的逆
a/b ≡ c(mod n) <=> a ≡ c*(b^-1) (mod n),其中b模n的逆记作b的负一次方。
逆元:
a mod p的逆元便是可以使 a * a' mod p = 1 的最小a'。
4.拓展欧几里得原理
对于互素的e1,e2:
e1*s1+e2*s2=gcd(e1,e2)=1
m^(e1*s1)*m^(e2*s2)=m^1=(c1^s1)*(c2^s2)
推导过程:
式1(加密):c=m^e%N
式2(解密):m=c^d%N
式1带入式2: m=(m^e%N)^d%N
需要证明 ;m==(m^e%N)^d%N
=> (m^e%N)^d%N => (m^e)^d%N # 模运算: a ^ b % p = (a % p) ^ d % p
=> m^(e*d)%N #幂的乘方,底数不变,指数相乘
=> 将 e * d ≡ 1 (mod φ(N)) 即 e * d = K * φ(N) + 1,K为任意正整数,代入得:(m^(K*φ(N)+1))%N
=> (m^(K*φ(N)*m^1)%N # 同底数相乘,指数相加
=> (m^(K*φ(N)*m)%N
=> ((m^φ(N)^K%N*m)%N # 幂的乘方,底数不变,指数相乘
=> ((m^φ(N)^K%N*m%N)%N # (a * b) % p = (a % p * b % p) % p
=> ((m^φ(N)%N)^K%N*m%N)%N # a ^ b % p = ((a % p) ^ b) % p
=> (1^K%N*m%N)%N # 根据欧拉定理:a^φ(n)≡1 mod n 即 a^φ(n) mod n = 1
=> (m%N)%N # 1^K%N=1
=> (m%N)%N
=> (m%N)^1%N
=> (m^1)%N # a ^ b % p = ((a % p) ^ b) % p
=> m%N
=> m #因为 m < N