Rsa

為什麼更改文件中的某些字節後我的 SSH 私鑰仍然有效?

  • April 27, 2016

我(為了測試)只是通過在 Vim 中打開私有 RSA 密鑰並更改幾個字節來隨機更改它。它是用於登錄遠端系統的 SSH 密鑰對的私有部分。令人費解的是,它仍然允許我登錄。

我做了一些研究,發現它是一個 base64 編碼的 ASN.1 容器,所以我用 OpenSSL 提取了所有相關的整數,似乎只有 $ d $ ,私人指數,已經改變了(而且只是稍微改變了一點)。因此,是否有可能使用額外的記憶體值來解密從伺服器發送的值,以便仍然允許我登錄?由於 ASN.1 中的其他整數仍然相同,因此仍可以(如預期的那樣)導出公鑰。

由於我是加密杜弗斯,我希望能提供一些關於如何實現上述目標的指導。我發現當我大量修改 Vim 中的鍵時,它會按預期拒絕我。謝謝。

ASN.1 編碼的 SSH 私鑰按順序包含以下整數:

  • 公共模數 $ n $ 和指數 $ e $ ;
  • 私人指數 $ d $ ;
  • 主要因素 $ p $ 和 $ q $ 的 $ n $ ;
  • “減少的”私人指數 $ d_p=d\bmod(p-1) $ 和 $ d_q=d\bmod(q-1) $ ;
  • “CRT 係數” $ q_{\text{inv}}=q^{-1}\bmod p $ .

觀察到的值 $ d $ 在這樣的關鍵可能無關緊要是由於以下原因: 加快取模取冪 $ n $ 大約是一個因素 $ 4 $ ,中國剩餘定理可用於計算結果模 $ p $ 和 $ q $ 分別然後將它們組合以獲得“真實”結果模 $ n $ . 通過這種優化, $ n $ , $ e $ 和 $ d $ 不是必需的,因此在任何時候都會被典型實現忽略 $ p $ , $ q $ , $ d_p $ , $ d_q $ 和 $ q_{\text{inv}} $ 可用*。這就是為什麼更改鍵中間的某些字元不一定會破壞它,具體取決於您更改的組件。

*) 至少對於 OpenSSH,它們不必存在:設置 $ p=q=1 $ 和 $ d_p=d_q=q_{\text{inv}}=0 $ 使實現使用 $ n $ 和 $ d $ .

為了視覺化各個組件的排列,我從一個典型的 4096 位 RSA 私鑰文件創建了以下圖形:

突出顯示編碼數字的 RSA 私鑰

開頭的灰色部分是 ASN.1 標頭數據(編碼序列即將跟隨的事實等),後面是構成上述密鑰的整數。與每個組件關聯的 ASN.1 標頭數據(主要是長度欄位)的顏色比表示整數本身的數據略亮。請注意,圖中的細分並非 100% 準確,因為一個 Base64 字元大致編碼 $ 3/4 $ 原始字節,因此某些邊界實際上應該嚴格在單個字元內執行。

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