RSA 加密和解密以及 RSA 簽名之間的實際區別是什麼?
出現這個問題是因為我正在使用 Windows 的 CNG 庫,它有 4 個 RSA 函式:
- BCryptEncrypt(私鑰,消息)
- BCryptDecrypt(公鑰,消息)
- BCryptSignHash(私鑰,散列消息)
- BCryptVerifySignature(公鑰、簽名、散列消息)
所以我想知道,“加密+解密”和“簽名+驗證”有什麼區別嗎?我的意思是,如果我對消息進行雜湊處理然後對其進行加密,那與簽署它不一樣嗎?還是我錯過了該功能背後的一些邏輯?(一般談論 RSA,而不是關於 Windows 的 CNG 的工作方式)。
我看到的唯一明顯區別是:
- 對於加密和解密,我可以使用 OAEP 和 PKCS1 填充。
- 對於簽名和驗證,我可以使用 PKCS1 和 PSS 填充。
但同樣,這是因為這些函式是如何在這個庫中創建的嗎?還是因為“操作”和輸出以不同的方式完成,具體取決於它是簽名還是加密?
如果它們不同,那麼為什麼我們需要簽名部分?用私人加密和用公共安全解密是否足以“簽署”它?
所以我想知道,“加密+解密”和“簽名+驗證”有什麼區別嗎?我的意思是,如果我對消息進行雜湊處理然後對其進行加密,那與簽署它不一樣嗎?
首先,RSA 或任何公鑰都不是加密的首選,我們更喜歡混合密碼系統,其中使用公鑰密碼術傳輸/交換密鑰,並且使用傳輸/交換的密鑰使用對稱加密方案對消息進行加密。
RSA 加密要安全,需要像PKCS#v1.5或OAEP這樣的填充方案。這封信更可取,因為有安全證明。模數大小可防止您加密任意大小,因此您需要像分組密碼一樣加密消息分割部分,然後多次執行慢速加密。
帶有 PSS 的 RSA 簽名不僅為了安全性而且為了消息大小需要散列。還有RSA 全域散列 (FDH) 簽名,可以散列和簽名,它在自適應選擇消息攻擊下存在不可偽造。
如果您散列消息然後加密,那麼除了您之外,沒有人可以驗證簽名。即使是 RSA-FDH,您也需要使用您的私鑰進行簽名。請記住,不建議同時使用密鑰進行加密和簽名。
因此,加密與簽名的主要區別在於使用的密鑰和填充要求。如果你在沒有填充的情況下加密消息,你會遇到很多攻擊,比如它是可延展的,在這裡查看更多關於 RSA 密碼系統的二十年攻擊
但同樣,這是因為這些函式是如何在這個庫中創建的嗎?還是因為“操作”和輸出以不同的方式完成,具體取決於它是簽名還是加密?
是的,操作的完成方式不同,因為它們需要不同的填充以確保安全。
如果它們不同,那麼為什麼我們需要簽名部分?
因為它們不同,所以需要不同的功能。即使它們是相同的,仍然需要這些功能來消除歧義。想想只有加密和解密功能,開發者需要告訴大家使用解密進行簽名和加密進行驗證。有些人會對簽名使用加密,這會洩露不需要的資訊。不幸的是,這是由於 RSA 同時具有加密和簽名。
用私人加密和用公共安全解密是否足以“簽署”它?
不,您需要雜湊然後簽名 RSA-FDH 和雜湊並應用 PSS 然後簽名。
signature = RSA-FDH(Hash(message))
的
signature = RSA-PSS(Hash(message))