Elliptic-Curves
可調整 P-256 ECDH KDF 的“Dave Check”
我有兩個帶有硬體令牌的設備,其中包含 P-256 私鑰,它允許我使用任意公鑰計算 ECDH 共享機密。我需要建構一個可調整的密鑰派生函式,它確定性地允許雙方在給定其合作夥伴的 P-256 公鑰和調整值的情況下生成相同的密鑰。該構造必須具有這樣的屬性:計算新調整值的密鑰需要對硬體令牌進行操作,即使許多其他調整值的令牌輸出是已知的。
我想出了以下虛擬碼:
// NIST recommended way to generate a private key l = 2^256 − 432420386565659656852420866394968145599 P256Priv(ikm): (HKDF_expand(40, ikm) % (l - 1)) + 1 // point multiplication with g as the P-256 generator P256Pub(p): g * p // different function instances for different tokens tokenECDH(inPub): ECDH(tokenPriv, inPub) // Using XOR because it makes both sides symmetrical TweakableKDF(tokenECDH, peerPub, tweak, numBytes): Epriv = P256Priv(tweak) Epub = P256Pub(Epriv) HKDF_expand(numBytes, tokenECDH(Epub) ^ ECDH(Epriv, peerPub))
在我看來這是安全的,但我不想成為 Dave。(此外,我不禁想知道是否已經有標準的東西可以做到這一點;我看了一眼,很驚訝我沒有找到太多東西。)
任何問題?註釋?嘲笑的評論?
這被打破了,因為擁有
Epriv
(公共調整值的函式)允許計算tokenECDH(Epub)
給定知識的輸出tokenPub
(另一個公共值)。現在這很愚蠢,但花了幾天時間才弄清楚。
我認為你正在尋找的是不可能的。
為了看到這一點,讓我們稍微正式化一下:你有一個預言機(HW 令牌) $ T(Q)=[x]Q $ 它計算任何給定輸入點與秘密標量的標量積。你有一個整數(或一個字節序列) $ t $ - 調整 - 你有一個公共點 $ Q’ $ 來自您的伴侶,當然還有曲線的標準點 $ G $ .
現在問題要求找到一個 KDF $ K_T(t,Q’) $ 使得已知輸入元組的每一次變化 $ (t,Q’) $ 產生一個完全不可預測的值。但是,您唯一的資源是 $ T $ oracle 等如果你計算它的輸入為 $ T(f(t,G)) $ 那麼你需要找到一個確定性的 $ f $ 這樣的離散對數問題 $ f(t,G) $ 和 $ G $ 即使知道也很難 $ t $ . 否則,您當然可以使用您的解決方案 $ T(G) $ 並將找到的離散對數應用於此。