使用 RSA 簽署 GCM 身份驗證標籤是否有意義?
為了實現雙重保險認證,我們可以使用 RSA 對 GCM 最終標籤進行簽名嗎?使用 RSA,沒有人能夠創建自己的標籤,因為私鑰是未知的。
但是,根據 FIPS.186-4,看起來 RSA 的輸入必須符合 NIST 批准的散列函式。
這種 GCM + RSA 組合可能嗎?
不多; 使用 RSA 對 GCM 標籤進行簽名是不夠的。
首先,知道 AES 密鑰,很容易製作具有任何所需內容的消息(最後除外),以及檢查並具有任何所需標籤的 AES-GCM 密碼。因此,任何 AES 密鑰的持有者都可以在截獲由該人簽名的密文後,在另一個人的 RSA 公鑰下偽造通過驗證的消息。
此外,持有 AES 密鑰的人可以準備兩條非常不同的消息,並且它們的 AES-GCM 加密共享相同的標籤,從而允許通過顯示一條消息的簽名也適用於另一條消息來傳播 FUD。
此外,如果對標籤進行了 RSA 簽名,那一定不能使用教科書 RSA,這在直接簽署小值時是不安全的 $ m $ 例如 128 位標籤(例如,當 $ e $ 是如此之小以至於 $ m^e<n, $ , 或在Desmedt-Odlyzko 攻擊下 $ e $ ).
一種適當的方法是先簽名後加密:使用 RSA 對明文進行簽名(例如,根據 RSASSA-PSS 或 RSASSA-PKCS1-v1_5),附加簽名,然後整體使用 AES-GCM。這樣,只有 RSA 私鑰的持有者(而不是任何 AES-GCM 密鑰的持有者)才能在相應的公鑰下發出通過驗證的有效消息;並且在解密之前無法訪問簽名(披露有關已簽名內容的資訊)。
在這裡我不推薦先加密然後簽名,因為我不排除完整性可能容易受到替換原始 AES 密鑰的影響。
通常使用 RSA 密鑰簽署密鑰協議。密鑰協議用於建立 GCM 中使用的密鑰。一般來說,密鑰畢竟不是使用某種帶外程序分發的。之後,GCM 身份驗證標籤應為消息完整性和真實性提供足夠的安全性。
另一個問題是,如果使用簽名,任何人都可以替換它。出於這個原因,通常使用 sign-then-encrypt 而不是 encrypt-then-sign。
如果案例需要這種構造,只需為 encrypt-then-sign 簽名身份驗證標籤可能會很有趣。但是,在這種情況下,可以使用正常的簽名生成過程。請注意,例如 RSA-PSS 使用散列將散列填充到密鑰的大小(在內部使用 MGF1),並且模冪運算比 128 位上的單個散列計算量大得多(這將轉化為散列內部單個塊用於 SHA-2)。