Leighton-Micali 基於散列的簽名密鑰大小
我正在使用 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^h
OTS 私鑰組成。問題
- 任何 LMS 參數集都可以與任何 OTS 參數集一起使用是否正確?例如
LMS_SHA256_M32_H25
,對於 Merkle 樹和LMOTS_SHA_256_N32_W2
OTS 密鑰。- 這些 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
如果這些密鑰大小是正確的,那麼有人將如何安全地儲存它們?那些深默克爾樹是現實的嗎?我想計算相應的公鑰可以按需完成。
- 是的,每個 LMS 參數集都可以與任何 OTS 參數集一起使用。在NIST 關於基於狀態雜湊的簽名方案的最終建議中,定義了更多參數。
- 這些計算是正確的,但我們不需要將整個 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