RSA加密数学原理详解
此文力争用最简明的语言,最详细的算式阐明 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()
g c d ( a , b ) = a 与 b 的最大公因数 gcd(a,b)=a与b的最大公因数 gcd(a,b)=a与b的最大公因数
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方法如下
c
=
m
e
m
o
d
n
c=m^e\bmod n
c=memodn
解密 已知d、n时 ,将密文c解密为明文方法如下
m
=
c
d
m
o
d
n
m=c^d\bmod n
m=cdmodn
数学原理
欧拉函数 φ(n)的计算
定义:φ(n) 表示在小于等于 n 的正整数之中,与 n 构成互质关系的数的个数。
如果 n = p * q,p 与 q 均为质数,则
φ
(
n
)
=
φ
(
p
q
)
=
φ
(
p
−
1
)
φ
(
q
−
1
)
=
(
p
−
1
)
(
q
−
1
)
φ(n) = φ(pq)= φ(p - 1)φ(q - 1) = (p - 1)(q - 1)
φ(n)=φ(pq)=φ(p−1)φ(q−1)=(p−1)(q−1)
明白了对于任意数n的φ(n)的计算方法即可得出上述结论
对于任意数n的φ(n)的计算
再说一遍:φ(n) 表示在小于等于 n 的正整数之中,与 n 构成互质关系的数的个数。
1~N共有N个数,去掉其中N的因数,剩下的就是与 n 构成互质关系的数。由此即可求出φ(n) 。
先对N进行质因数分解:
N
=
p
1
c
1
p
2
c
2
p
3
c
3
⋯
p
m
c
m
N=p_1^{c_1} p_2^{c_2} p_3^{c_3} \cdots p_m^{c_m}
N=p1c1p2c2p3c3⋯pmcm
1~N中,任一质数p的倍数的个数为[N/p]取整,另一质数q的倍数的个数为[N/q]取整。
1~N中除去p与q的倍数。剩下的,与 n 构成互质关系的数的,个数为
N
−
N
p
−
N
q
+
N
p
q
=
N
⋅
(
1
−
1
p
)
(
1
−
1
q
)
N-\frac{N}{p}-\frac{N}{q}+\frac{N}{p q}=N \cdot\left(1-\frac{1}{p}\right)\left(1-\frac{1}{q}\right)
N−pN−qN+pqN=N⋅(1−p1)(1−q1)
PS: 因为pq的倍数被多去了一次,所以要加上[N/pq]取整。使用了容斥原理。
由质因数分解的定义可得,N的全部因数为
p
1
p
2
p
3
⋯
p
m
p_1 p_2 p_3 \cdots p_m
p1p2p3⋯pm
有
φ
(
N
)
=
N
−
∑
i
=
1
m
N
p
i
+
∑
1
≤
i
<
j
≤
m
N
p
i
p
j
−
∑
1
≤
i
<
j
<
k
≤
m
N
p
i
p
j
p
k
+
⋯
+
(
−
1
)
m
+
1
N
p
1
p
2
⋯
p
m
\begin{aligned} & \varphi(N)=N-\sum_{i=1}^m \frac{N}{p_i}+\sum_{1 \leq i<j \leq m} \frac{N}{p_i p_j}-\sum_{1 \leq i<j<k \leq m} \frac{N}{p_i p_j p_k}+\cdots +(-1)^{m+1} \frac{N}{p_1 p_2 \cdots p_m} \end{aligned}
φ(N)=N−i=1∑mpiN+1≤i<j≤m∑pipjN−1≤i<j<k≤m∑pipjpkN+⋯+(−1)m+1p1p2⋯pmN
化简得
φ
(
N
)
=
N
⋅
∏
i
=
1
m
(
1
−
1
p
i
)
\varphi(N)=N \cdot \prod_{i=1}^m\left(1-\frac{1}{p_i}\right)
φ(N)=N⋅i=1∏m(1−pi1)
上述方法的python实现:
def 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 res
python按欧拉函数定义计算任意数的欧拉函数
import 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的逆元存的冲要条件就是
g
c
d
(
e
,
m
)
=
1
gcd(e,m)=1
gcd(e,m)=1
证明则需要使用 辗转相除法 的知识,见下文
辗转相除法
也叫欧几里得算法,对于e、φ(n)有s、d,有下式
gcd
(
Φ
(
n
)
,
e
)
=
s
⋅
Φ
(
n
)
+
d
⋅
e
\operatorname{gcd}(\Phi(n), e)=s \cdot \Phi(n)+d \cdot e
gcd(Φ(n),e)=s⋅Φ(n)+d⋅e
当 gcd(e,φ(n))=1时,上式为
1
=
s
⋅
Φ
(
n
)
+
d
⋅
e
1=s \cdot \Phi(n)+d \cdot e
1=s⋅Φ(n)+d⋅e
可写成下式,后文的证明需要使用此式
d
⋅
e
=
1
+
s
⋅
Φ
(
n
)
d \cdot e=1+s \cdot \Phi(n)
d⋅e=1+s⋅Φ(n)
证明解密是加密的逆过程
当我们知道d、n可对密文c进行如下操作得到明文m。
证明解密是加密的逆过程即证明下式成立
m
=
c
d
m
o
d
n
m=c^d\bmod n
m=cdmodn
证:
考虑到
c
=
m
d
m
o
d
n
=
(
c
d
m
o
d
n
)
e
m
o
d
n
c=m^d \bmod n=(c^d \bmod n)^e\bmod n
c=mdmodn=(cdmodn)emodn
对于c可进行如下代换
c
=
(
m
e
+
k
1
n
)
c=(m^e+k_1 n)
c=(me+k1n)
将上式带入后有
右式
=
c
d
m
o
d
n
=
(
m
d
+
k
1
n
)
d
m
o
d
n
右式=c^d\bmod n=(m^d+k_1 n)^d\bmod n
右式=cdmodn=(md+k1n)dmodn
右式
=
(
∑
i
+
j
=
d
m
i
e
(
k
1
n
)
j
)
m
o
d
n
右式=(\sum_{i+j=d} m^{ie} (k_1 n)^j)\bmod n
右式=(i+j=d∑mie(k1n)j)modn
= ( m e d ) m o d n =(m^{ed})\bmod n =(med)modn
对于ed有下式
d
⋅
e
=
1
+
s
⋅
Φ
(
n
)
d \cdot e=1+s \cdot \Phi(n)
d⋅e=1+s⋅Φ(n)
带入右式有
右式
=
(
m
e
d
)
m
o
d
n
=
m
m
s
⋅
Φ
(
n
)
m
o
d
n
右式=(m^{ed})\bmod n=mm^{s \cdot \Phi(n)}\bmod n
右式=(med)modn=mms⋅Φ(n)modn
其中,由快速幂取模(后文有解释)有
m
s
⋅
Φ
(
n
)
m
o
d
n
=
∏
i
=
1..
s
(
m
Φ
(
n
)
m
o
d
n
)
m
o
d
n
m^{s \cdot \Phi(n)}\bmod n=\prod_{i=1..s}(m^{\Phi(n)}\bmod n) \bmod n
ms⋅Φ(n)modn=i=1..s∏(mΦ(n)modn)modn
欧拉定理(后文有解释)得出
m
φ
(
n
)
m
o
d
n
=
1
m^{\varphi(n)}\bmod n=1
mφ(n)modn=1
带入后右式有
右式
=
m
⋅
1
m
o
d
n
=
m
m
o
d
n
右式=m\cdot 1 \bmod n=m\bmod n
右式=m⋅1modn=mmodn
由于0≤m<n则右式有
右式
=
m
m
o
d
n
=
m
右式=m\bmod n=m
右式=mmodn=m
证毕
证明加密是解密的逆过程同理可证
附录
辗转相除法
欧几里得算法,也称为辗转相除法,是一种计算两个整数最大公约数的算法。以下是对该算法的证明。
首先,欧几里得算法是基于以下的定理:
定理:对于任意的两个整数a和b (假设a>b),如果我们用a除以b,得到的余数是r(即a=kb+r),那么a和b的最大公约数和b和r的最大公约数是相同的。即 gcd(a,b) = gcd(b,r)。
证明:
让我们首先假设d是a和b的一个公约数,那么我们有:
a
=
d
m
a = dm
a=dm
b
=
d
n
b = dn
b=dn
对于a和b的除法,我们可以得到:a = kb + r 通过替换a和b,我们得到:
d
m
=
(
d
n
)
k
+
r
dm = (dn)k + r
dm=(dn)k+r
简化得到
r
=
d
(
m
−
n
k
)
r = d(m - nk)
r=d(m−nk)
这表明d也是r的约数,所以我们可以说d也是b和r的公约数。
然后,假设我们有一个公约数d’,它是b和r的公约数,那么我们有:
b
=
d
′
m
′
b = d'm'
b=d′m′
r
=
d
′
n
′
r = d'n'
r=d′n′
我们可以将r重新写为。
r
=
a
−
k
b
=
d
m
−
(
d
′
m
′
)
k
=
d
(
m
−
m
′
k
)
r = a - kb = dm - (d'm')k = d(m - m'k)
r=a−kb=dm−(d′m′)k=d(m−m′k)
这表明d’也是a的约数。因此,d’是a和b的公约数。
因为我们没有对d或d’的选择做任何特殊的假设,所以我们可以得出结论,a和b的公约数集合和b和r的公约数集合是相同的。
因此,a和b的最大公约数等于b和r的最大公约数。
证毕
欧几里得算法就是基于这个定理,通过反复使用这个性质,每次用除数和余数代替原来的一对数,直到余数为0,此时的除数就是最初的两个数的最大公约数。
快速幂取模
公式:
(
a
×
b
)
m
o
d
m
=
(
(
a
m
o
d
m
)
×
(
b
m
o
d
m
)
)
m
o
d
m
(a×b)\bmod m = ((a\bmod m)×(b\bmod m))\bmod m
(a×b)modm=((amodm)×(bmodm))modm
证明:
这里,a、b和m都是整数,我们假设a和b的模除以m的结果分别为A和B,那么根据取模的定义我们有:
a
=
k
m
+
A
(
A
<
m
)
a = km + A \ (A < m)
a=km+A (A<m)
b
=
n
m
+
B
(
B
<
m
)
b = nm + B \ (B < m)
b=nm+B (B<m)
我们把这两个表达式带入到等式左边得到:
(
a
×
b
)
m
o
d
m
=
(
k
m
+
A
)
(
n
m
+
B
)
m
o
d
m
=
(
k
n
m
2
+
(
k
B
+
n
A
)
m
+
(
A
B
)
)
m
o
d
m
=
A
B
m
o
d
m
(a×b)\bmod m = (km+A)(nm+B)\bmod m= (knm² + (kB + nA)m + (AB))\bmod m=AB\bmod m
(a×b)modm=(km+A)(nm+B)modm=(knm2+(kB+nA)m+(AB))modm=ABmodm
然后,再看一下等式的右边:
(
(
a
m
o
d
m
)
×
(
b
m
o
d
m
)
)
m
o
d
m
=
(
A
B
)
m
o
d
m
((a\bmod m)×(b\bmod m))\bmod m=(AB)\bmod m
((amodm)×(bmodm))modm=(AB)modm
证毕
欧拉定理
对任何两个互质的正整数a, m(即 gcd(a,m) = 1),m>2,有m
a
φ
(
m
)
≡
1
(
m
o
d
m
)
a^{\varphi(m)} \equiv1(\bmod m)
aφ(m)≡1(modm)
1
=
a
φ
(
m
)
m
o
d
m
1=a^{\varphi(m)} \bmod m
1=aφ(m)modm
证明:
欧拉定理是数论中的一个重要定理,由著名数学家欧拉提出。欧拉定理可以表示为:如果a和n是互质的正整数,那么 a^(φ(n)) ≡ 1 (mod n),其中φ(n) 是欧拉φ函数,表示小于n并且与n互质的正整数数量。
证明:
首先,我们考虑一个集合S,这个集合包含了所有小于n并且与n互质的正整数。记φ(n)=m。
然后,我们考虑另一个集合T,它是由a乘以集合S的每个元素并且对n取模得到的。根据a和n互质,我们知道这样得到的集合T的元素是不重复的,并且与集合S一一对应。记作
S
=
{
x
1
,
x
2
,
.
.
.
,
x
m
}
S=\{ x_1,x_2,...,x_m\}
S={x1,x2,...,xm}
T
=
{
y
1
,
y
2
,
.
.
.
,
y
m
}
T=\{ y_1, y_2, ..., y_m\}
T={y1,y2,...,ym}
y i ≡ a x i ( m o d n ) y_i ≡ ax_i (\bmod n) yi≡axi(modn)
我们考虑集合S的元素的乘积与集合T的元素的乘积,并且都对n取模,由于S和T是一一对应的,它们的乘积应该相等,即有:
x
1
x
2
.
.
.
x
m
≡
y
1
y
2
.
.
.
y
m
(
m
o
d
n
)
≡
a
x
1
a
x
2
.
.
.
a
x
m
(
m
o
d
n
)
x_1 x_2 ... x_m ≡ y_1 y_2 ... y_m (\bmod n)≡ ax_1 ax_2 ... ax_m (\bmod n)
x1x2...xm≡y1y2...ym(modn)≡ax1ax2...axm(modn)
x
1
x
2
.
.
.
x
m
≡
a
m
x
1
x
2
.
.
.
x
m
(
m
o
d
n
)
x_1 x_2 ... x_m ≡ a^m x_1 x_2 ... x_m (\bmod n)
x1x2...xm≡amx1x2...xm(modn)
因为等式左边和n互质,我们可以得到:
1
≡
a
m
(
m
o
d
n
)
1 ≡ a^m (\bmod n)
1≡am(modn)
因为m=φ(n)
证毕
我是 UNEXPECTED 联合战队 的 Paddy,主攻Crypto。
接下来将持续为大家带来密码学中的数学知识分享。期待得到批评指正与交流讨论。
谨以此文,纪念米兰·昆德拉
Adieu. Kundera
我的文章会首先发布于知乎,欢迎您的关注