使用私鑰的 RSA 加密與簽名生成相同嗎?
人們常說,使用私鑰對加密雜湊進行 RSA 加密與簽名(簽名生成)相同。該驗證包括使用公鑰解密。
在加密雜湊上使用私鑰進行 RSA 加密是否等同於簽名生成?
簡短的回答
不,使用私鑰的 RSA 加密與 RSA 簽名生成不同。RSA 加密只能使用符合RSA 標準的 RSA 公鑰執行。
術語原始 RSA或教科書 RSA通常用於表示沒有填充方案的 RSA。原始 RSA 僅由模冪運算組成。原始 RSA容易受到許多加密攻擊,一般使用不安全。
混亂的來源
經常提到簽名等同於使用私鑰對消息進行 RSA 加密(散列)。*僅當您忽略所需的填充機制時,這才是正確的。*RSA 填充機制對於加密和簽名是不同的。
兩者混淆的另一個原因是,公鑰通常用 RSA 加密的 ASN.1 OID 標識:
1.2.840.113549.1.1.1
或{iso(1) member-body(2) us(840) rsadsi(113549) pkcs(1) pkcs-1(1) rsaEncryption(1)}
. 例如,在 X.509 證書中經常出現這種情況。然而,此 OID 通常用作指向 PKCS#1 規範的通用指針;這個不幸的名字與 X.509 和 RSA 規範的歷史有關。深入了解填充方案
PKCS#1 RSA Cryptography Specifications明確定義了 RSA 加密和RSA 簽名生成的不同方案。
較舊的 PKCS#1 v1.5 標準包含兩個填充方案,通常簡稱為 PKCS#1 v1.5。然而,這些加密和簽名方案的填充是完全不同的,這反映在它們的正式名稱RSAES-PKCS1-v1_5和RSASSA-PKCS1-v1_5 - 第一個是加密方案(ES),另一個是簽名方案附附錄(SSA)。
幸運的是,新的 OAEP 加密(使用RSAES-OAEP填充)和 PSS 簽名生成方案(使用RSASSA-PSS填充)不會出現由具有相同名稱的兩個填充方案引起的混淆。因此,加密和簽名生成的填充的名稱是不同的,即使它們依賴於相同的機制(稱為遮罩生成函式或 MGF,具有一種實現:MGF1)。
對於使用公鑰的 RSA 加密和使用私鑰生成 RSA 簽名,實際的模冪運算在*數學上是相同的。*這很容易通過查看第 5.2 段的最後部分來驗證
$$ emphasis mine $$:
每個原語的主要數學運算是取冪,如第 5.1 節的加密和解密原語。RSASP1 和 RSAVP1 與 RSADP 和 RSAEP 相同,只是它們的輸入和輸出參數的名稱不同;它們是有區別的,因為它們用於不同的目的。
一般來說,如果對方正確地執行了驗證方法,通過執行 RSA 加密創建的簽名將失敗。
但是,如果使用私鑰進行加密,某些軟體庫實際上會*執行 RSA 填充來生成簽名。*一個可能的原因是 SSL/TLS;直到 v1.2 的 TLS 版本使用從 MD5 雜湊與 SHA-1 雜湊連接創建的“簽名”。這種方案通常與 RSA 實現提供的簽名生成方法不兼容,因此它們依靠 RSA 加密常式來神奇地做正確的事情。
RSA 實施說明
許多實現不允許使用私鑰進行加密。嘗試使用私鑰模擬簽名生成通常是不可能的。公鑰操作的實現通常假設一個小的公共指數。此外,他們通常不會應用用於加速私鑰操作的中國剩餘定理。
請注意,公鑰不需要防止資訊洩露,而私鑰應始終保持安全。因此,RSA 加密實現——當被程式為與公鑰一起使用時——可能不包含對側通道攻擊的保護,可能會將私鑰暴露給能夠應用側通道攻擊的攻擊者。