Title: RSA 加密算法的基础数论、基本原理与 Python 实现
文章目录
- 前言
- I. 数学原理
- 1. 整数环
- 2. 单位元
- 3. 欧拉定理
- II. 算法原理
- 1. 扩展欧几里得算法
- 2. RSA 非对称加密算法
- III. 算法实现
- 1. 源代码
- 2. 测试结果
- 总结
- 参考文献
前言
1977 年美国 MIT 的三位数学家 Ronald L. Rivest、Adi Shamir 和 Leonard M. Adleman 一起提出了著名的非对称加密算法 —— RSA 算法. RSA 算法利用计算机无法快速实现大数的质因数分解这一事实 (当前也还成立), 确保该算法的安全性.
对 RSA 加密算法其中的数学原理感兴趣, 故整理并学习一下 (“copycat”) , 最后用 python 简单实现了该算法.
I. 数学原理
1. 整数环
RSA 算法全部建立在 Module Arithmetic (模运算)[1]的基础上.
[I-1-1] 同余和模运算 Congruence and Module Arithmetic:
For a positive integer m m m and integers a a a and b b b, we follow Gauss and write
a ≡ b ( mod m ) a \equiv b \ \ (\text{mod}\ \ m) a≡b (mod m)
to mean that a a a and b b b have the same remainder upon division by m m m.In words, the notation is read as a a a is congruent to b b b modulo m m m.
The expression a ≡ b ( mod m ) a \equiv b\ (\text{mod}\ m) a≡b (mod m) is called a congruence, and m m m is the modulus of the congruence.
[例]
12
≡
26
(
mod
7
)
12 \equiv 26 \ \ (\text{mod}\ 7)
12≡26 (mod 7)
[I-1-2] 环 Ring:
A ring R {R} R is a set equipped with binary operations + + + and × \times × and elements 0 , 1 ∈ R 0, 1 \in R 0,1∈R such that R R R is an abelian group under + + +, and for all a , b , c ∈ R a, b, c \in R a,b,c∈R we have
Multiplicative identity: 1 × a = a × 1 = a 1\times a = a\times 1 = a 1×a=a×1=a
Multiplicative associativity: ( a × b ) × c = a × ( b × c ) (a\times b)\times c = a\times (b\times c) (a×b)×c=a×(b×c)
Left distributivity: a × ( b + c ) = a × b + a × c a\times (b + c) = a\times b + a\times c a×(b+c)=a×b+a×c
[例]
集合
Z
3
=
{
0
,
1
,
2
}
\mathbb{Z}_3 = \{0,1,2\}
Z3={0,1,2}, 装备了
+
+
+ 和
×
\times
× 运算
+
0
1
2
0
0
1
2
1
1
2
0
2
2
0
1
×
0
1
2
0
0
0
0
1
0
1
2
2
0
2
1
\begin{array}{c|ccc} + &0 &1 &2 \\ \hline 0 &0 &1 &2 \\ 1 &1 &2 &0 \\ 2 &2 &0 &1 \end{array} \qquad\qquad\qquad \begin{array}{c|ccc} \times &0 &1 &2 \\ \hline 0 &0 &0 &0 \\ 1 &0 &1 &2 \\ 2 &0 &2 &1 \end{array}
+012001211202201×012000010122021
0
0
0 是加法 (
+
+
+) 恒等元. 集合中每个元素都有加法逆,
0
+
0
=
0
0+0=0
0+0=0 及
1
+
2
=
2
+
1
=
0
1+2 = 2+1 = 0
1+2=2+1=0. 加法满足交换律.
1 是乘法 ( × \times ×) 恒等元. 取数值可验证乘法结合律和左结合律.
故集合 Z 3 \mathbb{Z}_3 Z3 是环.
[I-1-3] 模算数环 Modular Arithmetic Rings[2]:
Let m ∈ Z m \in \mathbb{Z} m∈Z: m ≥ 2 m ≥ 2 m≥2.
Let Z m \mathbb{Z}_m Zm be the set of integers modulo m m m.
Let + m +_m +m and × m \times_m ×m denote addition modulo m m m and multiplication modulo m m m, respectively.
The algebraic structure ( Z m , + m , × m ) (\mathbb{Z}_m,+_m,\times_m) (Zm,+m,×m) is the ring of integers modulo m m m.
[例] 同上
现在在不引起歧义情况下, a × b a\times b a×b 中乘法符号 × \times × 可省略表示.
有时为了特别强调某一对象 a a a 是环 Z m \mathbb{Z}_m Zm 中的元素, 可记作 [ a ] m [a]_m [a]m, 如 Z 5 \mathbb{Z}_5 Z5 中的 3 3 3 记作 [ 3 ] 5 [3]_5 [3]5.
其实 Z m \mathbb{Z}_m Zm 中的元素 [ a ] m [a]_m [a]m 也可以看做是模运算等价类, 即 [ a ] m = { … , a − 2 m , a − m , a , a + m , a + 2 m , … } [a]_m = \{\ldots,a-2m,a-m,a,a+m, a+2m, \ldots\} [a]m={…,a−2m,a−m,a,a+m,a+2m,…}.
2. 单位元
[I-2-1] 环中的单位元 Ring Units:
A multiplicative inverse of a number n n n is a number m m m with the property that n × m = 1 n \times m = 1 n×m=1.
A number in a ring is called a unit in that ring if it has a multiplicative inverse in the ring.
[例] 整数环
Z
6
\mathbf{Z}_6
Z6 中含元素
{
0
,
1
,
2
,
3
,
4
,
5
}
\{0,1,2,3,4,5\}
{0,1,2,3,4,5}, 构建乘法表
×
0
1
2
3
4
5
0
0
0
0
0
0
0
1
0
1
2
3
4
5
2
0
2
4
0
2
4
3
0
3
0
3
0
3
4
0
4
2
0
4
2
5
0
5
4
3
2
1
\begin{array}{c|cccccc} \times &0 &1 &2 &3 &4 &5 \\ \hline 0 &0 &0 &0 &0 &0 &0 \\ 1 &0 &{\color{darkred}{1}} &2 &3 &4 &5 \\ 2 &0 &2 &4 &0 &2 &4 \\ 3 &0 &3 &0 &3 &0 &3 \\ 4 &0 &4 &2 &0 &4 &2 \\ 5 &0 &5 &4 &3 &2 &{\color{darkred}{1}} \end{array}
×012345000000010123452024024303030340420425054321
其中 1 的乘法逆是 1 本身, 而 5 的乘法逆是 5 本身. 故 1 和 5 都是该整数环中的 unit.
[例] 整数环
Z
7
\mathbf{Z}_7
Z7 中含元素
{
0
,
1
,
2
,
3
,
4
,
5
,
6
}
\{0,1,2,3,4,5, 6\}
{0,1,2,3,4,5,6}, 构建乘法表
×
0
1
2
3
4
5
6
0
0
0
0
0
0
0
0
1
0
1
2
3
4
5
6
2
0
2
4
6
1
3
5
3
0
3
6
2
5
1
4
4
0
4
1
5
2
6
3
5
0
5
3
1
6
4
2
6
0
6
5
4
3
2
1
\begin{array}{c|ccccccc} \times &0 &1 &2 &3 &4 &5 &6 \\ \hline 0 &0 &0 &0 &0 &0 &0 &0\\ 1 &0 &{\color{darkred}{1}} &2 &3 &4 &5 &6\\ 2 &0 &2 &4 &6 &{\color{darkred}{1}} &3 &5\\ 3 &0 &3 &6 &2 &5 &{\color{darkred}{1}} &4\\ 4 &0 &4 &{\color{darkred}{1}} &5 &2 &6 &3\\ 5 &0 &5 &3 &{\color{darkred}{1}} &6 &4 &2\\ 6 &0 &6 &5 &4 &3 &2 &{\color{darkred}{1}} \end{array}
×012345600000000101234562024613530362514404152635053164260654321
其中 1 的乘法逆是 1 本身, 2 的乘法逆是 4, 3 的乘法逆是 5, 4 的乘法逆是 2, 5 的乘法逆是 3, 6 的乘法逆是 6 本身. 故
{
1
,
2
,
3
,
4
,
5
,
6
}
\{1,2,3,4,5,6\}
{1,2,3,4,5,6} 都是该整数环中的 units.
[I-2-2] 单位元性质 A Property of Units:
Let a a a and m m m be positive integers with a < m a < m a<m. The element [ a ] m [a]_m [a]m is a unit in Z m \mathbb{Z}_m Zm if and only if gcd ( a , m ) = 1 \gcd(a, m) = 1 gcd(a,m)=1.
[证明]
充分性. 已知 [ a ] m [a]_m [a]m 是 Z m \mathbb{Z}_m Zm 的 unit, 并假设 gcd ( a , m ) = d \gcd(a,m)=d gcd(a,m)=d.
因为 [ a ] m [a]_m [a]m 是单位元, 故存在 [ b ] m ∈ Z m [b]_m \in \mathbb{Z}_m [b]m∈Zm, 使得 a b = 1 ( mod m ) ab = 1 \ (\text{mod}\ m) ab=1 (mod m).
等价地, 存在
k
∈
Z
k\in \mathbb{Z}
k∈Z 使得
a
b
=
1
+
m
k
⇒
a
b
−
m
k
=
1
ab = 1+ mk \ \Rightarrow\ ab - mk = 1
ab=1+mk ⇒ ab−mk=1
又因为
gcd
(
a
,
m
)
=
d
\gcd (a, m) = d
gcd(a,m)=d, 故
d
∣
a
d\ |\ a
d ∣ a 及
d
∣
m
d\ \vert \ m
d ∣ m. 可以推得
d
∣
(
a
b
−
m
k
)
d \ | \ (ab-mk)
d ∣ (ab−mk), 进一步可知
d
∣
1
d \ | \ 1
d ∣ 1.
得到结论 gcd ( a , m ) = 1 \gcd(a, m) = 1 gcd(a,m)=1 (即 a a a 与 m m m 互质).
必要性. 已知
gcd
(
a
,
m
)
=
1
\gcd(a, m) = 1
gcd(a,m)=1, 根据裴蜀定理 ( Bézout’s Lemma) 可知存在整数
r
,
s
∈
Z
r,s \in \mathbb{Z}
r,s∈Z 使得
a
r
+
m
s
=
1
⇒
a
r
≡
1
(
mod
m
)
ar+ms=1\\ \Rightarrow \ ar \equiv 1 \ (\text{mod}\ m)
ar+ms=1⇒ ar≡1 (mod m)
又
∃
r
m
∈
Z
m
\exist r_m \in \mathbb{Z}_m
∃rm∈Zm, 使得
r
≡
r
m
(
mod
m
)
r \equiv r_m \ (\text{mod}\ m)
r≡rm (mod m), 即
r
=
r
m
+
l
m
r = r_m +lm
r=rm+lm. 上式有
a
(
r
m
+
l
m
)
≡
1
(
mod
m
)
⇒
a
r
m
≡
1
(
mod
m
)
a (r_m + lm) \equiv 1 \ (\text{mod} \ m)\\ \Rightarrow\ a r_m \equiv 1 \ (\text{mod}\ m)
a(rm+lm)≡1 (mod m)⇒ arm≡1 (mod m)
得到条件
[
a
]
m
[a]_m
[a]m 是环
Z
m
\mathbb{Z}_m
Zm 中的单位元 unit.
充要条件证明完毕.
[I-2-3] 相消性 Cancellation:
Let a a a and m m m be relatively prime integers, with m > 1 m > 1 m>1. If b b b and c c c are integers for which
a b ≡ a c ( mod m ) ab \equiv ac \ (\text{mod}\ m) ab≡ac (mod m)
then b ≡ c ( mod m ) b \equiv c (\text{mod}\ m) b≡c(mod m).In other words:
Suppose a a a is a unit in a ring Z m \mathbb{Z}_m Zm, and suppose that b b b and c c c are also in Z m \mathbb{Z}_m Zm. If a b = a c ab = ac ab=ac, then b = c b = c b=c.
[证明]
a
b
=
a
c
(
mod
m
)
⇒
a
b
−
a
c
=
0
(
mod
m
)
⇒
m
∣
a
b
−
a
c
⇒
m
∣
a
(
b
−
c
)
∵
gcd
(
a
,
m
)
=
1
∴
m
∣
b
−
c
∴
b
≡
c
(
mod
m
)
\begin{array}{cc} & ab=ac\ (\text{mod}\ m)\\ \Rightarrow& ab-ac = 0\ (\text{mod}\ m)\\ \Rightarrow& m \ \vert\ ab-ac \\ \Rightarrow& m \ \vert\ a(b-c) \\ \because& \gcd(a, m)=1\\ \therefore& m\ |\ b-c\\ \therefore& b\equiv c \ (\text{mod}\ m) \end{array}
⇒⇒⇒∵∴∴ab=ac (mod m)ab−ac=0 (mod m)m ∣ ab−acm ∣ a(b−c)gcd(a,m)=1m ∣ b−cb≡c (mod m)
3. 欧拉定理
[I-3-1] 欧拉函数 Euler ϕ \phi ϕ-Function
If m m m is a positive integer, set ϕ ( m ) \phi(m) ϕ(m) equal to the number of integers in the range from 1 1 1 to m m m that are relatively prime to m m m. That is
ϕ ( m ) = # { a ∈ Z ∣ 1 ≤ a ≤ m and gcd ( a , m ) = 1 } \phi(m)= \#\{a \in \mathbb{Z}\ \vert\ 1\leq a \leq m \ \text{and}\ \gcd(a,m)=1 \} ϕ(m)=#{a∈Z ∣ 1≤a≤m and gcd(a,m)=1}
In the case that m m m is prime, obtaining the value ϕ ( m ) = m − 1 \phi(m) = m − 1 ϕ(m)=m−1. That is
ϕ ( m ) = # { 1 , 2 , … , m − 1 } = m − 1 \phi(m)= \#\{1,2,\ldots, m-1\} = m-1 ϕ(m)=#{1,2,…,m−1}=m−1
The value of ϕ ( m ) \phi(m) ϕ(m) for m > 1 m > 1 m>1 can also be described as the number of units in Z m \mathbb{Z}_m Zm. If the number of units in Z m \mathbb{Z}_m Zm is noted as ∣ U m ∣ |U_m| ∣Um∣, then
ϕ ( m ) = ∣ U m ∣ \phi(m) = |U_m| ϕ(m)=∣Um∣
[例]
ϕ ( 1 ) = 1 \phi(1)=1 ϕ(1)=1, 因为 1 和任何正整数 (包括 1 本身) 都互质.
ϕ ( 2 ) = 1 \phi(2) = 1 ϕ(2)=1, 因为只有 1 与 2 互质, 大于 1 的整数与自身不互质.
ϕ ( 3 ) = 2 \phi(3)=2 ϕ(3)=2, 因为有 { 1 , 2 } \{1,2\} {1,2} 与 3 互质.
ϕ ( 4 ) = 2 \phi(4)=2 ϕ(4)=2, 因为有 { 1 , 3 } \{1,3\} {1,3} 与 4 互质.
ϕ ( 5 ) = 4 \phi(5)=4 ϕ(5)=4, 因为有 { 1 , 2 , 3 , 4 } \{1,2,3,4\} {1,2,3,4} 与 5 互质.
ϕ ( 6 ) = 2 \phi(6)=2 ϕ(6)=2, 因为有 { 1 , 5 } \{1,5\} {1,5} 与 6 互质.
ϕ ( 7 ) = 6 \phi(7)=6 ϕ(7)=6, 因为有 { 1 , 2 , 3 , 4 , 5 , 6 } \{1,2,3,4,5,6\} {1,2,3,4,5,6} 与 7 互质.
[说明]
事实上, Z m \mathbb{Z}_m Zm 中的所有 units 组成的集合 U m U_m Um 关于 × \times × 运算构成群. 因为
二元运算: 群乘法就是原来环中的乘法 (即模运算下的乘法)
单位元: 1
逆元: units 定义要求
封闭性: 已知 u u ′ ≡ 1 ( mod 1 ) uu^{'}\equiv 1\ (\text{mod}\ 1) uu′≡1 (mod 1), v v ′ ≡ 1 ( mod 1 ) vv^{'}\equiv 1\ (\text{mod}\ 1) vv′≡1 (mod 1) ⇒ \Rightarrow ⇒ ( u v ) ( v ′ u ′ ) ≡ 1 ( mod 1 ) (uv)(v^{'}u^{'})\equiv 1\ (\text{mod}\ 1) (uv)(v′u′)≡1 (mod 1)
结合律: 沿袭模运算中乘法结合律
群中元素的个数即为群的阶. 利用 “[I-2-2] 单位元性质 A property of Units” 就可以将欧拉函数和群中元素个数联系起来.
另外, ϕ ( m ) \phi(m) ϕ(m) 也称为 Totient Function (不知其翻译).
[I-3-2] 可乘性 Multiplicative Property
Let a a a and b b b be relatively prime positive integers. Then
ϕ ( a b ) = ϕ ( a ) ϕ ( b ) \phi(ab) = \phi(a) \phi(b) ϕ(ab)=ϕ(a)ϕ(b)
[非完全证明]
上述定理的完全和严格证明需要采用中国剩余定理与双射性质, 此处不展开.
此处只证明在 RSA 加密算法中用到的 “ a a a 和 b b b 为不同质数” 的情况.
全集 U = { m ∈ Z ∣ 1 ≤ m ≤ a b } U = \{m\in \mathbb{Z}\ \vert\ 1\leq m\leq ab\} U={m∈Z ∣ 1≤m≤ab}, 元素个数 ∣ U ∣ = a b |U|=ab ∣U∣=ab.
U U U 中能被 a a a 整除的元素集合 A = { x ∈ U ∣ ( a ∣ x ) } A= \{x\in U\ \vert\ (a|x)\} A={x∈U ∣ (a∣x)}, 即 { a , 2 a , … , ( b − 1 ) a , b a } \{a,2a,\ldots,(b-1)a,ba\} {a,2a,…,(b−1)a,ba}. 元素个数 ∣ A ∣ = b |A|=b ∣A∣=b.
U U U 中能被 b b b 整除的元素集合 B = { x ∈ U ∣ ( b ∣ x ) } B = \{x\in U \ \vert\ (b|x)\} B={x∈U ∣ (b∣x)}, 即 { b , 2 b , … , ( a − 1 ) b , a b } \{b,2b,\ldots,(a-1)b,ab\} {b,2b,…,(a−1)b,ab}. 元素个数 ∣ B ∣ = a |B|=a ∣B∣=a.
U U U 中能被 a a a 和 b b b 都整除 (即能被 a b ab ab 整除) 的元素集合 C = { x ∈ U ∣ ( a b ∣ x ) } C = \{x\in U \ \vert\ (ab|x)\} C={x∈U ∣ (ab∣x)}, 只有一个元素 { a b } \{ab\} {ab}. 故 ∣ C ∣ = 1 |C|=1 ∣C∣=1.
使用集合容斥原理可知, U U U 中既不能被 a a a 整除也不能被 b b b 整除的元素集合 D = U − A − B + C D = U - A -B +C D=U−A−B+C, 各集合之间的关系如图.
根据 “[I-3-1] 欧拉函数 Euler ϕ \phi ϕ-function” 中定义, ϕ ( a b ) \phi(ab) ϕ(ab) 是要找与 a b ab ab 互质的整数的个数.
“
a
a
a 和
b
b
b 为不同质数” 时,
ϕ
(
a
b
)
\phi(ab)
ϕ(ab) 就是找既不能被
a
a
a 整除又不能被
b
b
b 整除的整数个数.
ϕ
(
a
b
)
=
∣
D
∣
=
∣
U
∣
−
∣
A
∣
−
∣
B
∣
+
∣
C
∣
=
a
b
−
b
−
a
+
1
=
(
a
−
1
)
(
b
−
1
)
=
ϕ
(
a
)
ϕ
(
b
)
\begin{aligned} \phi(ab) &= |D| \\ &= |U| - |A| - |B| + |C|\\ &= ab - b - a + 1\\ & = (a-1)(b-1)\\ & = \phi(a) \phi(b) \end{aligned}
ϕ(ab)=∣D∣=∣U∣−∣A∣−∣B∣+∣C∣=ab−b−a+1=(a−1)(b−1)=ϕ(a)ϕ(b)
这样就证明了 “当
a
a
a 和
b
b
b 是不同的质数时,
ϕ
(
a
b
)
=
ϕ
(
a
)
ϕ
(
b
)
\phi(ab)=\phi(a)\phi(b)
ϕ(ab)=ϕ(a)ϕ(b)”.
[I-3-3] 欧拉定理 Euler’s Theorem
Let m m m be an integer greater than 1 1 1. In the ring Z m \mathbb{Z}_m Zm , every unit u u u satisfies
u ϕ ( m ) = 1 u^{\phi(m)}=1 uϕ(m)=1
Equivalently, every integer a a a relatively prime to m m m satisfies
a ϕ ( m ) = 1 ( mod m ) a^{\phi(m)}=1 \ \ (\text{mod}\ m) aϕ(m)=1 (mod m)
[证明]
第一部分的证明
已知环 Z m \mathbb{Z}_m Zm 中有 t = ϕ ( m ) t = \phi(m) t=ϕ(m) 个单位元.
单位元集合 (其实构成群) U m = { u 1 , u 2 , … , u t } U_m = \{u_1, u_2, \ldots, u_t\} Um={u1,u2,…,ut}, 任意选择其中一个 u i u_i ui ( 1 ≤ i ≤ t 1 \leq i \leq t 1≤i≤t).
用 u i u_i ui 乘以集合 U m U_m Um 中的每一个元素得到模 m m m 乘积系列 u i u 1 , u i u 2 , … , u i u t {u_i u_1, u_i u_2, \ldots, u_i u_t} uiu1,uiu2,…,uiut.
假设上述模
m
m
m 乘积得到相同元素, 则可推导如下
u
i
u
p
≡
u
i
u
q
(
mod
m
)
⇒
u
i
(
u
p
−
u
q
)
≡
0
(
mod
m
)
u_i u_p \equiv u_i u_q \ (\text{mod}\ m)\\ \Rightarrow \ u_i(u_p - u_q) \equiv 0 \ (\text{mod}\ m)
uiup≡uiuq (mod m)⇒ ui(up−uq)≡0 (mod m)
根据 “[I-2-3] 相消性 Cancellation”, 可得
u
p
−
u
q
≡
0
(
mod
m
)
u_p - u_q \equiv 0 \ (\text{mod} \ m)
up−uq≡0 (mod m)
⇒
\Rightarrow
⇒
u
p
≡
u
q
(
mod
m
)
u_p \equiv u_q \ (\text{mod}\ m)
up≡uq (mod m). 与单位元 units 是各自不同元素矛盾.
所以模 m m m 乘积系列是各自不同的值.
又根据 “ Z m \mathbb{Z}_m Zm 中的所有 units 组成的集合 U m U_m Um 关于 × \times × 运算构成群”, 及群中运算的封闭性可知, 模 m m m 乘积系列 u i u 1 , u i u 2 , … , u i u t {u_i u_1, u_i u_2, \ldots, u_i u_t} uiu1,uiu2,…,uiut 仍然是群 U m U_m Um 中元素的完整列表, 与 u 1 , u 2 , … , u t u_1, u_2, \ldots, u_t u1,u2,…,ut 之间可能只是排列顺序的差别.
那么就有
u
1
u
2
…
u
t
≡
(
u
i
u
1
)
(
u
i
u
2
)
…
(
u
i
u
t
)
(
mod
m
)
⇒
u
1
u
2
…
u
t
=
u
i
t
(
u
1
u
2
…
u
t
)
(
mod
m
)
u_1 u_2 \ldots u_t \equiv (u_i u_1)(u_i u_2) \ldots (u_i u_t) \ (\text{mod}\ m)\\ \Rightarrow\ u_1 u_2 \ldots u_t = u_i^t (u_1 u_2 \ldots u_t) \ (\text{mod} \ m)
u1u2…ut≡(uiu1)(uiu2)…(uiut) (mod m)⇒ u1u2…ut=uit(u1u2…ut) (mod m)
由 units 群中逆元性质可知,
u
1
u
2
…
u
t
u_1 u_2 \ldots u_t
u1u2…ut 仍环
Z
m
\mathbb{Z}_m
Zm 中的 unit. 利用 “[I-2-3] 相消性 Cancellation” 可得
u
i
t
≡
1
(
mod
m
)
⇒
u
i
ϕ
(
m
)
≡
1
(
mod
m
)
u_i^t \equiv 1 \ (\text{mod}\ m) \quad \Rightarrow \quad u_i^{\phi(m)} \equiv 1 \ (\text{mod}\ m)
uit≡1 (mod m)⇒uiϕ(m)≡1 (mod m)
第二部分的证明
利用 “[I-2-2] 单位元性质 A property of units” 可知, 当 0 ≤ a < m 0 \leq a < m 0≤a<m 情况下, gcd ( a , m ) = 1 \gcd(a,m)=1 gcd(a,m)=1 可以推得 a a a 是 Z m \mathbb{Z}_m Zm 中的 unit, 故结论成立.
当
a
≥
m
a \geq m
a≥m 情况下, 存在
0
≤
a
′
<
m
0\leq a'< m
0≤a′<m 使得
a
=
a
′
(
mod
m
)
a=a' \ (\text{mod}\ m)
a=a′ (mod m), 即
a
=
a
′
+
k
m
a= a'+ km
a=a′+km (
k
∈
Z
k\in \mathbb{Z}
k∈Z). 假设
gcd
(
a
′
,
m
)
=
d
\gcd(a', m)=d
gcd(a′,m)=d, 则有
d
∣
a
′
,
d
∣
m
⇒
d
∣
(
a
′
+
k
m
)
⇒
d
∣
a
,
d
∣
m
⇒
gcd
(
a
,
m
)
=
d
⇒
d
=
1
⇒
gcd
(
a
′
,
m
)
=
1
\begin{array}{cc} & d \ | \ a',\ d\ | \ m \\ \Rightarrow & d\ |\ (a'+km)\\ \Rightarrow & d\ |\ a,\ d\ | \ m \\ \Rightarrow & \gcd(a, m)=d\\ \Rightarrow & d = 1 \\ \Rightarrow & \gcd(a',m)=1 \end{array}
⇒⇒⇒⇒⇒d ∣ a′, d ∣ md ∣ (a′+km)d ∣ a, d ∣ mgcd(a,m)=dd=1gcd(a′,m)=1
根据已证明的第一部分内容可得
a
′
ϕ
(
m
)
≡
1
(
mod
m
)
⇒
(
a
−
k
m
)
ϕ
(
m
)
≡
1
(
mod
m
)
{a'}^{\phi(m)} \equiv 1 \ (\text{mod}\ m)\\ \Rightarrow \ (a-km)^{\phi(m)} \equiv 1 \ (\text{mod}\ m)\\
a′ϕ(m)≡1 (mod m)⇒ (a−km)ϕ(m)≡1 (mod m)
因为
ϕ
(
m
)
\phi(m)
ϕ(m) 是正整数,
(
a
−
k
m
)
ϕ
(
m
)
=
a
ϕ
(
m
)
+
k
m
(
∗
)
⇒
(
a
−
k
m
)
ϕ
(
m
)
≡
a
ϕ
(
m
)
(
mod
m
)
(a-km)^{\phi(m)} = a^{\phi(m)} + km(*)\\ \Rightarrow\ (a-km)^{\phi(m)} \equiv a^{\phi(m)} \ (\text{mod}\ m)
(a−km)ϕ(m)=aϕ(m)+km(∗)⇒ (a−km)ϕ(m)≡aϕ(m) (mod m)
最后得到
a
ϕ
(
m
)
≡
1
(
mod
m
)
a^{\phi(m)} \equiv 1 \ (\text{mod}\ m)
aϕ(m)≡1 (mod m).
当 a < 0 a < 0 a<0 情况下, 存在 0 ≤ a ′ ′ < m 0 \leq a'' < m 0≤a′′<m, 满足 a ′ ′ = a + l m a'' = a + lm a′′=a+lm ( l ∈ Z l \in \mathbb{Z} l∈Z). 类似 “当 a ≥ m a \geq m a≥m 情况下” 的证明, 可以得到 a ϕ ( m ) ≡ 1 ( mod m ) a^{\phi(m)} \equiv 1 \ (\text{mod}\ m) aϕ(m)≡1 (mod m).
这样就完成了整个欧拉定理的证明. 欧拉定理是 RSA 非对称加密算法的基础理论.
II. 算法原理
1. 扩展欧几里得算法
[II-1-1] 裴蜀定理 Bézout’s Theorem
Let a a a and b b b be integers with greatest common divisor d d d. Then there exist integers x x x and y y y such that
d = a x + b y d = ax + by d=ax+by
Thus, the greatest common divisor of a a a and b b b is an integer linear combination of a a a and b b b. Moreover, the data of the Euclidean algorithm can be used to determine an explicit pair of integers x x x and y y y such that d = a x + b y d = ax + by d=ax+by.
[证明][3]
已知 d = gcd ( a , b ) d=\gcd(a,b) d=gcd(a,b), 故 d ∣ a x + b y d\ \vert \ ax+by d ∣ ax+by 对任意的 x , y x,y x,y.
a x + b y ax+by ax+by 随 x x x 和 y y y 变化, 必存在 x = x ′ x=x' x=x′ 和 y = y ′ y=y' y=y′ 时使得 a x + b y ax+by ax+by 取得最小正值 d ′ d' d′, 即 d ′ = a x ′ + b y ′ d'=ax'+by' d′=ax′+by′. 此时同样满足 d ∣ d ′ d\ \vert \ d' d ∣ d′.
下面就是要证明 d ′ d' d′ 等于最大公因数 d d d.
由除法定理 (Devision theorem) 存在 q a , r a ∈ Z q_a,r_a \in \mathbb{Z} qa,ra∈Z 满足 a = d ′ q a + r a a = d'q_a+r_a a=d′qa+ra, 其中 0 ≤ q a , 0 ≤ r a < d ′ 0\leq q_a , 0\leq r_a < d' 0≤qa,0≤ra<d′ ( a a a 被除数, d ′ d' d′ 除数, q q q 商, r r r 余数), 移项得到 r a = a − q a ( a x ′ + b y ′ ) = a ( 1 − q a x ′ ) + b ( − q a y ′ ) r_a = a - q_a (ax'+by') = a(1-q_a x') + b(-q_a y') ra=a−qa(ax′+by′)=a(1−qax′)+b(−qay′).
可知 r a r_a ra 也是 a , b a,b a,b 的线性组合, 且非负. 已经假设了 d ′ d' d′ 是 a , b a,b a,b 线性组合得到的最小正值, 但由除法定理已知 r a < d ′ r_a < d' ra<d′, 所以只能 r a = 0 r_a = 0 ra=0.
这样我们得到了 d ′ ∣ a d'\ \vert \ a d′ ∣ a.
同样地, 存在 q b , r b ∈ Z q_b, r_b \in \mathbb{Z} qb,rb∈Z 满足 b = d ′ q b + r b b = d' q_b +r_b b=d′qb+rb, 0 ≤ q b , 0 ≤ r b < d ′ 0\leq q_b , 0\leq r_b < d' 0≤qb,0≤rb<d′, 移项得 r b = b − q b ( a x ′ + b y ′ ) = a ( − q b x ′ ) + b ( 1 − q b y ′ ) r_b = b - q_b (ax'+by') = a(-q_b x') + b(1-q_b y') rb=b−qb(ax′+by′)=a(−qbx′)+b(1−qby′) ⇒ \Rightarrow ⇒ r b = 0 r_b = 0 rb=0 ⇒ \Rightarrow ⇒ d ′ ∣ b d'\ \vert \ b d′ ∣ b.
自然可知 d ′ d' d′ 是 a , b a,b a,b 的公约数 (公因数). 而 d d d 是 a , b a,b a,b 的最大公约数, 故 d ≥ d ′ d\geq d' d≥d′. 又由于 d ∣ d ′ d\ \vert \ d' d ∣ d′, 故 d ≤ d ′ d\leq d' d≤d′.
最后得到 d = d ′ d= d' d=d′. 如此不定方程 d = a x + b y d = ax + by d=ax+by 解的存在性就证明完毕了.
[11-1-2] 欧几里得算法 Euclidean Algorithm[4]
Given positive integers a , b a,b a,b with a > b ≥ 0 a > b \geq 0 a>b≥0 find d = gcd ( a , b ) d=\gcd(a,b) d=gcd(a,b).
[Step 1] Given a , b a,b a,b, use the division theorem to write a = b q + r a=bq+r a=bq+r, 0 ≤ r < b 0 \leq r < b 0≤r<b.
[Step 2] If r = 0 r=0 r=0, stop and output b b b; this is the gcd.
[Step 3] If r ≠ 0 r \neq 0 r=0, replace ( a , b ) (a,b) (a,b) by ( b , r ) (b,r) (b,r). Go to [Step 1].
[例] 求 756, 123 的 gcd
Steps
Calculation
[Step 1]
756
=
123
×
6
+
18
,
r
=
18
[Step 3]
r
≠
0
,
(
a
,
b
)
=
(
123
,
18
)
[Step 1]
123
=
18
×
6
+
15
,
r
=
15
[Step 3]
r
≠
0
,
(
a
,
b
)
=
(
18
,
15
)
[Step 1]
18
=
15
×
1
+
3
,
r
=
3
[Step 3]
r
≠
0
,
(
a
,
b
)
=
(
15
,
3
)
[Step 1]
15
=
3
×
5
+
0
,
r
=
0
[Step 2]
r
=
0
,
gcd
(
756
,
123
)
=
3
\begin{array}{l} \text{Steps} & \text{Calculation}\\ \hline \text{[Step 1]} &756 = 123\times 6+ 18, r=18\\ \text{[Step 3]} & r\neq 0 , (a,b) = (123, 18)\\ \text{[Step 1]} &123 = 18\times 6+ 15, r=15\\ \text{[Step 3]} & r\neq 0 , (a,b) = (18, 15)\\ \text{[Step 1]} &18 = 15\times 1+ 3, r=3\\ \text{[Step 3]} & r\neq 0 , (a,b) = (15, 3)\\ \text{[Step 1]} &15 = 3\times 5+ 0, r=0\\ \text{[Step 2]} & r = 0 , \gcd(756,123) = 3 \end{array}
Steps[Step 1][Step 3][Step 1][Step 3][Step 1][Step 3][Step 1][Step 2]Calculation756=123×6+18,r=18r=0,(a,b)=(123,18)123=18×6+15,r=15r=0,(a,b)=(18,15)18=15×1+3,r=3r=0,(a,b)=(15,3)15=3×5+0,r=0r=0,gcd(756,123)=3
[证明]
已知 d = gcd ( a , b ) d=\gcd(a,b) d=gcd(a,b), 结合 r = a − b q r=a-bq r=a−bq, 可以推得 d ∣ r d\ \vert \ r d ∣ r. 也就是说 d ∣ b d \ | \ b d ∣ b 且 d ∣ r d \ | \ r d ∣ r, 故 d d d 是 b , r b, r b,r 的公约数. 两个正整数 b , r b,r b,r 的公约数自然 “小于等于” 对应的最大公约数 e = gcd ( b , r ) e=\gcd(b,r) e=gcd(b,r), 即 d ≤ e = gcd ( b , r ) d \leq e=\gcd(b,r) d≤e=gcd(b,r).
另一方面, 由 e = gcd ( b , r ) e=\gcd(b,r) e=gcd(b,r) ⇒ \Rightarrow ⇒ e ∣ b , e ∣ r e \ \vert \ b, e\ \vert \ r e ∣ b,e ∣ r ⇒ \Rightarrow ⇒ e ∣ r + b q e\ \vert \ r+bq e ∣ r+bq ⇒ \Rightarrow ⇒ e ∣ a e\ \vert \ a e ∣ a, 可知 e e e 是 a , b a,b a,b 的公因数, 那么有 e ≤ d = gcd ( a , b ) e\leq d=\gcd(a,b) e≤d=gcd(a,b).
这样就可以得到 d = e d = e d=e, 也就是说每一步计算不改变迭代变化的计算数据之间的最大公因数的值.
最后需要说明算法将在有限步计算后结束. 因为在一步除法计算中需要满足 0 ≤ r < b 0 \leq r < b 0≤r<b, 而在不同迭代步的计算中余数需要满足 a > b > r 1 > r 2 > … > r n = 0 a> b > r_1>r_2>\ldots>r_n=0 a>b>r1>r2>…>rn=0, 只要 a , b a,b a,b 是有限正整数, 计算步就是有限的.
这样就证明了通过有限步计算的欧几里得算法得到的最大公因数 (使得 r = 0 r=0 r=0 时所得) 就是初始数据的最大公因数.
[II-1-3] 扩展欧几里得算法 Extended Euclidean Algorithm
Suppose a a a and b b b are integers and let d = gcd ( a , b ) d = \gcd(a, b) d=gcd(a,b). This algorithm finds d d d, x x x and y y y such that a x + b y = d ax + by = d ax+by=d. (We describe only the steps when a > b ≥ 0 a > b \geq 0 a>b≥0, since one can easily reduce to this case.)
[Step 1] Set r 0 = a r_{0}=a r0=a, x 0 = 1 x_{0} = 1 x0=1, y 0 = 0 y_{0} = 0 y0=0; r 1 = b , x 1 = 0 , y 1 = 1 r_1 = b, x_1=0, y_1 = 1 r1=b,x1=0,y1=1.
[Step 2] If r 1 = 0 r_1 = 0 r1=0, set d = r 0 d = r_0 d=r0 and terminate.
[Step 3] Use the division theorem to write r 0 = r 1 q 2 + r 2 r_0 = r_1 q_2 + r_2 r0=r1q2+r2 with 0 ≤ r 2 < r 1 0 \leq r_2 < r_1 0≤r2<r1.
[Step 4] Set ( r 0 , r 1 , x 1 , y 1 , x 0 , y 0 ) = ( r 1 , r 2 , x 0 − q 2 x 1 , y 0 − q 2 y 1 , x 1 , y 1 ) (r_0, r_1, x_1, y_1, x_0, y_0) = (r_1, r_2, x_0 − q_2 x_1, y_0 − q_2 y_1, x_1, y_1) (r0,r1,x1,y1,x0,y0)=(r1,r2,x0−q2x1,y0−q2y1,x1,y1) and go to [Step 2].
[说明]
最大公约数 gcd 可以用欧几里得算法获得, 是欧几里得算法的最后一个非零余数.
在应用欧几里得算法时, 每一步计算非零余数由 a , b a,b a,b 线性组合的系数, 直到最后一个非零余数 (= gcd) 的 a , b a,b a,b 线性组合系数.
这就是扩展欧几里得算法求不定方程 (丢番图方程) a x + b y = d ax+by=d ax+by=d 的思路.
我们分步推导如下:
Euclidean Algorithm | Extended | Results | |
---|---|---|---|
1 | r 0 = a r_0=a r0=a | r 0 = x 0 a + y 0 b = 1 ⋅ a + 0 ⋅ b r_0=x_0 a+ y_0 b= 1\cdot a+0\cdot b r0=x0a+y0b=1⋅a+0⋅b | x 0 = 1 , y 0 = 0 x_0 = 1, y_0=0 x0=1,y0=0 |
2 | r 1 = b r_1=b r1=b | r 1 = x 1 a + y 1 b = 0 ⋅ a + 1 ⋅ b r_1=x_1 a + y_1 b = 0\cdot a + 1\cdot b r1=x1a+y1b=0⋅a+1⋅b | x 1 = 0 , y 1 = 1 x_1 = 0, y_1 = 1 x1=0,y1=1 |
3 | r 0 ÷ r 1 = q 2 … r 2 r_0 \div r_1 = q_2 \ldots r_2 r0÷r1=q2…r2 | r 2 = r 0 − r 1 q 2 = ( x 0 a + y 0 b ) − ( x 1 a + y 1 b ) q 2 = ( x 0 − x 1 q 2 ) ‾ ≜ x 2 a + ( y 0 − y 1 q 2 ) ‾ ≜ y 2 b \begin{aligned}r_2 &= r_0 - r_1 q_2\\&= (x_0 a+ y_0 b)-(x_1 a + y_1 b) q_2 \\ &=\underset{\color{green}\triangleq x_2}{\underline{(x_0 - x_1 q_2)}}a + \underset{\color{green}\triangleq y_2}{\underline{(y_0-y_1 q_2)}}b\end{aligned} r2=r0−r1q2=(x0a+y0b)−(x1a+y1b)q2=≜x2(x0−x1q2)a+≜y2(y0−y1q2)b | x 2 = x 0 − x 1 q 2 y 2 = y 0 − y 1 q 2 \begin{aligned}x_2&=x_0 - x_1 q_2\\y_2&= y_0-y_1 q_2\end{aligned} x2y2=x0−x1q2=y0−y1q2 |
⋮ \vdots ⋮ | |||
i | r i − 2 ÷ r i − 1 = q i … r i r_{i-2} \div r_{i-1} = q_i \ldots r_i ri−2÷ri−1=qi…ri | r i = r i − 2 − r i − 1 q i = ( x i − 2 a + y i − 2 b ) − ( x i − 1 a + y i − 1 b ) q i = ( x i − 2 − x i − 1 q i ) ‾ ≜ x i a + ( y i − 2 − y i − 1 q i ) ‾ ≜ y i b \begin{aligned}r_i &= r_{i-2} - r_{i-1} q_i\\&= (x_{i-2} a+ y_{i-2} b)-(x_{i-1} a + y_{i-1} b) q_i \\ &= \underset{\color{green}\triangleq x_i}{\underline{(x_{i-2} - x_{i-1} q_i)}}a + \underset{\color{green}\triangleq y_i}{\underline{(y_{i-2}-y_{i-1} q_i)}}b\end{aligned} ri=ri−2−ri−1qi=(xi−2a+yi−2b)−(xi−1a+yi−1b)qi=≜xi(xi−2−xi−1qi)a+≜yi(yi−2−yi−1qi)b | x i = x i − 2 − x i − 1 q i y i = y i − 2 − y i − 1 q i \begin{aligned}x_i &= x_{i-2} - x_{i-1} q_i\\ y_i & = y_{i-2}-y_{i-1} q_i\end{aligned} xiyi=xi−2−xi−1qi=yi−2−yi−1qi |
⋮ \vdots ⋮ | |||
n-1 | r n − 3 ÷ r n − 2 = q n − 1 … r n − 1 r_{n-3} \div r_{n-2} = q_{n-1} \ldots r_{n-1} rn−3÷rn−2=qn−1…rn−1 | r n − 1 = r n − 3 − r n − 2 q n − 1 = ( x n − 3 a + y n − 3 b ) − ( x n − 2 a + y n − 2 b ) q n − 1 = ( x n − 3 − x n − 2 q n − 1 ) ‾ ≜ x n − 1 a + ( y n − 3 − y n − 2 q n − 1 ) ‾ ≜ y n − 1 b \begin{aligned}r_{n-1} &= r_{n-3} - r_{n-2} q_{n-1}\\&= (x_{n-3} a+ y_{n-3} b)-(x_{n-2} a + y_{n-2} b) q_{n-1} \\ &= \underset{\color{green}\triangleq x_{n-1}}{\underline{(x_{n-3} - x_{n-2} q_{n-1})}}a + \underset{\color{green}\triangleq y_{n-1}}{\underline{(y_{n-3}-y_{n-2} q_{n-1})}}b\end{aligned} rn−1=rn−3−rn−2qn−1=(xn−3a+yn−3b)−(xn−2a+yn−2b)qn−1=≜xn−1(xn−3−xn−2qn−1)a+≜yn−1(yn−3−yn−2qn−1)b | x n − 1 = x n − 3 − x n − 2 q n − 1 y n − 1 = y n − 3 − y n − 2 q n − 1 \begin{aligned}x_{n-1} &= x_{n-3} - x_{n-2} q_{n-1}\\ y_{n-1} & = y_{n-3}-y_{n-2} q_{n-1}\end{aligned} xn−1yn−1=xn−3−xn−2qn−1=yn−3−yn−2qn−1 |
n | r n − 2 ÷ r n − 1 = q n r n = 0 \begin{aligned}r_{n-2} \div r_{n-1} &= q_n\\ r_n &= 0 \end{aligned} rn−2÷rn−1rn=qn=0 | 0 = r n − 2 − r n − 1 q n = ( x n − 2 a + y n − 2 b ) − ( x n − 1 a + y n − 1 b ) q n = ( x n − 2 − x n − 1 q n ) ‾ ≜ x n a + ( y n − 2 − y n − 1 q n ) ‾ ≜ y n b \begin{aligned} 0 &= r_{n-2} - r_{n-1} q_{n}\\&= (x_{n-2} a+ y_{n-2} b)-(x_{n-1} a + y_{n-1} b) q_{n} \\ &= \underset{\color{green}\triangleq x_{n}}{\underline{(x_{n-2} - x_{n-1} q_{n})}}a + \underset{\color{green}\triangleq y_{n}}{\underline{(y_{n-2}-y_{n-1} q_{n})}}b\end{aligned} 0=rn−2−rn−1qn=(xn−2a+yn−2b)−(xn−1a+yn−1b)qn=≜xn(xn−2−xn−1qn)a+≜yn(yn−2−yn−1qn)b | x n = x n − 2 − x n − 1 q n y n = y n − 2 − y n − 1 q n \begin{aligned}x_{n} &= x_{n-2} - x_{n-1} q_{n}\\ y_{n} & = y_{n-2}-y_{n-1} q_{n}\end{aligned} xnyn=xn−2−xn−1qn=yn−2−yn−1qn |
最后的结果为
{
d
=
r
n
−
1
x
=
x
n
−
1
y
=
y
n
−
1
\left\{\begin{aligned}d &= r_{n-1}\\ x &= x_{n-1}\\ y &= y_{n-1}\end{aligned}\right.
⎩
⎨
⎧dxy=rn−1=xn−1=yn−1
需要明确,
gcd
(
a
,
b
)
=
d
=
r
n
−
1
\gcd(a,b)=d=r_{n-1}
gcd(a,b)=d=rn−1 是唯一确定的, 但
a
x
+
b
y
=
d
ax+by=d
ax+by=d 为不定方程, 有无穷多组解.
每一组具体的解都只能称为特解, 有下式成立
a
x
n
−
1
+
b
y
n
−
1
=
d
(II-1-1)
a x_{n-1} + b y_{n-1} = d \tag{II-1-1}
axn−1+byn−1=d(II-1-1)
上述表格中第 n 步计算提供了获得通解的线索, 因为知道
a
x
n
+
b
y
n
=
0
(II-1-2)
a x_n + b y_n =0 \tag{II-1-2}
axn+byn=0(II-1-2)
式 (II-1-1) 和 (II-1-2) 结合可得
(
a
x
n
−
1
+
b
y
n
−
1
)
+
k
(
a
x
n
+
b
y
n
)
=
d
⇒
a
(
x
n
−
1
+
k
x
n
)
+
b
(
y
n
−
1
+
k
y
n
)
=
d
(a x_{n-1} + b y_{n-1}) + k(a x_n + b y_n) = d\\ \Rightarrow\ a(x_{n-1}+k x_n) + b(y_{n-1} + k y_n) = d
(axn−1+byn−1)+k(axn+byn)=d⇒ a(xn−1+kxn)+b(yn−1+kyn)=d
其中
k
k
k 为任意整数. 最后不定方程
a
x
+
b
y
=
d
ax+by=d
ax+by=d 的通解为
{
x
=
x
n
−
1
+
k
x
n
y
=
y
n
−
1
+
k
y
n
(II-1-3)
\left\{\begin{aligned}x &= x_{n-1} + k x_n\\ y &= y_{n-1} + k y_n\end{aligned}\right. \tag{II-1-3}
{xy=xn−1+kxn=yn−1+kyn(II-1-3)
利用扩展欧几里得算法计算得到的特解可能为正值也可为负值, 我们实际计算中多用到正整数, 通解公式 (II-1-3) 就可以将解适配到合适的区域.
2. RSA 非对称加密算法
[II-2-1] RSA algorithm[5]
[I-Genertaing Keys-Receiver]
[Step 1] Choose p , q p, q p,q, two large prime numbers
[Step 2] Calculate n = p q n = pq n=pq, and calculate ϕ ( n ) = ( p − 1 ) ( q − 1 ) \phi(n) = (p-1)(q-1) ϕ(n)=(p−1)(q−1)
[Step 3] Choose e e e such that gcd ( ϕ ( n ) , e ) = 1 \gcd(\phi(n), e) = 1 gcd(ϕ(n),e)=1 and 1 < e < ϕ ( n ) 1 < e < \phi(n) 1<e<ϕ(n)
[Step 4] Choose a positive integer d d d, such that e d ≡ 1 ( mod ϕ ( n ) ) ed\equiv 1 \ (\text{mod}\ \phi(n)) ed≡1 (mod ϕ(n))
[Step 5] The private key is { d , n } \{d,n\} {d,n} and the public key is { e , n } \{e,n\} {e,n}, release the public key
[II-Encrypting Message-Sender]
[Step 6] Encrypt a message M M M ( < n <n <n) by using the public key { e , n } \{e,n\} {e,n}: C = M e ( mod n ) C = M^e\ (\text{mod}\ n) C=Me (mod n)
[III-Decrypting Message-Receiver]
[Step 7] Decrypt the message C C C by using the private key { d , n } \{d,n\} {d,n}: M ′ = C d ( mod n ) M' = C^d \ (\text{mod}\ n) M′=Cd (mod n)
[说明]
RSA 算法的安全性依赖于大数的质因数分解, 给定一个大的合数 n n n 很难在短时间内质因数分解为 p , q p,q p,q.
根据 “[I-3-1] 欧拉函数 Euler
ϕ
\phi
ϕ-Function” 及其 “[I-3-2] 可乘性 Multiplicative Property”, 可知 [Step 2] 中
ϕ
(
n
)
=
ϕ
(
p
)
ϕ
(
q
)
=
(
p
−
1
)
(
q
−
1
)
(II-2-1)
\phi(n)=\phi(p)\phi(q)=(p-1)(q-1) \tag{II-2-1}
ϕ(n)=ϕ(p)ϕ(q)=(p−1)(q−1)(II-2-1)
就是
n
n
n 的欧拉函数.
[Step 3] 中就是选择一个和欧拉函数 ϕ ( n ) \phi(n) ϕ(n) 互质的数值 e e e. (最简单的实现, 选择一个小于 ϕ ( n ) \phi(n) ϕ(n) 的质数作为 e e e.)
已知 gcd ( ϕ ( n ) , e ) ≡ 1 \gcd(\phi(n), e)\equiv 1 gcd(ϕ(n),e)≡1, 由 “[II-1-1] 裴蜀定理 Bézout’s Theorem”, 存在 x , y x, y x,y 使得 ϕ ( n ) x + e y = 1 \phi(n)x+ey=1 ϕ(n)x+ey=1 成立. [Step 4] 中 e d ≡ 1 ( mod ϕ ( n ) ) ed\equiv 1\ (\text{mod}\ \phi(n)) ed≡1 (mod ϕ(n)) 等价于 ϕ ( n ) x + e d = 1 \phi(n)x+ed=1 ϕ(n)x+ed=1 ( x ∈ Z x\in \mathbb{Z} x∈Z). 这里的 d d d 就是裴蜀定理中的 y y y, 直接可以利用 “[II-1-2] 扩展欧几里得算法 Extended Euclidean Algorithm” 计算获得 d d d 的特解.
又因为我们的推导都在正整数范围内展开, 利用通解计算式 (II-1-3), 使得 d d d 适配到正整数范围.
[Step 5] 中获得的公钥需要公布给信息发送者, 而私钥由接受者严格保密保存. 即使第三方知道公钥也无法破解获知私钥.
[Step 6] 中信息发送者利用公钥加密信息, 并发送加密后的信息给到信息接收者.
[Step 7] 中信息接收者利用私钥解密已加密的信息, 获得信息原文. 如何证明解密后的信息一定是原始信息呢 ? 由加密和解密过程可知
M
′
≡
C
d
(
mod
n
)
≡
(
M
e
)
d
(
mod
n
)
(II-2-2)
M'\equiv C^d \ (\text{mod}\ n) \equiv (M^e)^d\ (\text{mod}\ n) \tag{II-2-2}
M′≡Cd (mod n)≡(Me)d (mod n)(II-2-2)
又
ϕ
(
n
)
x
+
e
d
=
1
\phi(n)x+ed=1
ϕ(n)x+ed=1
⇒
\Rightarrow
⇒
e
d
=
1
−
ϕ
(
n
)
x
ed = 1 - \phi(n)x
ed=1−ϕ(n)x, 代入上式得到
M
′
≡
(
M
e
)
d
(
mod
n
)
≡
M
1
−
ϕ
(
n
)
x
(
mod
n
)
≡
M
⋅
(
M
ϕ
(
n
)
)
−
x
(
mod
n
)
(II-2-3)
\begin{aligned} M' &\equiv (M^e)^d\ (\text{mod}\ n) \\ &\equiv M^{1-\phi(n)x} \ (\text{mod}\ n) \\ &\equiv M \cdot \left({M^{\phi(n)}}\right)^{-x} \ (\text{mod}\ n) \end{aligned} \tag{II-2-3}
M′≡(Me)d (mod n)≡M1−ϕ(n)x (mod n)≡M⋅(Mϕ(n))−x (mod n)(II-2-3)
需知要传送的信息数值
M
M
M 是不受加密算法限制的, 故下面根据
M
M
M 与
n
n
n 两者之间互质关系分类讨论.
由算数基本定理可知信息数值
M
M
M 可以分解为
M
=
m
p
k
1
q
k
2
(II-2-4)
M = m p^{k_1}q^{k_2} \tag{II-2-4}
M=mpk1qk2(II-2-4)
其中
m
m
m 中不含
p
,
q
p,q
p,q 因子, 即
gcd
(
m
,
p
q
)
=
1
\gcd(m,pq)=1
gcd(m,pq)=1. 根据信息数值
M
M
M 中是否含有
p
,
q
p,q
p,q 因子分解为以下四类情况
{
Case I
:
k
1
=
0
,
k
2
=
0
Case II
:
k
1
≥
1
,
k
2
≥
1
Case III
:
k
1
≥
1
,
k
2
=
0
Case IV
:
k
1
=
0
,
k
2
≥
1
\left\{ \begin{aligned} \text{Case I}&:\ k_1 =0,\ k_2=0\\ \text{Case II}&:\ k_1 \geq 1,\ k_2 \geq 1\\ \text{Case III}&:\ k_1 \geq 1,\ k_2 = 0\\ \text{Case IV}&:\ k_1=0,\ k_2 \geq 1\\ \end{aligned}\right.
⎩
⎨
⎧Case ICase IICase IIICase IV: k1=0, k2=0: k1≥1, k2≥1: k1≥1, k2=0: k1=0, k2≥1
[Case 1]
M
M
M 中不含有
p
,
q
p,q
p,q 因子. 一般
p
p
p 和
q
q
q 这两个不同质数的取值大于信息元素的编码值, 即
p
,
q
>
M
≥
0
p,q>M\geq 0
p,q>M≥0, 这样可以确保 [Case I] 的发生, 此时
M
M
M 与
n
=
p
q
n=pq
n=pq 互质. 满足 “[I-3-3] 欧拉定理 Euler’s Theorem” 的条件, 可得
M
ϕ
(
n
)
≡
1
(
mod
n
)
{M^{\phi(n)}}\equiv 1 \ (\text{mod}\ n)
Mϕ(n)≡1 (mod n), 代入式 (II-2-3) 得到
M
′
≡
M
⋅
(
M
ϕ
(
n
)
)
−
x
(
mod
n
)
≡
M
⋅
1
−
x
(
mod
n
)
≡
M
(
mod
n
)
(II-2-5)
\begin{aligned} M' &\equiv M \cdot \left({M^{\phi(n)}}\right)^{-x} \ (\text{mod}\ n)\\ &\equiv M\cdot1^{-x}\ (\text{mod}\ n)\\ &\equiv M\ (\text{mod}\ n) \end{aligned} \tag{II-2-5}
M′≡M⋅(Mϕ(n))−x (mod n)≡M⋅1−x (mod n)≡M (mod n)(II-2-5)
这样就证明了 “在
M
M
M 和
n
n
n 互质情况下, 解密后的信息一定是原始信息”.
下面的三种情况, M M M 与 n = p q n=pq n=pq 都不互质.
[Case II] 此时
M
M
M 含有
p
p
p 和
q
q
q 因子, 即
M
M
M 是
n
n
n (
=
p
q
=pq
=pq) 的倍数, 也就是说
M
≡
0
(
mod
n
)
M \equiv 0 \ (\text{mod}\ n)
M≡0 (mod n). 代入加密公式 (II-2-2)
M
′
≡
(
M
e
)
d
≡
0
(
mod
n
)
M'\equiv (M^e)^d\ \equiv 0 \ (\text{mod}\ n)
M′≡(Me)d ≡0 (mod n)
这种情况下, 任何信息都加密输出为
0
0
0, 实际应用中是没有意义的, 故排除此种情况. 故算法中要求
M
<
n
M<n
M<n.
[Case III] 此时
M
M
M 中含有
p
p
p 因子, 即
M
≡
0
(
mod
p
)
M \equiv 0 \ (\text{mod}\ p)
M≡0 (mod p). 但是
M
M
M 中不含有
q
q
q 因子, 即
gcd
(
M
,
q
)
=
1
\gcd(M,q)=1
gcd(M,q)=1. 由欧拉定理可知
M
ϕ
(
q
)
≡
1
(
mod
q
)
(II-2-6)
M^{\phi(q)} \equiv 1 \ (\text{mod}\ q) \tag{II-2-6}
Mϕ(q)≡1 (mod q)(II-2-6)
由模运算的性质继续推得
(
M
ϕ
(
q
)
)
−
x
ϕ
(
p
)
≡
1
−
x
ϕ
(
p
)
≡
1
(
mod
q
)
⇒
(
M
ϕ
(
q
)
)
−
x
ϕ
(
p
)
=
1
+
k
q
q
(
k
q
∈
Z
)
(II-2-7)
\left(M^{\phi(q)}\right)^{-x \phi(p)} \equiv 1^{-x\phi(p)} \equiv 1 \ (\text{mod}\ q)\\ \Rightarrow\ \left(M^{\phi(q)}\right)^{-x \phi(p)} = 1+k_q q\quad (k_q \in \mathbb{Z}) \tag{II-2-7}
(Mϕ(q))−xϕ(p)≡1−xϕ(p)≡1 (mod q)⇒ (Mϕ(q))−xϕ(p)=1+kqq(kq∈Z)(II-2-7)
上式结合
ϕ
(
n
)
=
ϕ
(
p
)
ϕ
(
q
)
\phi(n) = \phi(p) \phi(q)
ϕ(n)=ϕ(p)ϕ(q), 得到
(
M
ϕ
(
n
)
)
−
x
=
1
+
k
q
q
(II-2-8)
\left(M^{\phi(n)}\right)^{-x} =1+k_q q \tag{II-2-8}
(Mϕ(n))−x=1+kqq(II-2-8)
另外已知
M
M
M 中含有
p
p
p 因子,
M
q
Mq
Mq 中含有
n
n
n (
=
p
q
=pq
=pq) 因子, 即
n
∣
M
q
n\ |\ Mq
n ∣ Mq.
将式 (II-2-8) 代入式 (II-2-3)
M
′
≡
M
⋅
(
M
ϕ
(
n
)
)
−
x
(
mod
n
)
≡
M
⋅
(
1
+
k
q
q
)
(
mod
n
)
≡
M
+
k
q
M
q
(
mod
n
)
≡
M
(
mod
n
)
\begin{aligned} M' &\equiv M \cdot \left({M^{\phi(n)}}\right)^{-x} \ (\text{mod}\ n)\\ &\equiv M \cdot (1+k_q q) \ \ (\text{mod}\ n)\\ &\equiv M + k_q M q \ \ (\text{mod}\ n)\\ &\equiv M \ \ (\text{mod}\ n) \end{aligned}
M′≡M⋅(Mϕ(n))−x (mod n)≡M⋅(1+kqq) (mod n)≡M+kqMq (mod n)≡M (mod n)
这样就证明了 “在
M
M
M 是
p
p
p 的倍数但
M
M
M 不是
q
q
q 的倍数情况下, 解密后的信息一定是原始信息”.
[Case IV] 同上, 可以证明了 “在 M M M 是 q q q 的倍数但 M M M 不是 p p p 的倍数情况下, 解密后的信息一定是原始信息”.
这样证明了 [II-2-1] RSA algorithm 的有效性.
实际情况下 p p p 和 q q q 都选得足够大, 使得信息数值 M M M 与 p , q p,q p,q 都互质.
III. 算法实现
1. 源代码
### RSA Encryption
### wzf@robotics_notes
### https://blog.csdn.net/woyaomaishu2
import math
def find_integer_prime_phi_n(phi_n):
## 寻找和 phi_n 互质的整数
## 此处实现为: 寻找最小的质数, 该质数不能整除 phi_n
candidate_e = 1
prime_flag = False
candidate_flag = False
while not candidate_flag:
while not prime_flag:
prime_flag = True
candidate_e = candidate_e + 1
# 尝试判断下一个整数是否为质数
for i in range(2, int(math.sqrt(candidate_e))+1):
if candidate_e % i == 0:
# 如果被任何 [2, sqrt(candidate_e)] 区间内的整数乘除
# 则 candidate_e 不是质数
prime_flag = False
break
if phi_n % candidate_e == 0:
candidate_flag = False
prime_flag = False
# 如果寻找到的质数 candiate_e 整除 欧拉 phi-函数
# 则舍弃该 candidate_e, 继续寻找下一个
else:
candidate_flag = True
# 找到不能整除 欧拉 phi-函数的整数(质数)
return candidate_e
def extended_eculidean_algorithm(a, b):
## 扩展欧几里得算法 extended euclidean algorithm
x_new = 0
x_old = 1
y_new = 1
y_old = 0
r_new = b
r_old = a
while r_new != 0: # 余数不等于 0, 执行以下更新
quotient = r_old // r_new # 新商
temp_r_old = r_new
r_new = r_old - quotient * r_new # 更新新的余数
r_old = temp_r_old
temp_x_old = x_new
x_new = x_old - quotient * x_new # 扩展欧几里得算法的分步推导表
x_old = temp_x_old
temp_y_old = y_new
y_new = y_old - quotient * y_new # 扩展欧几里得算法的分步推导表
y_old = temp_y_old
print("[a]: {0}, [b]:{1}, [x_old]:{2}, [x_old]:{3}, [r_old]:{4}, [x_new]:{5}, [y_new]:{6}, [r_new]:{6}"
.format(a, b, x_old, y_old, r_old, x_new, y_new, r_new))
if y_old <= 0:
y_old += y_new # 通解公式 (II-1-3) 将 d 适配为正整数
return y_old
def generate_keys(p, q):
## 产生公钥和私钥
n = p*q # 两个的“大质数”的乘积
phi_n = (p-1)*(q-1)
# Euler phi-Function of n: phi_n = (p-1)*(q-1)
e = find_integer_prime_phi_n(phi_n)
# 选择一个一个正整数 e, 使得
# 1 < e < phi_n,
# 且 e 与 phi(n) 互质, 即 gcd(e, phi_n) = 1
d = extended_eculidean_algorithm(phi_n, e)
# 利用 extended euclidean algorithm 计算正整数 d, 满足 d*e ≡ 1 (mod phi_n)
public_key = (e,n)
private_key = (d,n)
return public_key, private_key
def encrypt_message(message, public_key):
## 利用公钥 (e,n) 对原始信息进行加密
e,n = public_key
message_integer = []
for character in message:
message_integer.append(ord(character))
# ascii values of message
print("message_integer:", message_integer)
# for illustrative purpose only
ciphertext = []
for a in message_integer:
cipher = pow(a, e) % n #[Step 6] Encrypt a message
ciphertext.append(cipher)
# b ≡ a^e (mod n)
return ciphertext # 返回密文
def decrypt_message(ciphertext, private_key):
## 利用私钥对秘文进行解密
d,n = private_key
decrypted_message_integer = []
for b in ciphertext:
decrypted = pow(b, d) % n #[Step 7] Decrypt the message
decrypted_message_integer.append(decrypted)
print("decrypted_message_integer:", decrypted_message_integer)
decrypted_message = ""
for i in decrypted_message_integer:
decrypted_message += chr(i)
return decrypted_message
if __name__ == '__main__':
# p = 811 # 选择两个的“大质数”
# q = 929
p = 691 # 选择两个的“大质数”, 会使 d 的特解为负, 会利用通解公式 (II-1-3) 适配
q = 701
message = "Hello_world -> RSA algorithm. [1#$%*&^]! ~~~"
# 原始信息
print("message (ascii):", message)
## Stage I REceiver 制作秘钥 ##
public_key, private_key = generate_keys(p, q)
e,n = public_key # public key 公钥
d,n = private_key # private key 私钥
print("Public key: ({0},{1})".format(e, n) )
print("Private key: ({0},{1})".format(d, n) )
## Stage II Sender 加密信息 ##
ciphertext = encrypt_message(message, public_key)
print("ciphertext:", ciphertext)
# # -- for illustrative purpose only
encrypted = ""
for cipher in ciphertext:
encrypted = encrypted + chr(cipher)
print("Encrypted (ascii):", encrypted)
# # --
## Stage III Receiver 解密信息 ##
decrypted_message = decrypt_message(ciphertext, private_key)
print("decrypted_message (ascii):", decrypted_message)
2. 测试结果
总结
从初等数论基础开始, 推导算法数学原理 (欧拉定理)、扩展欧几里得算法、RSA 算法原理, 最后 Python 实现了 RSA 算法 demo.
参考文献
[1] Ronald S. Irving, “Integers, Polynomials, and Rings: A Course in Algebra”, 2003, Springer
[2] “Definition:Ring of Integers Modulo m”, https://proofwiki.org/wiki/Definition:Ring_of_Integers_Modulo_m
[3] 百度百科, “裴蜀定理”, https://baike.baidu.com/item/%E8%A3%B4%E8%9C%80%E5%AE%9A%E7%90%86/5186593
[4] Brilliant.org, “Euclidean Algorithm”, https://brilliant.org/wiki/euclidean-algorithm/
[5] “Asymmetric Cryptography: The RSA algorithm (with examples)”, https://justcryptography.com/rsa-algorithm/