Elliptic-Curves
ECDH 的 openssl 實現是否缺少某些內容?
來自OpenSSL 維基:
另請注意,派生的共享密鑰不適合直接用作共享密鑰。通常,共享密鑰首先通過某個散列函式傳遞,以生成密鑰。
我對 ECDH 的理解是它會生成一個非常安全的共享密鑰。為什麼它也必須被散列?
有兩個原因:
原因一是ECDH共享密鑰不均勻分佈;並非所有值都是可能的。特別是,和 $ x $ 這不是橢圓曲線方程的可能解,根本不可能發生。
使用共享密鑰(例如 AES)的事物通常被假定為具有統一的密鑰;也就是說,所有鍵都是可能的(並且是等機率的);這在直接使用 ECDH 共享密鑰時是不可能的。
在實踐中,這可能無關緊要。很難想像一種攻擊變得實用,因為有一半可能 $ x $ 座標是不可能的。
原因二是並非 ECDH 共享密鑰的所有位實際上都是獨立的。如果共享秘密位的一部分開始進入 $ y $ 協調,那麼如果攻擊者以某種方式獲得 $ x $ 座標位,他得到 $ y $ 免費座標位(嗯,兩種可能性之一)。
我們盡量避免洩露密鑰的某些位;但是有一些位意味著其他位不是我們想要的。適當的 KDF(密鑰派生函式)可以避免這種可能性。
注意:原因二不適用於所有橢圓曲線;例如,對於 Curve25519,我們沒有顯式計算 $ y $ 值,因此它不能作為共享機密的一部分。但是,它存在於其他曲線。