跳轉到內容

密碼學/數學背景

來自華夏公益教科書

請參閱討論頁面獲取其他建議。

現代公鑰(非對稱)密碼學基於一個稱為數論的數學分支,該分支專門處理僅產生整數結果的方程的求解。這類方程被稱為丟番圖方程,以希臘數學家丟番圖(約公元 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]
華夏公益教科書