Encryption
只能簽署文本的服務可以用於加密/解密嗎?
這在某種程度上是一個理論問題,但我也對這在實踐中是否可能感興趣。
假設有一個服務擁有一個私有 RSA 密鑰,並且可以在使用密碼解鎖密鑰後使用該密鑰簽署任何數據。類似於 ssh 代理的東西。解鎖後,您可以通過協議與該服務通信,但無法以任何方式訪問(解鎖的)私鑰。您將要簽名的數據交給服務,它會返回簽名。你也有相應的公鑰。
現在的問題是,這個服務能不能用來加解密?我正在考慮這樣的加密方式:
- 您使用密碼解鎖服務。
- 您有要加密的明文。
- 您生成隨機數據塊。
- 您要求服務簽署此數據。您使用公鑰驗證簽名。
- 您將簽名(或它的一些散列)視為對稱加密/解密的密鑰,例如 AES 密鑰。
- 你用這個密鑰加密明文,得到一個秘密。
- 你儲存
- 秘密,以及
- 您用於創建簽名的隨機數據。
當你想解密一個秘密時:
- 您使用密碼解鎖服務。
- 您獲取儲存的隨機數據。
- 您要求服務使用其私鑰對其進行簽名。您使用公鑰驗證簽名。
- 您將簽名(或它的一些散列)視為 AES 密鑰。
- 您使用 AES 密鑰解密該密鑰。
我承認,我對密碼學知之甚少,但對我來說,這似乎是解決問題的好(=安全)算法,至少在理論上是這樣。我錯過了什麼嗎?這在實踐中是否已經知道/使用過?
簽名算法需要是確定性的。只有基於 PKCS#1 v1.5 的 RSA 簽名是確定性的;大多數其他現代(和流行)算法使用隨機輸入作為簽名。如果簽名是隨機的,那麼您的加密和解密密鑰將不同,並且協議將失敗。
隨機數據塊不保密(如果您可以在兩方之間保密,則不需要簽名服務)。任何人都可以訪問該 blob。因此,任何有權訪問該服務的人都將能夠生成用於派生密鑰的簽名。
因此(在編輯之後)該方案可用於生成對稱密鑰。但請注意,每當私鑰更改或私鑰用於不同的非確定性方案時,它都會失敗。但是,如果簽名是確定性的,您可以生成靜態共享密鑰並將其用於進一步通信。
這很明顯,但請提醒您自己,私鑰服務的所有者也將能夠生成密鑰。您不妨隨機生成一個秘密並將其放在服務中的某個位置。那麼你就不會依賴於可用的私鑰(在密鑰管理方面,使用不同服務的密鑰是非常不受歡迎的)。