Encryption

字元串的實際RSA加密和解密?

  • January 16, 2021

$ K_{pub} = (n, e) $

$ K_{pvt} = d $

然後

$ E_{K_{pub}}(x) \equiv x^e \mod n $

實際上,當 RSA 用於加密字元串時,什麼是 $ x $ 這裡?你不能一個字節一個字節地接受它,因為 $ \mod n $ 將產生大於一個字節的值。那麼做了什麼?

實際上,當 RSA 用於加密字元串時,什麼是 $ x $ 在 $ x^e\bmod n $ ?

這取決於 RSA 的變體。其中最常見的:

  1. 玩具大小的教科書RSA,公模裡 $ n $ 小:習慣上逐個字母(或一對字母,如原始 RSA 文章的小範例)加密並連接 RSA 密碼。因此 $ x $ 是使用的編碼中字母的等級(或 $ x=x_0,b+x_1 $ 在哪裡 $ x_0 $ 和 $ x_1 $ 是兩個字母的等級,有 $ b $ 一個大於最大值的公共常數 $ x_i $ ,例如 $ b=100 $ 在上述文章中)。小人沒有安全感 $ n $ : 玩具錘子實際上不會釘子。小的 $ n $ 是任何多達一百個十進制數字。這可以很快被分解,從而允許解密。見此記錄
  2. 教科書 RSA 與大 $ n $ :習慣上將字元串轉換為字節(例如,根據UTF-8,現代兼容的ASCII超集),然後從字節串轉換為整數 $ x $ (通常每個OS2IP)。在 Python 中
int.from_bytes(bytes('François wears a 😷!', 'UTF-8'), byteorder='big', signed=False)

有大小限制 $ k-1 $ 字節,其中 $ 2^{8(k-1)}<n<2^{8k} $ , 這保證 $ 0\le x<n $ . 在解密時,前導零字節被忽略/刪除(由於從字元串到字節串的簡單轉換)。變化比比皆是(一些大小編碼以允許任何字節串,在右側填充,以便 $ x $ 即使對於小字元串,字節序也很大……)。

注意:在選擇明文攻擊下教科書 RSA 不安全:

  • 攻擊者可以簡單地驗證明文的猜測:只需加密猜測並檢查密碼。這種攻擊對於班級名冊上的名字、信用卡號碼是毀滅性的……

  • 當短字元串編碼為小整數時 $ x $ ,其他幾種攻擊也適用,包括

    • 什麼時候 $ x $ 碰巧我們可寫為 $ x=x_a\cdot x_b $ 對於整數 $ x_a $ 和 $ x_b $ 小到可以通過列舉找到,存在中間相遇攻擊
    • 什麼時候 $ e<\log_2(N)/\log_2(x) $ , 它代表 $ x^e\bmod N,=,x^e $ ,因此很容易找到 $ x $ 經過 $ e\text{th} $ 根提取。
  1. RSAES-PKCS1-v1_5:類似於 2 加上隨機填充,意味著在解密時將其刪除。 $ x $ 是要編碼的字元串、3 個常量字節和至少 8 個隨機(非零)字節的組合。因此,該字元串僅限於 $ k-11 $ 字節(根據§7.2.1 步驟 1)。這種方法比較好,但還是有嚴重的缺陷:
  • 解密的實現很難防止側通道攻擊。第一個是 Daniel Bleichenbacher在Crypto 1998 程序中針對基於 RSA 加密標準 PKCS #1 的協議的選擇密文攻擊,並且有許多變體。
  • 除非我們降低 $ k-11 $ 限制,加密本質上容易受到 CPA 成本核算下的攻擊 $ 2^{63} $ 加密。由於這些原因,RSAES-PKCS1-v1_5 不應在任何新設計中使用。
  1. RSAES-OAEP:這是對上述內容的重大改進,使用雜湊。字元串通過填充過程轉換為整數 $ x $ 這有點隨機 $ 0\le x<2^{8(k-1)} $ ,這在解密中被撤消了。解密的安全實現比 RSAES-PKCS1-v1_5 更容易。理論上,安全性可以簡化為雜湊和 RSA 問題的安全性(找到隨機 $ x $ 給定 $ x^e\bmod n $ )。大小限制變為 $ k-2h-2 $ 字節(根據§7.1.1 步驟 1.b),其中 $ h $ 是散列的大小(例如 $ h=32 $ SHA-256 字節)。
  2. 混合加密,例如RSA-KEM。隨機值 $ x $ 和 $ 0\le x<N $ 是沒有填充的 RSA 加密的,對稱加密密鑰是從中派生的,並且該密鑰用於加密(-和-MAC)要加密的字元串。RSAES-OAEP 中仍然存在的一些解密實現錯誤的途徑已經消失。理論上,安全性可以簡化為加密和 RSA 問題,與 RSAES-OAEP 相比,具有更簡單的證明和/或數量上更好的保證。沒有大小限制。然而,密碼的大小略有增加,當 RSAES-OAEP 內置時,我們需要一個密鑰派生函式和一個經過身份驗證的密碼。

引用自:https://crypto.stackexchange.com/questions/87529