Hash

Leighton-Micali 基於散列的簽名密鑰大小

  • April 8, 2021

我正在使用 RFC for Leighton-Micali Hash-Based Signatures: RFC-8554。問題是我是否理解正確並且我對密鑰大小的計算是否正確。

基本上,LMS 使用幾個 Winternitz-One-Time-Signature 密鑰。


Winternitz-OTS

在 RFC 的第 4.1 章中提到了 OTS 密鑰的參數集:

 |------------------------------------------------------------|
 | Parameter Set Name  | H      | n  | w | p   | ls | sig_len |
 |------------------------------------------------------------|
 | LMOTS_SHA256_N32_W1 | SHA256 | 32 | 1 | 265 | 7  | 8516    |
 |                     |        |    |   |     |    |         |
 | LMOTS_SHA256_N32_W2 | SHA256 | 32 | 2 | 133 | 6  | 4292    |
 |                     |        |    |   |     |    |         |
 | LMOTS_SHA256_N32_W4 | SHA256 | 32 | 4 | 67  | 4  | 2180    |
 |                     |        |    |   |     |    |         |
 | LMOTS_SHA256_N32_W8 | SHA256 | 32 | 8 | 34  | 0  | 1124    |
 |------------------------------------------------------------|

其中n是雜湊函式輸出的字節p數, 是 n 字節字元串元素的數量。這基本上意味著對於 OTS 私鑰,我們有n * p密鑰(+ 4 個字節用於類型程式碼)。這也適合給定的簽名長度sig_len(校驗和的 n * p + 4 + 32 字節)。OTS 公鑰與私鑰等長。

管理系統

在 RFC 的第 5.1 章中提到了 LMS 密鑰的參數集。

+--------------------+--------+----+----+
| Name               | H      | m  | h  |
+--------------------+--------+----+----+
| LMS_SHA256_M32_H5  | SHA256 | 32 | 5  |
|                    |        |    |    |
| LMS_SHA256_M32_H10 | SHA256 | 32 | 10 |
|                    |        |    |    |
| LMS_SHA256_M32_H15 | SHA256 | 32 | 15 |
|                    |        |    |    |
| LMS_SHA256_M32_H20 | SHA256 | 32 | 20 |
|                    |        |    |    |
| LMS_SHA256_M32_H25 | SHA256 | 32 | 25 |
+--------------------+--------+----+----+

其中m是與每個節點關聯的字節數,h是 Merkle 樹的高度。一個 LMS 私鑰由2^hOTS 私鑰組成。

問題

  1. 任何 LMS 參數集都可以與任何 OTS 參數集一起使用是否正確?例如LMS_SHA256_M32_H25,對於 Merkle 樹和LMOTS_SHA_256_N32_W2OTS 密鑰。
  2. 這些 LMS 私鑰大小的計算是否正確: 公式:2^h * ((n * p) + 4)
  • LMS_SHA256_M32_H5 & LMOTS_SHA256_N32_W8:2^5 * ((32 * 34) + 4) = 34 944 bytes ~ 34 KB
  • LMS_SHA256_M32_H5 & LMOTS_SHA256_N32_W1:2^5 * ((32 * 265) + 4) = 271 488 bytes ~ 271 KB
  • LMS_SHA256_M32_H20 & LMOTS_SHA256_N32_W8:2^20 * ((32 * 34) + 4) ~ 1.1 GB
  • LMS_SHA256_M32_H20 & LMOTS_SHA256_N32_W1:2^20 * ((32 * 265) + 4) ~ 9 GB
  • LMS_SHA256_M32_H25 & LMOTS_SHA256_N32_W8:2^25 * ((32 * 34) + 4) ~ 37 GB
  • LMS_SHA256_M32_H25 & LMOTS_SHA256_N32_W1:2^25 * ((32 * 265) + 4) ~ 285 GB

如果這些密鑰大小是正確的,那麼有人將如何安全地儲存它們?那些深默克爾樹是現實的嗎?我想計算相應的公鑰可以按需完成。

  1. 是的,每個 LMS 參數集都可以與任何 OTS 參數集一起使用。在NIST 關於基於狀態雜湊的簽名方案的最終建議中,定義了更多參數。

  1. 這些計算是正確的,但我們不需要將整個 LMS 樹儲存在記憶體中。解決方案是將RNG的種子儲存在私鑰中並按需計算樹。需要更多的工作,但需要更少的記憶體。

計算

LMOTS 私鑰:

大小 = 4 字節 LMOTS 類型程式碼 + 16 字節標識符 + 4 字節 q + n 字節種子

例子:LMOTS_SHA256_N32_W8 = 4 + 16 + 4 + 32 = 56 byte


LMS 私鑰:

大小 = 4 字節 LMOTS 類型程式碼 + 4 字節 LMS 類型程式碼 + 4 字節 q + 16 字節標識符 + 2^h LMOTS 私鑰大小

例子:

LMS_SHA256_M32_H5 & LMOTS_SHA256_N32_W8: 4 + 4 + 4 + 16 + 2^5 * 56 = 1 820 byte

LMS_SHA256_M32_H25 & LMOTS_SHA256_N32_W1: 4 + 4 + 4 + 16 + 2^25 * 56 = 1 879 048 220 byte ~ 1.9 GB

引用自:https://crypto.stackexchange.com/questions/88769