跳转到内容

密码学/数学背景

来自维基教科书,开放世界中的开放书籍

请参阅讨论页面获取其他建议。

现代公钥(非对称)密码学基于一个称为数论的数学分支,该分支专门处理仅产生整数结果的方程的求解。这类方程被称为丢番图方程,以希腊数学家丢番图(约公元 200 年)命名,他在其著作算术中讨论了需要这种整数解的问题。

最古老的丢番图问题之一被称为毕达哥拉斯问题,该问题在给出直角三角形的其他两条边的长度时,根据以下方程给出直角三角形的一条边的长度:

其中 是斜边的长度。虽然两条边可能是已知的整数,但得到的第三条边很可能是无理数。毕达哥拉斯问题的解并不超出范围,但超出了本章的目的。因此,这里将简单地给出整数解的示例(称为毕达哥拉斯三元组)。寻找其他解,无论是通过蛮力还是推导,都留给读者作为练习。

毕达哥拉斯三元组
3 4 5
5 12 13
7 24 25
8 15 17

非对称密钥算法在操作中严重依赖于素数的使用,通常是极长的素数。根据定义,素数只能被自身和 1 整除。换句话说,用符号 | 表示可除性(即 - 表示“ 可以整除 ”),素数严格遵守以下数学定义

| 其中 或仅

算术基本定理 指出所有整数都可以分解成唯一的素数分解。任何大于 1 的整数都被认为是素数合数。合数由不止一个素因子组成

| 最终其中

其中 是一个唯一的素数,而 是指数。

数值示例

[编辑 | 编辑源代码]
543,312 = 24  32  50  73  111
553,696 = 25  30  50  70  113  131

如您所见,根据这种系统分解,每个分解都是唯一的。

为了确定性地验证一个整数 是素数还是合数,只需要检查素数 。这种系统的、彻底的检查被称为穷举法。素数和合数在密码学研究中值得注意,因为通常公钥是一个合数,它是两个或多个素数的乘积。这些素数中的一个(或多个)可能构成私钥

素数有几种类型和类别,其中三种对密码学很重要,将在下面简要讨论。

费马素数

[编辑 | 编辑源代码]

费马数 采用以下形式

如果Fn 是素数,则称为费马素数

数值示例

[编辑 | 编辑源代码]






已知唯一的费马素数是 。此外,欧拉证明了所有费马数的素性都是错误的,他证明了

梅森素数

[编辑 | 编辑源代码]

梅森素数 - 另一种公式化的素数生成方法 - 遵循以下形式

其中 是一个素数。 [1] Wolfram Alpha 引擎报告梅森素数,例如输入请求为“第 4 个梅森素数”。

数值示例

[编辑 | 编辑源代码]

前四个梅森素数如下





Mp = 2p 形式的数,不考虑素数要求,被称为梅森数。并非所有的梅森数都是素数,例如 M11 = 211−1 = 2047 = 23 · 89。

互素数(相对素数)

[编辑 | 编辑源代码]

如果两个数的最大公约数为 1,则称这两个数为互素数。从数学上讲,这可以写成

其中 最大公约数。可以从上述定义中推导出两条规则

如果 | 并且 ,则 |
如果 并且 ,则 都是平方数,即 -

素数定理

[编辑 | 编辑源代码]

素数定理估计了随机选择的任何整数是素数的概率。估计如下,其中 定义为小于或等于 的素数数量。

的渐近线,也就是说 。这意味着,一般来说,随机选择的数字是素数的概率约为

欧几里得算法

[编辑 | 编辑源代码]

欧几里得算法用于发现两个整数的最大公约数。在密码学中,它最常用于确定两个整数是否互素,即 -

为了高效地找到,其中,尤其是在处理密码系统等涉及非常大的数字时,存在一种方法可以实现。欧几里得算法的运作方式如下:首先,用,得到商和余数。注意,这可以用方程的形式写成。接下来,使用替换的位置,执行相同的操作:。继续这种模式,直到最后的余数为零。后面的数值示例和正式算法将使这种内在的模式更加清晰。

数学描述

[edit | edit source]








时,停止,并有.

数值示例

[edit | edit source]

示例 1 - 寻找 gcd(17,043,12,660)

17,043 = 1  12,660 + 4383
12,660 = 2  4,383 + 3894
 4,383 = 1  3,894 + 489
 3,894 = 7  489 + 471
   489 = 1  471 + 18
   471 = 26  18 + 3
    18 = 6  3 + 0

gcd (17,043,12,660) = 3

示例 2 - 寻找 gcd(2,008,1,963)

2,008 = 1  1,963 + 45
1,963 = 43  45 + 28
   45 = 1  28 + 17
   28 = 1  17 + 11
   17 = 1  11 + 6
   11 = 1  6 + 5
    6 = 1  5 + 1
    5 = 5  1 + 0

gcd (2,008,1963) = 1 注:这两个数字互质。

算法表示

[edit | edit source]
Euclidean Algorithm(a,b)
Input:     Two integers a and b such that a > b
Output:    An integer r = gcd(a,b)
  1.   Set a0 = a, r1 = r
  2.   r = a0 mod r1
  3.   While(r1 mod r  0) do:
  4.      a0 = r1
  5.      r1 = r
  6.      r = a0 mod r1
  7.   Output r and halt

扩展欧几里得算法

[edit | edit source]

为了解决由贝祖恒等式表示的方程式类型,如下所示

是整数,通常使用 _扩展欧几里得算法_ 会很有用。 上述形式的方程出现在 RSA(Rivest-Shamir-Adleman)等公钥加密算法中,形式为 ,其中 。 实现扩展欧几里得算法有两种方法:_迭代法_ 和 _递归法_。

例如,我们将解决一个 RSA 密钥生成问题,其中 _e_ = 216 + 1,_p_ = 3,217,_q_ = 1,279。 因此,62,537_d_ + 51,456_w_ = 1。

方法

[edit | edit source]

迭代法

[edit | edit source]

此方法计算形式为 的表达式,用于欧几里得算法每一步 中的余数。 每个 模数 可以用前两个余数及其整数商表示,如下所示

通过替换,这给出了

前两个值是算法的初始参数

最后一个非零余数的表达式给出了所需的结果,因为这种方法计算了每个余数,并用*a* 和 *b* 表示,正如预期的那样。

步骤 余数 代入 合并项
1 4,110,048 = *a* 4,110,048 = 1*a* + 0*b*
2 65,537 = *b* 65,537 = 0*a* + 1*b*
3 62 46,754 = 4,110,048 - 65,537 62 46,754 = (1*a* + 0*b*) - (0*a* + 1*b*) 62 46,754 = 1*a* - 62*b*
4 1 18,783 = 65,537 - 46,754 1 18,783 = (0*a* + 1*b*) - (1*a* - 62*b*) 1 18,783 = -1*a* + 63*b*
5 2 9,188 = 46,754 - 18,783 2 9,188 = (1*a* - 62*b*) - (-1*a* + 62*b*) 2 9,188 = 3*a* - 188*b*
6 2 407 = 18,783 - 9,188 2 407 = (-1*a* + 63*b*) - (3*a* - 188*b*) 2 407 = -7*a* + 439*b*
7 22 234 = 9,188 - 407 22 234 = (3*a* - 188*b*) - (-7*a* + 439*b*) 22 234 = 157*a* - 9,846*b*
8 1 173 = 407 - 234 1 173 = (-7*a* + 439*b*) - (157*a* - 9,846*b*) 1 173 = -164*a* + 10,285*b*
9 1 61 = 234 - 173 1 61 = (157*a* - 9,846*b*) - (-164*a* + 10,285*b*) 1 61 = 321*a* + 20,131*b*
10 2 51 = 173 - 61 2 51 = (-164*a* + 10,285*b*) - (321*a* +20,131*b*) 2 51 = -806a + 50,547b
11 1 10 = 61 - 51 1 61 = (321a +20,131b) - (-806a + 50,547b) 1 10 = 1,127a - 70,678b
12 5 1 = 51 -10 5 1 = (-806a + 50,547b) - (1,127a - 70,678b) 5 1 = -6,441a + 403,937b
13 10 0 算法结束

将等式还原成原始形式 可以得到 ,可以证明 以及 。在 RSA 加密密钥生成过程中,w 的值会被丢弃,而 d 则保留为私钥的值。在这种情况下

d = 0x629e1 = 01100010100111100001

递归方法

[edit | edit source]

这是一种用于求解形式为 的丢番图方程的直接方法。使用这种方法,被除数和除数在一系列步骤中被简化。在最后一步,一个平凡值被代入等式,然后反向操作,直到得到解。

例子
[edit | edit source]

使用前面的 RSA 值

欧几里得展开 合并项 代入 逆向替换 解出 dx
4,110,048 w0 + 65,537d0 = 1
(62 65,537 + 46,754) w0 + 65,537d0 = 1
65,537 (62w0 + d0) + 46,754w0 = 1 w1 = 62w0 + d0 4,595 = (62)(-6441) + d0 d0 = 403,937
65,537 w1 + 46,754d1 = 1 d1 = w0 w1 = -6,441
(1 46,754 + 18,783) w1 + 46,754d1 = 1
46,754 (w1 + d1) + 18,783w1 = 1 w2 = w1 + d1 -1,846 = 4,595 + d1 d1 = -6,441
46,754 w2 + 18,783d2 = 1 d2 = w1
(2 18,783 + 9,188) w2 + 18,783d2 = 1
18,783 (2w2 + d2) + 9,188w2 = 1 w3 = 2w2 + d2 903 = (2)(-1,846) + d2 d2 = 4,595
18,783 w3 + 9,188d3 = 1 d3 = w2
(2 9,188 + 407) w3 + 9,188d3 = 1
9,188 (2w3 + d3) + 407w3 = 1 w4 = 2w3 + d3 -40 = (2)(903) + d3 d3 = -1846
9,188 w4 + 407d4 = 1 d4 = w3
(22 407 + 234) w4 + 407d4 = 1
407 (22w4 + d4) + 234w4 = 1 w5 = 22w4 +d4 23 = (22)(-40) + d4 d4 = 903
407 w5 + 234d5 = 1 d5 = w4
(1 234 + 173) w5 + 234d5 = 1
234 (w5 + d5) + 173w5 = 1 w6 = w5 +d5 -17 = 23 + d5 d5 = -40
234 w6 + 173d6 = 1 d6 = w5
(1 173 + 61) w6 + 173d6 = 1
173 (w6 + d6) + 61w6 = 1 w7 = w6 +d6 6 = -17 + d6 d6 = 23
173 w7 + 61d7 = 1 d7 = w6
(2 61 + 51) w7 + 61d7 = 1
61 (2w7 + d7) + 51w7 = 1 w8 = 2w7 +d7 -5 = (2)(6) + d7 d7 = -17
61 w8 + 51d8 = 1 d8 = w7
(1 51 + 10) w8 + 51d8 = 1
51 (w8 + d8) + 10w8 = 1 w9 = w8 +d8 1 = -5 + d8 d8 = 6
51 w9 + 10d9 = 1 d9 = w8
(5 10 + 1) w9 + 10d9 = 1
10 (5w9 + d9) + 1w9 = 1 w10 = 5w9 +d9 0 = (5)(1) + d9 d9 = -5
10 w10 + 1d10 = 1 d10 = w9
(1 10 + 0) w10 + 1d10 = 1
1 (10w10 + d10) + 0w10 = 1 w11 = 10w10 +d10 1 = (10)(0) + d10 d10 = 1
1 w11 + 0d11 = 1 d11 = w10 w11 = 1, d11 = 0

欧拉的totient函数

[编辑 | 编辑源代码]

在密码学中至关重要,totient函数(有时被称为phi函数)被定义为小于且与互质的非负整数的数量。从数学上讲,这表示为

这立即表明对于任何素数

任何指数化素数的totient函数的计算方式如下

欧拉函数也是乘法的

其中

有限域和生成器

[edit | edit source]

一个只是一组 ,它包含受熟悉的加法和乘法运算约束的数值元素。存在几种不同类型的域;例如,,实数域,以及,有理数域,或者 ,复数域。通用域通常用 表示。

有限域

[edit | edit source]

密码学主要利用有限域,这些域几乎完全由整数组成。最显著的例外是形式为高斯数,它们是实部和虚部为整数的复数。有限域的定义如下

的整数集
模素数 的整数集

由于密码学与丢番图方程的解有关,因此所使用的有限域主要基于整数,并用整数域的符号 表示。

有限域 包含精确的 个元素,其中有 个非零元素。 的扩展是 乘法群,记为 ,包含以下元素

使得

换句话说, 包含与 互质的元素

有限域在乘法方面构成一个阿贝尔群,由以下性质定义

 The product of two nonzero elements is nonzero 
 The associative law holds 
 The commutative law holds 
 There is an identity element 
 Any nonzero element has an inverse 

在域符号后的下标表示模 的整数集,这些整数从 ,如下例所示

乘法阶 表示,它包含所有元素,使得。下面给出了一个例子

如果 是素数,则集合 包含所有整数,使得。例如

合数n 素数p

生成器

[编辑 | 编辑源代码]

每个有限域都有一个生成元。生成元 可以通过对生成元 进行求幂来生成集合 中的所有元素。假设 的生成元,那么 包含元素,其中。如果 有生成元,则 被称为循环域。

生成元的总数由以下公式给出

For  (Prime)




Total number of generators  generators

Let , then ,  is a generator

Since  is a generator, check if 
, and , , therefore,  is not a generator
, and , , therefore,  is not a generator

Let , then ,  is a generator
Let , then ,  is a generator
Let , then ,  is a generator

There are a total of  generators,  as predicted by the formula 
For  (Composite)




Total number of generators  generators

Let , then ,  is a generator
Let , then ,  is a generator

There are a total of  generators  as predicted by the formula 

数论包含一个被称为同余理论的独立代数系统。同余的数学概念是由卡尔·弗里德里希·高斯在算术研究(1801 年)中引入的。

如果 是两个整数,它们的差能被 整除,则可以用以下符号表示

这可以用同余符号表示为

其中,除数 称为同余模 可以等效地写成

其中 是一个整数。

注意在示例中,对于所有 的情况,都表明了 。 考虑到这一点,请注意

表示 是一个偶数。

表示 是一个奇数。

示例

[edit | edit source]

同余的性质

[edit | edit source]

所有同余 (具有固定 ) 具有以下共同性质

当且仅当
如果 并且 那么
给定 存在唯一一个 使得

这些性质表示一个等价类,意味着任何整数模 等价于有限域 中的某个特定整数。

同余作为余数

[edit | edit source]

如果整数 的模数,那么对于每个整数

可以理解为 除以 的余数,或者作为同余

两个在模 下不同余的数一定有不同的余数。因此,可以看出任何同余式 成立当且仅当 是被 除后有相同余数的整数。

例子

[edit | edit source]
 is equivalent to
 implies
 is the remainder of  divided by 

同余式的代数

[edit | edit source]

假设在本节中我们有两个同余式,。这些同余式可以以下列方式相加或相减

如果这两个同余式相乘,则得到以下同余式

或者特殊情况,其中

注意:以上并不意味着同余式存在除法运算。只有在 互质时,才能简化以上内容。在数学上,这表示为

意味着 当且仅当

以上定义的等价类集合构成一个交换环,这意味着余类可以相加、相减和相乘,并且运算满足结合律、交换律,并具有加法逆元。

m 运算的简化

[编辑 | 编辑源代码]

在处理同余式 时,我们通常需要进行运算,其中 ,而我们想要得到一个新的整数 ,使得 ,并且得到的 是该同余式的模 的最小非负剩余。对同余式进行模 运算基于同余式的性质,并且在同余式的幂运算中经常需要使用。

Input: Integers  and  from  with 
Output: Integer  such that 

1. Let 
2.     
3.     
4. Output 
Given 




请注意 是模 的最小非负剩余。

幂运算

[编辑 | 编辑源代码]

假设我们从 开始。当我们将这个同余式乘以自身时,结果是 。概括这个结果,假设 是一个正整数





This simplifies to

 implies 
 implies 

重复平方法

[编辑 | 编辑源代码]

有时我们需要知道模 的最小非负剩余,其中一个数被幂运算为 。为了找到这个数,我们可以使用重复平方法,其工作原理如下

1. Begin with 
2. Square  and  so that 
3. Reduce  modulo  to obtain 
4. Continue with steps 2 and 3 until  is obtained.
   Note that  is the integer where  would be just larger than the exponent desired
5. Add the successive exponents until you arrive at the desired exponent
6. Multiply all 's associated with the 's of the selected powers
7. Reduce the resulting  for the desired result
To find :










Adding exponents:



Multiplying least nonnegative residues associated with these exponents:




Therefore: 


同余的逆

[编辑 | 编辑源代码]

虽然找到正确的对称或非对称密钥是加密明文消息所必需的,但是计算这些密钥的逆对于成功解密生成的密文至关重要。这可以在从简单的仿射变换

到 RSA 公钥加密,其中一个解密(私有)密钥是

的各种密码系统中都可以看到。

对于元素 其中 ,存在 使得 。因此, 被称为 的 *逆*,记为 其中 是整数 的 *n 次方*,其中

Find 

This is equivalent to saying 

First use the Euclidean algorithm to verify .
Next use the Extended Euclidean algorithm to discover the value of .
In this case, the value is .

Therefore, 

It is easily verified that 

费马小定理

[编辑 | 编辑源代码]

其中 定义为素数,任何整数都满足以下关系

意味着

条件和推论

[编辑 | 编辑源代码]

一个额外的条件指出,如果 不能被 整除,则以下等式成立

费马小定理还有一个推论,它指出如果 不能被 整除,且 那么

欧拉推广

[编辑 | 编辑源代码]

如果 ,那么

中国剩余定理

[编辑 | 编辑源代码]

如果想要解决一个具有不同模数的同余方程组,可以按照以下步骤进行

一个同时的解 存在当且仅当 ,其中 ,并且任何两个解都彼此模 同余。

使用中国剩余定理寻找同时解的步骤如下

1. 计算
2. 计算 对于每一个不同的
3. 找到 的逆元 对于每一个 使用扩展欧几里得算法
4. 将 乘开,对每个 都进行一次。
5. 将所有 相加。
6. 计算 以获得最小的非负余数。

例子

[edit | edit source]
Given:













Using the Extended Euclidean algorithm:











二次剩余

[edit | edit source]

如果 是素数,并且 ,检查 中的非零元素,有时需要知道哪些元素是平方数。如果对于某个 ,存在一个平方数,使得 。那么,对于 的所有平方数可以通过 来计算,其中 是模 的二次剩余,如果存在一个 使得 。如果不存在这样的 ,那么 是模 的二次非剩余。 是模素数 的二次剩余,当且仅当

例子

[edit | edit source]
For the finite field , to find the squares , proceed as follows:



上面的值是二次剩余。剩下的(在本例中)9 个值被称为二次非剩余。完整的列表如下。


Quadratic residues: 
Quadratic nonresidues: 

勒让德符号

[编辑 | 编辑源代码]

勒让德符号表示 是否为模素数 的二次剩余,并且对素数 和整数 定义。 相对于 的勒让德符号用符号 表示。请注意,这并不意味着 除以 有三种值之一:

雅可比符号

[编辑 | 编辑源代码]

雅可比符号适用于所有奇数 ,其中 ,则

如果 是素数,那么雅可比符号等于勒让德符号(这是 Solovay-Strassen 素性测试的基础)。

素性测试

[edit | edit source]

描述

[edit | edit source]

在密码学中,使用算法快速有效地测试给定数字是否为素数对于密码系统的成功至关重要。存在几种素性测试方法(例如费马或 Solovay-Strassen 方法),但本节讨论的算法将是 Miller-Rabin(或 Rabin-Miller)素性测试。目前,Miller-Rabin 测试是一种无条件的概率(蒙特卡洛)算法。将展示如何将 Miller-Rabin 转换为确定性(拉斯维加斯)算法。

伪素数

[edit | edit source]

请记住,如果 是素数并且 ,费马小定理指出

但是,在某些情况下, 可以满足上述条件并且是非素数。这些数字类别被称为伪素数

是以 为底的伪素数,其中 当且仅当 的最小正幂等于 平均地除以 .

如果费马小定理对于任何奇合数整数 都成立,那么 被称为伪素数。这构成了素性测试的基础。通过测试不同的 's,我们可以概率性地对所讨论数字的素性更有信心。

以下三个条件适用于奇合数整数

I. 如果 的最小正幂与 同余,并且能整除 (即 中的阶),那么 是一个伪素数。
II. 如果 对基底 是伪素数,那么 也是对基底 的伪素数。
III. 如果 不满足 ,对于任何单个基底 ,那么 不满足 至少对于一半的基底 来说。

对于任何满足 的奇合数,其中 所有 都成立,被称为 卡迈克尔数

米勒-拉宾素性测试

[edit | edit source]

描述

[edit | edit source]

示例

[edit | edit source]

因式分解

[edit | edit source]

罗方法

[edit | edit source]

描述

[edit | edit source]

算法

[edit | edit source]

例子

[edit | edit source]

费马因式分解

[edit | edit source]

例子

[edit | edit source]

随机数生成器

[edit | edit source]

RNG 与 PRNG

[edit | edit source]

ANSI X9.17 PRNG

[edit | edit source]

布鲁姆-布鲁姆-舒布 PRNG

[edit | edit source]

RSA PRNG

[edit | edit source]

熵提取器

[edit | edit source]

白化函数

[edit | edit source]

大整数乘法

[edit | edit source]

卡拉楚巴乘法

[edit | edit source]

例子

[edit | edit source]

费勒乘法

[edit | edit source]

椭圆曲线

[edit | edit source]

描述

[edit | edit source]

定义

[edit | edit source]

性质

[edit | edit source]

总结

[edit | edit source]
华夏公益教科书