RSA 加密算法的基础数论、基本原理与 Python 实现

Title: RSA 加密算法的基础数论、基本原理与 Python 实现


文章目录

  • 前言
  • [I. 数学原理](#I. 数学原理)
    • [1. 整数环](#1. 整数环)
    • [2. 单位元](#2. 单位元)
    • [3. 欧拉定理](#3. 欧拉定理)
  • [II. 算法原理](#II. 算法原理)
    • [1. 扩展欧几里得算法](#1. 扩展欧几里得算法)
    • [2. RSA 非对称加密算法](#2. RSA 非对称加密算法)
  • [III. 算法实现](#III. 算法实现)
    • [1. 源代码](#1. 源代码)
    • [2. 测试结果](#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. 源代码

python 复制代码
### 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/裴蜀定理/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/

相关推荐
袁袁袁袁满几秒前
Python之MoviePy视频编辑模块介绍与应用
开发语言·python·音视频·moviepy·视频编辑模块
蛔虫在他乡1 分钟前
从零开始的python学习生活1
python·学习·生活
悄悄敲敲敲6 分钟前
栈的实现详解
c语言·开发语言·数据结构·c++·算法·链表·线性回归
danaaaa13 分钟前
算法力扣刷题总结篇 ——【四】
数据结构·c++·算法·leetcode·职场和发展
懒大王爱吃狼17 分钟前
Python爬虫+数据分析+数据可视化图形-爬取高校排名数据
爬虫·python·信息可视化
亚图跨际20 分钟前
C++和Python蚂蚁搬食和蚊虫趋光性和浮标机群行为算法神经网络
算法·集群机·耦合共振同步动作·分子间势能·寻觅同伴·统计学量化集群·可视化集群运动
春山之外21 分钟前
基于IIS的Windows系统Django项目本地部署
后端·python·django·iis·服务器部署
安於宿命41 分钟前
0/1背包问题总结
c语言·c++·算法·leetcode·动态规划
NingDream81641 分钟前
面试题 04. 二维数组中的查找
数据结构·算法
拾漓43 分钟前
算法整理——【贪心算法练习(2)】
算法·贪心算法