使用填充隨機字節對 RSA 消息進行簽名是否可以?
如果使用加密安全的隨機字節填充消息,是否有任何理由比標準簽名填充方案(PKCS1 v1.5 和 PSS)更不安全?為了給“安全”這個詞的含義提供上下文,我會注意到我的唯一目的是防止其他人能夠偽造消息簽名。
讓我們從數字簽名開始;
電子簽名
一個數字簽名方案是簡單的三元組 $ Gen, Sign, Verify $ 多項式時間算法。我們想要 $ Gen $ 和 $ Sign $ 機率和 $ Verify $ 確定性的。這 $ Gen $ 輸出公鑰 $ K_{pub} $ 和私鑰 $ K_{prv} $
簽署消息 $ m $ 計算 $$ \sigma = Sign^R(K_{prv}, m) $$並輸出 $ (m,\sigma) $ . 驗證簽名計算$$ {0,1} = Verify(K_{pub},m, \sigma) $$ 並輸出 $ 1 $ 或者 $ 0 $ 因為簽名分別有效或無效。
由於第一個真正的簽名方案(拉賓簽名方案),我們在簽名之前對消息進行雜湊處理,這是安全所必需的,也可以簽署長消息。散列函式需要是抗衝突的。然後我們有;
$$ \sigma = Sign^R(K_{prv}, H, m) $$和
$$ {0,1} = Verify(K_{pub},H, m, \sigma) $$
數字簽名有各種安全級別,這裡我們看一下簽名偽造上最弱的對抗目標;
存在偽造:
一個對手 $ \mathcal{A} $ 創建任何消息/簽名對 $ (m,\sigma) $ , 在哪裡 $ m $ 沒有在合法使用者之前簽名。這 $ m $ 不必有任何意義, $ \mathcal{A} $ 不需要控制消息 $ m $ .
這是對手最弱的目標,那麼這意味著最強的方案是那些可以防止存在偽造的方案。
例如,考慮標準教科書 RSA 簽名。考慮攻擊者攔截的兩個簽名; $ \sigma_1 = m_1^e \bmod N $ 和 $ \sigma_2 = m_2^e \bmod n $ 然後 $ \sigma = \sigma_1 \cdot \sigma_2 $ 將是消息的有效簽名 $ m_1 \cdot m_2 $ . 此攻擊使用 RSA 函式的乘法屬性。
RSA-Full-Domain-Hash(獎金)
RSA-FDH 由 Mihir Bellare 和 Phillip Rogaway 於 1993 年引入
這需要一個雜湊函式 $ H_{FDH}:{0,1}^* \to \mathbb{Z}_N^* $ ( 第一的 $ * $ 是克萊因星,第二個是乘法群 $ \mathbb{Z}_N -{0} $ .) 在 1996 年產生散列函式並不容易,然而,今天我們有像 SHAKE128 這樣可以產生任意大小的 XoF。
簽名是
$$ \begin{array}{ll} \operatorname{SignFDH}{N,d}(M) & & & &&&&&\ \quad\quad y \leftarrow H{FDH}(M)\ \quad\quad \textbf{return } \sigma = y^d \bmod n\ \end{array} $$
簽名驗證是
$$ \begin{array}{l} \operatorname{VerifyFDH}{N,e}(M,\sigma) &\ \quad\quad y \leftarrow \sigma^e \bmod N&\ \quad\quad y \leftarrow H{FDH}(M)&\ \quad\quad \textbf{if } y = y’ \textbf{ then return } 1 \textbf{ else return } 0\ \end{array} $$
正如我們所看到的,攻擊者需要生成消息,而不是消息的雜湊來生成偽造。驗證是在消息上執行的,而不是在消息的雜湊上!
現在在隨機預言機模型中證明它在自適應選擇消息攻擊下是存在不可偽造的。
- 數字簽名的確切安全性:如何使用 RSA 和 Rabin、Mihir Bellare 和 Phillip Rogaway 在 1996 年進行簽名
- 關於全域雜湊的確切安全性,Coron 在 2000 年
PKCS1-v1_5 簽名方案(相關)
也稱為RSASSA-PKCS1-v1_5,其安全性終於給出
- 關於 PKCS#1 v1.5 簽名方案的安全性,Joger 等。人,2018 年。
它有一個 $ EM $ 像這樣的結構
EM = 0x00 || 0x01 || PS || 0x00 || T.
那麼它們是什麼?
- PS 是
FF
s 塊和至少 8 個八位字節(八位字節是 8 位)- T 是 H(M) 和雜湊算法標識符;
T = AlgorithmIdentifier|digest
- 第一個
0x00
保證 EM 小於模數。- 其他細節如塊的實際大小
FF
等可以在rfc 8017 第 9.2 節中找到回到 OP 問題
使用填充隨機字節對 RSA 消息進行簽名是否可以?如果使用加密安全的隨機字節填充消息,是否有任何理由比標準簽名填充方案(PKCS1 v1.5 和 PSS)更不安全?
該消息使用安全散列函式(例如 SHA-512)進行散列,因為它不是完整的域散列,所以您用隨機字節填充其餘部分。在這種情況下,它與 PKCS1-v1_5 簽名方案非常相似。除了您沒有放置邊界塊
00
並將01
它們全部替換為隨機字節和缺少的雜湊函式 id。
- 可以一個隨機的文本,已經採取 $ e $ - 次冪是簽名偽造?
不,偽造者需要提供消息 $ m’ $ 也。在驗證期間,消息的雜湊 $ \operatorname{SHA-512}(m’) $ 將被提取並與簽名中的內容進行比較。
那麼它的優點是什麼 $ EM $ 結構體?它對格式進行了額外的驗證,並且對使用的雜湊函式進行了編碼。
**結論:**堅持格式,出於安全考慮,他們有很長時間的評估。
填充的正確性應該可以從消息的散列中驗證——也就是說,給定消息的散列,相同的填充應該是可重現的。否則,“存在的偽造”將是可能的。
那麼什麼是“存在性偽造”?
基本上,您只需生成一個隨機的字節串作為您的簽名。當它被解釋為整數並提高到 e’th 次方 mod n 時,較低的 256/384/512 位將與任何其他位一樣有效,因此即使我們不知道什麼消息會產生這樣的雜湊值,我們發現了一個存在的,因此是“存在的偽造”。
要真正使攻擊起作用需要一些額外的努力,包括但不限於:
- 對帶有許多隨機消息的驗證指數進行雜湊函式的碰撞攻擊。
- 對於小模數,GNFS 可能會產生與候選消息摘要匹配的部分低位比特的結果。
正如@fgrieu 在評論中指出的那樣,該問題提出了一個無法普遍適用的假設情況,從而使其成為一個錯誤命題。