Hmac

這種派生多個密鑰的方案是否安全?

  • September 25, 2015

我需要一個加密方案來生成一個確定性的私鑰鏈,這些私鑰在外部觀察者看來是隨機的,但總是可以從單個根密鑰重建,還有:

  • 私鑰及其對應的公鑰都不應該包含任何關於彼此的資訊。
  • 在某些私鑰洩漏的情況下,應該不可能重建後續密鑰(當然根私鑰除外)

這是我的解決方案:

val privateKey0 = HMAC-SHA256(key: rootPrivateKey, data: "Chain")
val privateKey1 = HMAC-SHA256(key: rootPrivateKey ⊕ privateKey0, data: "Chain" || SHA256(privateKey0))
val privateKey2 = HMAC-SHA256(key: rootPrivateKey ⊕ privateKey1, data: "Chain" || SHA256(privateKey1))
...

公鑰計算為 EC secp256k1 上的曲線點乘法:

val publicKey0 = privateKey0 * G(secp256k1)

現在我不是受過訓練的密碼學家,所以我想問一下這個方案是否可行?有沒有明顯的缺陷?如果是,如何改進?

我沒有看到明顯的安全漏洞,但它似乎效率低下且不標準。

您最好始終使用根密鑰作為 HMAC 密鑰,並將 HMAC 消息/數據僅基於密鑰索引(或其他身份)而不是以前的密鑰。這樣您就可以獨立創建任何密鑰。這本質上就是HKDF在 HKDF-Expand 中所做的。

如果你想使用 HKDF-Expand,你會得到類似的東西:

val privateKey0 = HMAC-SHA256(key: rootPrivateKey, data: "key0" || 0x1)
val privateKey1 = HMAC-SHA256(key: rootPrivateKey, data: "key1" || 0x1)
...

0x1是值為 1 的字節。您可以跳過它,因為您使用與派生鍵長度相同的雜湊,但包含它可以讓您輕鬆定義如何移動到更大的橢圓曲線(即只需使用 HKDF 生成更長的鍵)。

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