RSA 和 OpenSSL 有什麼問題?
我們都知道,對文件進行簽名就是使用簽名者的私鑰對其雜湊進行加密。 https://commons.wikimedia.org/wiki/File:Digital_Signature_diagram.svg 我已經在網上搜尋了幾天,尋找一個簡單的線上頁面,您可以在其中使用您的私鑰簽署文本(您可以離線完成這部分),其他人可以通過輸入接收到的文本、簽名和簽名者的公鑰來驗證文本的作者。但我什麼也沒找到,只是像https://encipher.it這樣的對稱加密。所以我決定自己創建一個使用 PHP 的 OpenSSL 功能的應用程序。這是原始碼http://pastebin.com/Czp3SZHd
問題是我讀到有人說“你不能用你的私鑰加密”、“簽名與加密不同”、“沒有填充的原始 RSA 是不安全的”。
所以我很困惑。公鑰密碼學不應該是安全的嗎?也就是說,從公鑰計算私鑰是不可行的,甚至沒有用私鑰加密的明文和密文樣本。
更新:
我已將密鑰長度從 RSA-1024 更新為 RSA-2048。現在我使用帶有 RSA-PSS 的phpseclib作為預設填充進行簽名。它還使用 setHash(‘sha512’)。
資料來源: http: //pastebin.com/rSzQ5uKs
當然,我沒有考慮其他因素,如伺服器-客戶端通信、密鑰生成等。
對於密碼學家來說,*“簽署文件就是使用簽名者的私鑰加密其雜湊值”*是錯誤的,因為:
- 它特定於 RSA 和包括 Rabin 在內的表親密碼系統,甚至沒有遠端描述其他常見的簽名方案;
- 它錯過了一個重要的步驟,填充,這對於 RSA 簽名和 RSA 加密是不同的。如果我們不使用填充,則會應用一些攻擊(特別是,允許從中等數量的其他選定文件的簽名中計算文件的簽名)。
因此,問題中連結的軟體中使用的PHP
openssl_private_encrypt
被命名為可怕的(應該是openssl_RSA_sign
),但是當與 OPENSSL_PKCS1_PADDING (這似乎是預設值)一起使用時,我相信它使用RSASSA-PKCS1-V1_5,一種 RSA 簽名填充;它有點過時並且缺乏強有力的安全論據(與 RSASSA-PSS 相反),但目前完好無損。注意:連結的軟體使用 SHA-1,它已經過時,並且被我們在 cryptography 中使用的定義所破壞。它實際上在 2017 年被公開破解。
注意:連結的應用程序充其量與執行它的最弱的 Web 伺服器一樣值得信任,Web 客戶端用於訪問網站以進行簽名和用於簽名驗證,伺服器和客戶端之間的密碼學,源公鑰,私鑰的生成器以及曾經用來處理它的任何東西。