1. 程式人生 > 實用技巧 >RSA 加密演算法原理學習筆記-1

RSA 加密演算法原理學習筆記-1

RSA演算法原理(一) - 阮一峰的網路日誌

RSA 加密演算法

RSA 加密演算法是一種非對稱加密演算法,加密和解密的金鑰是不同的。

(1)乙方生成兩把金鑰(公鑰和私鑰)。公鑰是公開的,任何人都可以獲得,私鑰則是保密的。
(2)甲方獲取乙方的公鑰,然後用它對資訊加密
(3)乙方得到加密後的資訊,用私鑰解密

金鑰越長,它就越難破解。根據已經披露的文獻,目前被破解的最長 RSA 金鑰是 768 個二進位制位。也就是說,長度超過 768 位的金鑰,還無法破解(至少沒人公開宣佈)。因此可以認為,1024 位的 RSA 金鑰基本安全,2048 位的金鑰極其安全。

基礎數論知識

同餘定理

給定一個正整數,如果兩個整數 a 和 b 滿足 a - b 能夠被 m 整除,即 (a-b)/m 得到一個整數,那麼就稱整數 a 與 b 對模 m 同餘,記作 $a \equiv b \pmod m$。對模 m 同餘是整數的一個等價關係。

  • 即 $a \div m = k \cdots b$ ,換句話說,就是 a 除以 m 餘 b。
  • 即 $(a - b) \div m = k,$可以改寫成:$b = a - km$
  • 根據定義,這個恆等式的變換可以看成:$a \equiv b \pmod m$,b 左移:$a - b = km$
  • 掌握好這幾個小結論,後續論證中會使用到。

互質關係

兩個正整數只有 1 這個公因子,那麼這兩個數有互質關係。

  • 別忘了,兩個相等的數是不互質的,公因數除 1 外還有本身。所以互質的兩個數肯定是不等的,定義裡已經排除了這種可能性。
  • 兩個不等的質數一定互質(下面的第 2 點),因為他們的因數都只有 1 和本身,所以相同的因數只有 1。反過來不成立。
  • 一些結論:
  1. 1 和任意一個自然數是都是互質關係,比如 1 和 99。
  2. 任意兩個質數構成互質關係,比如 13 和 61。
  1. 一個數是質數另一個數只要不是前者的倍數或者小於前者,兩者就構成互質關係,比如 3 和 10、17 和 4。
  1. p 是大於 1 的整數,則 p 和 p-1 構成互質關係,比如 57 和 56。
  2. p 是大於 1 的奇數,則 p 和 p-2 構成互質關係,比如 17 和 15。
  • 質數:2,3,5,7,11,13,17,19,23,29,31,37...

尤拉函式

計算小於等於 n 的所有正整數中,與 n 有互質關係的所有正整數個數。這種演算法稱為尤拉函式,以 φ(n)

表示。

這個函式可以根據互質關係的相關結論計算(以下 = 為等於,不是程式碼中的賦值):

  1. n = 1φ(1) = 1

  2. n 為質數:φ(n) = n-1。因為小於 n 的數都與 n 互質。

  3. n 為某質數某次方,n = p^kp 為質數,k 為大於等於1的整數):
    那麼,$$\phi(n) = \phi(p^k) = p^k - p^{k-1}$$

    • 比如 n = 8,$φ(8) = φ(2^3) = 2^3 - 2^2 = 8 - 4 = 4$。
    • 這是因為只有當一個數不包含因數 p,才與 n 互質。包含因數 p 的數有:$1×p、2×p、3×p、...p^{k-1}×p$ 共 $p^{k-1}$ 個。
    • 可以看出上面第 2 種情況是 k = 1 時的特例。
    • 公式也可以寫成:$$\phi(n) = \phi(p^k) = p^k - p^{k-1} = p^k(1-\frac1p)$$
  4. n 可以分解成兩個互質的整數之積,n = p × q
    $$\phi(n) = \phi(pq) = \phi(p)\phi(q)$$

    • 即:積的尤拉函式等於各個因子的尤拉函式之積
    • 比如,$φ(56) = φ(8×7) = φ(8)×φ(7) = 4×6 = 24$。
    • 證明需要使用“中國剩餘定理”。
  5. 最終通用推算:
    算術基本定理:任意一個大於 1 的正整數,都可以寫成一系列質數的積:$n = p{k_1}_1p{k_2}_2 \ldots p^{k_r}_r$(它將把對自然數的研究轉化為對其最基本的元素——質數/素數的研究)。
    因此根據第 4 種情況的結論(可拆),得到任意一個大於 1 的正整數的尤拉函式:$\phi(n) = \phi(p{k_1}_1)\phi(p{k_2}_2)\ldots\phi(p^{k_r}_r)$;
    再根據第 3 種情況的結論(原數是質數多次方),可改寫為:$\phi(n) = p{k_1}_1p{k_2}_2...p^{k_r}_r(1-\frac1p_1)(1-\frac1p_2)\ldots(1-\frac1p_r)$;
    也就是:
    $$\phi(n) = n(1-\frac1p_1)(1-\frac1p_2)\ldots(1-\frac1p_r)$$

這便是尤拉函式的通用計算公式。

尤拉定理

尤拉函式的應用在於尤拉定理。

尤拉定理:如果兩個正整數 a 和 n 互質,則 n 的尤拉函式 φ(n) 可以讓下面的等式成立:
$$a^{\phi(n)} \equiv 1 \pmod n$$

  • 即:aφ(n) 次方除以 n 的餘數恆等於 1
  • 或者說:aφ(n) 次方減 1 可以被 n 整除。

比如 4 和 5:
4 的尤拉函式結果為 2,滿足 $5^2 \div 4 = 6 \cdots 1$。也就是 $(5^2 -1 )$ 可以被 4 整除。

  • 一個小例子,7 和 10 為互質關係,因為 φ(10) = 4,所以 $7^4 \div 10$ 最終餘 1,也就是說其個位數為 1。
    那麼,7 的任意 4 倍數次方個位數肯定是 1,即:$7^{4k} \equiv 1 \pmod {10}$(因為個位數為 1 的任意個這種數相乘個位數肯定還是 1 啊)。
    • 計算 φ(10):拆為 φ(2)φ(5)25都是質數,所以它們的尤拉函式結果是 2 - 1、5 - 1,即 φ(2) = 1φ(5) = 4。最終得到 φ(10) = 4

尤拉定理有一個特殊的情況,假設正整數 a 與質數 p 為互質關係,因為 φ(p) = p - 1,那麼:
$$a^{p-1} \equiv 1 \pmod p$$
這就是費馬小定理,是尤拉定理中一個數為質數的特例。

模反元素(模逆元)

如果兩個正整數 a 和 n 互質,那麼一定可以找到整數 b ,使得 ab-1 被 n 整除,或者說 ab 被 n 除的餘數是 1,那麼:
$$ab \equiv 1 \pmod n$$

稱 b 為 a 的模反元素(稱模反元素時,還需要另一個數 n 作為環境)。

  • 可以根據尤拉定理進行驗證模反元素存在的必然性
    $\because$ a 和 n 互質滿足尤拉定理
    $\therefore$ 根據尤拉定理得:$a^{\phi(n)} \equiv 1 \pmod n$
    即 $a \times a^{\phi(n-1)} \equiv 1 \pmod n$
    $\therefore$ 設 $b = a^{\phi(n-1)}$,那麼 b 就是 a 的一個模反元素

比如,4 和 7 互質,利用尤拉定理求:$φ(4) = φ(2^2) = 2^2 - 2^1 = 2$,所以 $7^2 = 1 \pmod 4$,因為不能再取 b為 7,所以就換另一邊計算。
$φ(7) = 7 - 1 = 6$,所以 $4^6 = 1 \pmod 7$,得到 $4 \times 4^5 = 1 \pmod 7$,可以獲得 45 是 4 的一個模反元素。
顯然模反元素不止一個。45加減任意個 7 均是 4 的模反元素,既滿足 b + kn 即可(b 是45,n 是 7)。

  • 所以計算模反元素時可以使用方程式: $ab - 1 = kφ(n)$。