Public-Key

惡意軟體如何安全地依賴 ECDH 算法來保持密鑰的機密性?

  • May 10, 2018

在使用 RSA 方法的傳統惡意軟體(尤其是勒索軟體)中,公鑰可能被硬編碼在惡意軟體二進製文件中,並用於加密系統上生成的對稱密鑰。對稱密鑰本身用於加密使用者文件。

一些新的惡意軟體變種正在使用 ECDH 而不是 RSA。當惡意軟體分析師可以對惡意軟體二進製文件進行逆向工程以找到曲線和參數時,如何在這種情況下安全地使用 ECDH?

我對這個問題做了以下研究:

所以我理解對數問題的一般概念,在該問題中,在曲線上找到因子是不可行的(計算密集型)。但我不明白的是:如果曲線和曲線上預先約定的參數在惡意軟體中是硬編碼的,惡意軟體分析師不能對惡意軟體二進製文件進行逆向工程以找到約定的曲線和參數嗎?然後可以使用它來查找密鑰並擊敗惡意軟體嗎?如果不是,那麼惡意軟體開發人員和惡意軟體二進製文件(雙方)都可以訪問的“秘密”是什麼,但可以對二進製文件進行逆向工程的惡意軟體分析師卻沒有?例如,在 RSA 的情況下,這個秘密就是永遠不會離開攻擊者的私鑰。

快速總結。 勒索軟體通過公鑰密鑰封裝機制工作:選擇一個秘密密鑰 $ h $ 和一個封裝 $ \sigma $ 用於惡意軟體運營商的公鑰,這樣只有惡意軟體運營商才能恢復 $ h $ 從 $ \sigma $ 使用他們的私鑰;然後使用密鑰下的對稱密碼加密所有文件 $ h $ ,*擦除 $ h $ ,*並向惡意軟體運營商支付贖金以獲得 $ h $ 從…回來 $ \sigma $ .

很容易從 ECDH 等公鑰協議方案中建構公鑰密鑰封裝機制,並為接收者提供長期公鑰:為發送者生成一次性匿名密鑰對,結合發送者的私鑰用接收者的公鑰導出密鑰 $ h $ ,擦除發送者的私鑰,將發送者的公鑰作為封裝傳輸 $ h $ . 使用它作為子程序,惡意軟體就可以像使用任何公鑰密鑰封裝機制一樣工作。

細節。 首先,作為參考,這是主機上的惡意軟體可以使用公共 RSA 模數的一種方式 $ n $ ,說之間 $ 2^{2047} $ 和 $ 2^{2048} $ , 帶有秘密因式分解 $ n = pq $ 只有惡意軟體操作員知道。

  1. 選擇一個非負整數 $ x $ 以下 $ n $ 使用主機的隨機數生成器均勻隨機,例如Unix 上的 /dev/urandom 或 Windows 上的 CryptGenRandom。
  2. 計算和儲存 $ y = x^3 \bmod n $ .
  3. 計算 $ h = H(x) $ , 在哪裡 $ H\colon \mathbb Z/n\mathbb Z \to {0,1}^{256} $ 是一個隨機預言機。 例如,您可以實例化 $ H $ 在 little-endian 上使用 SHA-256 $ \lceil\log_{256} n\rceil $ -字節編碼的最小非負殘差 $ x $ .
  4. 計算和儲存 $ c = \operatorname{AES-GCM}_h(\mathit{data}) $ , 在哪裡 $ \mathit{data} $ 是您要勒索的主機持久儲存上的任何重要數據。
  5. 擦除 $ x $ , $ h $ , 和 $ \mathit{data} $ .
  6. 當倒霉的使用者支付贖金時,傳輸 $ y $ 並向惡意軟體運營商提供付款證明。

在收到 $ y $ 和支付證明,惡意軟體運營商可以使用秘密知識 $ p $ 和 $ q $ 計算 $ x = y^d \bmod n $ 在哪裡 $ d $ 解決 $ 3d \equiv 1 \pmod{\operatorname{lcm}(p - 1, q - 1)} $ ,並從那裡得出 $ h = H(x) $ 供 luser 用來解密 $ c $ 使用 AES-GCM。

該方案的安全性依賴於計算均勻隨機整數模立方根的難度 $ n $ 在不知道因式分解的情況下 $ n $ . 有一些整數的立方根取模 $ n $ 非常容易計算:首先是整數的完美立方體,因此普通實數立方根算法可以計算它們。但是絕大多數整數都不是完美的立方體,所以機率 $ y $ 恰好是一個完美的立方體可以忽略不計,我們知道計算的最便宜的算法 $ x $ 或者 $ h $ 給定 $ y $ 通過因式分解具有不可忽略的機率工作 $ n $ ,即ECM和GNFS。

它如何與 ECDH 一起工作? 修復一個標準的公共欄位 $ k $ , 說 $ \operatorname{GF}(2^{255} - 19) $ . 修復標準公共曲線 $ E/k $ , 說 $ y^2 = x^3 + 486662 x^2 + x $ . 修復標準公眾 $ k $ -理性點 $ G \in E(k) $ 大質數的,比如說 $ G = \pm x^{-1}(9) $ . 修復公眾 $ k $ -理性點 $ P \in E(k) $ 惡意軟體操作員知道一個秘密整數 $ s $ 這樣

$$ P = [s]G = \underbrace{G + G + \dots + G}_{\text{$s$ times}}. $$ 使用這些參數,主機上的惡意軟體將:

  1. 選擇一個非負整數 $ t $ 之間 $ 2^{254} $ 和 $ 2^{255} $ 它是 8 的倍數,使用主機的隨機數生成器均勻隨機,例如Unix 上的 /dev/urandom 或 Windows 上的 CryptGenRandom。
  2. 計算和儲存 $ Q = [t]G $ .
  3. 計算 $ h = H([t]P) $ .
  4. 計算和儲存 $ c = \operatorname{AES-GCM}_h(\mathit{data}) $ .
  5. 擦除 $ t $ , $ h $ , 和 $ \mathit{data} $ .
  6. 當倒霉的使用者支付贖金時,傳輸 $ Q $ 並向惡意軟體運營商提供付款證明。

在收到 $ Q $ 和支付證明,惡意軟體運營商可以使用秘密知識 $ s $ 計算

$$ [s]Q = [s\cdot t]G = [t\cdot s]G = t = [t]P, $$並從那裡得出 $ h = H([s]Q) = H([t]P) $ 供使用者用來解密 $ c $ 使用 AES-GCM。 該方案有時稱為ECIES。這對 $ (s, P) $ 作為接收者的長期密鑰對,而該對 $ (t, Q) $ 用作發送者的一次性密鑰對,用於與橢圓曲線 Diffie-Hellman 函式的公鑰密鑰協議。 像這樣選擇一次性匿名密鑰對,將公鑰密鑰協商方案轉變為公鑰密鑰封裝機制。*

該方案的安全性依賴於計算群中離散對數的難度 $ E(k) $ . 參數都是公開的;對手——在這種情況下,受勒索軟體折磨的倒霉使用者,或者他們僱用來恢復數據而無需支付贖金的 IT 專家——所不知道的所有秘密整數 $ s $ 和 $ t $ , AES-GCM 密鑰 $ h $ ,以及可憐的使用者數據。


選擇的曲線,Curve25519,承認一個快速算法計算 $ x([s]G) $ 只給 $ s $ 和 $ x(G) $ ,這就是為什麼 Diffie-Hellman 函式被稱為 X25519 的原因;我們實際上從不計算 $ y $ 座標或全點,只是 $ x $ 上面的座標,但是當一切都寫成時,符號變得很麻煩 $ x(Q) $ , $ H(x([t]P)) $ 等。*

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