如何使用 RSA 進行緊湊的簽名和加密?
如何將 RSA 用於具有消息恢復和加密的數字簽名,同時提供具有機密性和身份驗證的小消息傳輸,小密碼大小,以及很少或不依賴對稱/混合加密?
重複使用 RSA 密鑰對進行加密和簽名是災難性的,因為它會洩露私鑰。所以需要兩對密鑰。
RSAES-OAEP 是一個允許 RSA 加密短(比模數短)消息的系統。它很慢,並且長度限制是一個很大的限制,但它確實有效。
RSASSA-PSS 是一個使用 RSA 對消息進行簽名的系統。
因此使用 RSAES-OAEP 和接收者的加密公鑰進行加密,然後使用 RSASSA-PSS 和發送者的私鑰對密文進行簽名。
更好的解決方案是使用靜態臨時 ECDH 在接收者的靜態密鑰和發送者的臨時密鑰之間創建一個共享密鑰,然後使用 AES-GCM-SIV 之類的 AEAD 對消息進行加密,並使用對整個密文+IV+Tag 進行簽名RSASSA-PSS。
帶有消息恢復的數字簽名不提供機密性。它以比單獨傳輸消息及其簽名更緊湊的方式傳輸具有來源證明和完整性保證的消息。如果沒有簽名者的公鑰,消息是無法理解的,但由於它是公開的,因此無法保證機密性。為了增加機密性,我們需要加密,這需要另一個公鑰/私鑰對,這次由接收者擁有,用於額外的加密。
假設愛麗絲要發送一條短消息 $ M $ 給 Bob,簽名和加密。我將描述一個選項:加密然後簽名,根據RSAES-OAEP加密,根據教科書 RSA 簽名(即,使用消息恢復)進行簽名,在這種情況下可以是安全的。
預賽:
- 各方就 RSA 模數位大小達成一致 $ \ell $ (比如 4096 位)和RSAES-OAEP參數(比如 SHA-512 雜湊,帶有該雜湊的 MGF1,空標籤)。這些選擇定義了密碼大小 $ k=\left\lceil\ell/8\right\rceil, $ 消息的字節數和最大長度 $ k-2,\text{hLen}-2, $ 字節(此處為 512 字節密碼,最多可保存 382 字節消息)。
- Alice 繪製了一個公共/私有 RSA 簽名密鑰對 $ (n_{\text{As}},e_{\text{As}}) $ / $ (n_{\text{As}},d_{\text{As}}) $ , 和 $ 3\cdot2^{\ell-2}<n_{\text{As}}<2^\ell $ .
- Bob 繪製了一個公共/私有 RSA 加密密鑰對 $ (n_{\text{Be}},e_{\text{Be}}) $ / $ (n_{\text{Be}},d_{\text{Be}}) $ , 和 $ 2^{\ell-1}<n_{\text{Be}}<3\cdot2^{\ell-2} $ , 因此 $ 2^{\ell-1}<n_{\text{Be}}<n_{\text{As}}<2^\ell $ ,我們需要它來保證正確性。
- Bob 獲得 Alice 的 $ (n_{\text{As}},e_{\text{As}}) $ 在某種程度上確保他可以信任它(可能在公鑰證書中)。
- 愛麗絲獲得鮑勃的 $ (n_{\text{Be}},e_{\text{Be}}) $ 在某種程度上確保她可以信任它(可能在公鑰證書中)。
加密和簽名:
- 愛麗絲加密 $ M $ 根據帶有 Bob 的公共加密密鑰的 RSAES-OAEP $ (n_{\text{Be}},e_{\text{Be}}) $ ,在步驟 3b之後停止。這產生整數 $ c\gets m(M,\text{PS})^{e_{\text{Be}}}\bmod n_{\text{Be}} $ , 在哪裡 $ m $ 已將OAEP 填充應用於 $ M $ 具有隨機性 $ \text{PS} $ .
- Alice 教科書-RSA-signs $ c $ 作為 $ s\gets c^{d_{\text{As}}}\bmod n_{\text{As}} $ .
- 愛麗絲變身 $ s $ 到字節串 $ S $ 並將其輸出,如 RSAES-OAEP 加密步驟 3c 和 4中一樣,並以他可以假定消息來自 Alice 的方式將其發送給 Bob。
簽名驗證和解密
- 鮑勃得到了所謂的 $ S $ 並且據說它來自 Alice,因此獲取了相應的可信公鑰 $ (n_{\text{As}},e_{\text{As}}) $
- 鮑勃檢查 $ S $ 是 $ k $ -byte 在RSAES-OAEP 解密步驟 1b中
- 鮑勃解碼 $ S $ 進入 進入 $ s $ 如RSAES-OAEP 解密步驟 2a
- 鮑勃檢查 $ s<n_{\text{As}} $
- Bob 計算 $ c\gets s^{e_{\text{As}}}\bmod n_{\text{As}} $
- Bob使用如上修改的 1b 和 2a執行RSAES-OAEP 解密,產生 $ M $ 或錯誤指示。
鮑勃有保險 $ M $ 來自愛麗絲,既沒有被篡改,也沒有被截獲。參數:在加密步驟 1 之後, $ c $ 在範圍內與隨機無法區分 $ [0,n_{\text{Be}}) $ 除了鮑勃以外的任何人。那 $ c $ 因此在 $ [0,n_{\text{As}}) $ ,以便在解密步驟 5 中正確撤消 textbok-RSA 簽名;並且在該區間內是足夠隨機的,以確保教科書 RSA 簽名的安全性,然後是在不同模數上執行的 RSAES-OAEP 的嚴格冗餘檢查。
實際上,每個參與者都需要不同的密鑰對來進行簽名和加密。這是學術上正確的方法(一個功能,一鍵)。但是一些從業者希望每個參與者都有一個密鑰對。
最簡單的:
- Alice 確保她沒有使用 $ n_{\text B} $ 匹配她 $ n_{\text{A}} $ ,因為這可能會破壞機密性。這意味著 Alice 不能對她自己進行加密(這在某些時候很有用,例如對於密碼或大文件的對稱密鑰)。
- 重複加密步驟 1 直到 $ c<n_{\text{A}} $ .
一種對自我加密具有相同限制但避免加密迭代的民間傳說方法:
- 簽名步驟 2 更改為 $ s\gets\left(\min\left(c,n_\text{B}-c\right)\right)^{d_{\text{A}}}\bmod n_{\text{A}} $
- 反之,在驗證步驟6中,在RSAES-OAEP解密步驟2b之後,應該執行 $ m\gets\min(m,n_\text{B}-m) $ . 這將確保解密成功。但鮑勃應該小心不要洩露關於 $ m $ 在這個額外的步驟中,特別是對高階字節沒有可測量的時間依賴性 $ m $ ,否則 Daniel Bleichenbacher對基於 RSA 加密標準 PKCS #1 的協議(在Crypto 1998 的程序中)的選擇密文攻擊的小改編可用於破譯加密給 Bob 的消息,或偽造 Bob 的簽名。