Encryption

如何使用 RSA 作為分組密碼加密不完整的塊?

  • February 7, 2016

我有一個關於 RSA 學術範例的問題。如果我們使用塊大小為 3 的塊 RSA,我們會收到以下消息:“android”。它分為“and”、“roi”、“d”。

如何加密最後一個字元’d’?

對於如此小的塊大小,無法使用 RSA 填充模式,例如 PKCS#1 v1.5 填充或 OAEP。但是,您可以將加密視為 ECB 模式加密。在這種情況下,您可以應用為對稱分組密碼建構的填充機制。

然而,這些填充模式是為字節而不是字元定義的。沒問題 - 讓我們假設 ASCII 文本,這樣我們就可以毫無問題地將文本轉換為字節。在許多程式環境中,您甚至可能不必顯式執行轉換(例如 C has char*)。

好的,所以轉換後你有多個選項(值是十六進制的):

  • PKCS#5 padding:一個填充,其中每個添加的字節都具有以字節為單位的填充大小的值(即010202030303在您的情況下)。
  • 位填充:只需添加一個 1 位,然後在末尾添加零(即80 8000800000在您的情況下)。
  • 零填充:只需添加零字節直到下一個邊界,即 $ \varnothing $ (無),000000. 這個可能最常用於教科書 RSA。

零填充是不確定的,因為它可能會在解密後剝離00明文末尾的有價值字節。然而,它的優點是當明文的大小已經正確時,您不必填充。

此外,至少對於 ASCII(和 UTF-8),您不會在可列印文本中找到任何零字節。零字節值通常被視為字元串結束標記——尤其是在 C 語言中。不要忘記您的字元串可能需要00在這些環境中以 a 結尾(因此使您的緩衝區大一個字節並將最右邊的字節設置為00解密之前或之後)。

如果執行時沒有自動刪除零,那麼您通常可以使用諸如rtrim(plaintext, '\0')可用的右修剪功能。


轉換後,您需要將 3 字節序列轉換為無符號整數,然後才能將它們輸入到使用公鑰執行模冪運算的函式中。PKCS#1 定義了一種稱為 OS2IP(和 I2OSP 轉換回來)的方法。

確保生成的整數始終小於模數(ASCII 為 7 位,因此 24 位模數就足夠了)。

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