Encryption

與明文相比,1024 位 RSA 密碼的大小是多少?

  • October 4, 2020

假設我們用 1024 位 RSA 和公共指數加密了一個 50000 位的明文 $ e $ = 3:它的密碼有多大?

當我們增加指數讓我們說 $ e $ = 2 16 + 1 = 65537,那麼它的密碼有多大?

RSA 幾乎總是用於混合模式,其中 AES(或其他對稱密碼)用於加密數據本身,然後使用 RSA 加密隨機數據密鑰。這樣 RSA 只有一個靜態成本:以字節為單位的模數大小(也是密鑰大小)。因此,對於 RSA-1024,這意味著 128 字節的成本 + 對稱密碼所需的任何成本(如果使用流密碼或流密碼模式,例如計數器模式,則可以是零字節)。在那種情況下,你會有 $ 50000 / 8 + 1024 / 8 = 6250 + 128 = 6378 $ 如果我沒記錯的話,字節。

使用未填充/原始或教科書 RSA(即 RSA 僅使用模冪運算)是不安全的。所以你總是需要在 RSA 中填充明文消息。在這種情況下,您將例如使用後面 PKCS#1 標準中定義的 RSA-OAEP。這種填充方案增加了相當多的成本。通常我們並不關心這一點,因為在使用混合加密時還有很多剩餘的東西來加密對稱密鑰。但是,如果您按順序使用多個 RSA 加密,那麼您將有 42 個字節的成本和只有 86 個字節的有效負載,假設OAEP 中的 SHA-1 散列以獲得最小成本。單個加密的部分消息仍然是 128 字節。所以你會有 $ \big\lceil 6250 / 86 \big\rceil \cdot 128 = 73 * 128 = 9344 $ 字節數,增加 $ 2966 $ 字節(!)

這些計算的一些注意事項:

  • PKCS#1 中指定的 RSA 始終將加密的輸出設置為以字節為單位的模數大小,即使實際數字更小。這樣,大小始終是靜態的,不需要指定(除非事先不知道密鑰大小)。如果您允許交替大小,那麼您需要指出每個加密的輸出大小,否則您將無法分離生成的 RSA 密文塊。
  • 也可以使用 RSA-PKCS#1 v1.5 填充。PKCS#1 v1.5 填充是一種較舊的、不太安全的方案。PKCS#1 v1.5 填充在非混合方案中的成本要少一些。
  • RSA-KEM 是另一種混合加密方案。它不加密對稱密鑰;它加密用於派生對稱密鑰的主密鑰,並且可以說更安全。它不會為混合加密增加任何成本。它不能用於直接或部分加密消息。
  • 上面沒有考慮消息完整性/真實性。如果這通常需要,我們使用簽名後加密方案,在加密之前增加明文消息。
  • 通常還存在其他成本。例如,基於 CMS 的加密還指示接收方使用的證書和算法。因此,您通常不能期望純文字消息僅根據 RSA 密鑰大小進行擴展。
  • RSA-1024 已被 NIST(用於中長期加密)棄用,通常被認為太小。請注意,增加密鑰大小實際上對所需的相對成本量有積極影響(當連接部分消息的 RSA 加密時);較大的 RSA 密鑰大小實際上是有益的。不幸的是,這是以不斷增加的 CPU 要求為代價的,特別是對於 RSA 解密和(一次性)密鑰生成。

這取決於指數 $ e $ 和模數 $ N $ 您正在使用的。

用外行的話來說*“某物的冪 3 總是小於某物的冪 65537”*,例如:

$ x $ $ 3 $ $ < x $ $ 16 $ $ +1, $ 為了 $ x∈ℝ $ $ + $

或者一般來說:

$ x $ $ e $ $ > x $ $ e-y $ $ , $ 和 $ y>0 $

由於其循環性質,它的模量變得更加複雜,但是如果模量更大,則模量的最大值可能會更大:

$ max( x $ % $ N ) > max( x $ % $ (N - n) ), $ 和 $ n>0 $

話雖如此,可以計算密碼的最大大小,有關更多資訊,請參閱Maarten 的回答。通常,密文使用的位數幾乎與公共模數中的位數一樣多 $ N $ ,認為 RSA 以一種終端安全的方式使用。

這意味著密碼長度通常(使用常見的 RSA 實現)不依賴於指數的大小 $ e $ , 僅僅是因為 $ e $ 高到可以除以模數 $ N $ . 但是,如果沒有適當的 padding,使用一個小的 $ e $ 未能獲得足夠高的產品以被除以 $ N $ . 舉個例子(這裡計算):

  1. 選擇 $ e $ = 3
  2. 選擇一個 $ N $ 為此 $ ϕ(N) $ 與 e 互質,這意味著 $ N $ 作為 2 個大素數的乘積 $ p $ = gcd( $ p $ - 1, $ e $ ) = 1 和 $ q $ = gcd( $ q $ - 1, $ e $ ) = 1,例如 $ p $ = 134113233377 和 $ q $ = 171012421319(來自此列表)==> $ N $ = $ p $ X $ q $ = 22935028770720897164263(76 位)
  3. 計算一下 $ d $ = 15290019180277181006379(76 位)
  4. 以明文形式輸入這些數字 $ M $ 並將其與他們得到的密碼進行比較 $ C $ :
  M: 1             -&gt; C: 1                        (1 bit)
  M: 13            -&gt; C: 2197                     (12 bit)
  M: 134           -&gt; C: 2406104                  (20 bit)
  M: 1349          -&gt; C: 2454911549               (32 bit)
  M: 13497         -&gt; C: 2458735114473            (44 bit)
  M: 134975        -&gt; C: 2459008378109375         (54 bit)
  M: 1349752       -&gt; C: 2459019309075947008      (64 bit)
  M: 13497527      -&gt; C: 2459023134921900302183   (72 bit)
  M: 134975276     -&gt; C: 4975384384602091248435   (73 bit)
  M: 1349752761    -&gt; C: 21423635623920893065273  (75 bit)
  M: 13497527614   -&gt; C: 4504951087215542921902   (72 bit)
  M: 134975276143  -&gt; C: 13105173284468409708818  (74 bit)
  M: 1349752761432 -&gt; C: 258234696569487676944    (68 bit)

如您所見,密碼的大小停止在 75 位,所以長度( $ C $ ) ≤ l( $ d $ ) - 1 = l( $ N $ ) - 1

很明顯,這種加密是完全不夠的,不僅僅是因為密碼大小太低 $ M $ = 1349752,但更是如此,因為 $ M $ 的 134、1349、13497 直到 13497527 都以數字“24”開頭( $ M $ 的 134975、1349752 和 13497527 甚至都以“24590”開頭)。

讓我們對另一個做同樣的事情 $ e $ :

  1. 選擇 $ e $ = 65537(而不是 3)
  2. 計算一下 $ d $ = 4510925444415510242433(72 位)
  3. 以明文形式輸入這些數字 $ M $ 並將其與他們得到的密碼進行比較 $ C $ :
  M: 1             -&gt; C: 1                        (1 bit)
  M: 13            -&gt; C: 17466161323880056389598  (72 bit)
  M: 134           -&gt; C: 2107714247256743075865   (72 bit)
  M: 1349          -&gt; C: 7477203662088274241639   (73 bit)
  M: 13497         -&gt; C: 5132009836650541594940   (73 bit)
  M: 134975        -&gt; C: 16541984621407927196414  (74 bit)
  M: 1349752       -&gt; C: 20887420686729795448028  (75 bit)
  M: 13497527      -&gt; C: 21682424773647631361120  (75 bit)
  M: 134975276     -&gt; C: 3676623109854753818222   (72 bit)
  M: 1349752761    -&gt; C: 22872817161688280222695  (75 bit)
  M: 13497527614   -&gt; C: 18762631911648547002249  (74 bit)
  M: 134975276143  -&gt; C: 21146132359162765255647  (75 bit)
  M: 1349752761432 -&gt; C: 14030823333728076106071  (74 bit)

大小再次停止在 75 位,所以長度( $ C $ ) ≤ l( $ d $ ) - 1 = l( $ N $ ) - 1

在此範例中,密碼大小始終為 72 到 75 位,加密看起來也是隨機的,所以 $ e $ 選擇得足夠充分。它還表明 $ d $ 不能衡量密碼的最大長度,而只能衡量模數 $ N $ 設置這個最大長度。

對於低的問題的進一步解釋 $ e $ ,看看這個答案,參考這篇論文。基本上它說低 $ e $ 允許重建私鑰 $ d $ 如果一些位 $ d $ 被洩露。所以即使有適當的隨機填充, $ e $ = 3 在 RSA 實現中可能應該避免(甚至還有更多的問題與低 $ e $ 例如,在使用三個不同的公鑰加密的情況下,在這裡解釋,這只會加強我的觀點)。

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