可交換和可組合的非對稱加密/解密
我需要以下加密屬性: $ f(g(v_\text{plaintext}) = v_\text{ciphertext} $ 需要通過以下方式解密 $ f^{-1}(g^{-1}(v_\text{ciphertext})) $ 和 $ f $ 和 $ g $ 需要不同。這個想法是這樣的。
- 使用者將使用他們控制的私鑰加密一些明文(數據庫憑據)。 $ g(v_\text{plaintext}) $
- 伺服器將要加密 $ g(v_\text{plaintext}) $ 使用它控制的私鑰。 $ f(g(v_\text{plaintext})) = v_\text{ciphertext} $ .
- 將來某個時候,伺服器會要求使用者使用他們的私鑰解密並將結果發送回伺服器。 $ g^{-1}(v_\text{ciphertext}) $ .
- 伺服器將獲取上一步的結果並解密密文: $ f^{-1}(g^{-1}(v_\text{ciphertext})) = v_\text{plaintext} $ .
我覺得這個程序可取的原因是:
- 數據庫憑據( $ v_\text{plaintext} $ ) 永遠不會通過未加密的線路發送
- 數據庫憑據的所有者能夠在他們身邊加密(客戶端使用 $ g $ )。
任何人都知道可以讓我到達那裡的一組密碼原語嗎?
任何人都知道可以讓我到達那裡的一組密碼原語嗎?
Pohlig-Hellman 密碼
$$ 1 $$似乎是正確的大方向。 這個算法是一個密鑰算法,它是這樣完成的:有一個公共素數 $ p $ , 每一方都有一個秘鑰 $ a $ (或者 $ b $ 另一方持有的另一個密鑰)。
加密很簡單, $ E_a(m) = m^a \bmod p $ ,要解密,你計算 $ a^{-1} \bmod p $ 然後計算 $ D_a(c) = c^{a^{-1}} \bmod p $
這種加密具有以下性質 $ E_a(E_b(m)) = E_b(E_a(m)) $ (因為他們都是 $ m^{ab} \bmod p $ ),因此您可以按任何順序解密(就像您要求的那樣)。
而且,它還具有聽到的人的屬性 $ E_a(m), E_b(m), E_a(E_b(m)) $ 無法恢復 $ m $ ; 我懷疑這是您場景中的一個重要屬性。
您的協議設計似乎可以使用對稱密碼,例如 Pohlig-Hellman(因為在您的協議中,使用者執行所有 $ g $ 操作和伺服器完成所有 $ f $ 操作)。如果您決定需要一個非對稱密鑰(即有人可以使用公鑰加密並使用私有密鑰解密),那麼顯而易見的方法是使用集成加密系統方法擴展 Pohlig-Hellman;還有一個公共發電機 $ g $ , 並且有一個私鑰是一個值 $ x $ , 和公鑰 $ g^x \bmod p $ . 加密一個值 $ m $ ,加密器:
- 選擇一個隨機值 $ y $
- 計算 $ g^y \bmod p $ 和 $ (g^x)^y \bmod p $
- 計算 $ z = \text{kdf}( (g^x)^y \bmod p ) $ (使用輸出較長的密鑰推導函式,如 SHAKE)
- 輸出密文 $ g^y \bmod p, m^z \bmod p $
解密算法很明顯。而且,如果後來的 Pohlig-Hellman 操作(對稱或非對稱)只修改了第二個組件而保持第一個組件不變,則保留交換性屬性。
$$ 1 $$:實際上,似乎很難找到這方面的論文——所有對 Pohlig-Hellman 的搜尋都傾向於將您指向同一發明者的離散對數算法。您可以搜尋基於基本相同想法的“Shamir 三通”算法……