橢圓曲線私鑰和公鑰實際上是如何用於加密或簽署數據的?
我已經閱讀了一篇又一篇關於曲線參數、生成器點、點操作以及如何點生成器點
priv
時間來獲得pub
點的文章,瞧,你有 ECC!這就是所有文章停止的地方。但是在加密或簽名過程中用於修改數據的數字priv
和點如何呢?pub
橢圓曲線最簡單的應用是Diffie-Hellman 密鑰協議。在一個曲線 $ E/k $ 在一個領域 $ k $ 有一個標準基點 $ P \in E(k) $ 大素數的 $ \ell $ 之間 $ k $ -有理點(鬆散地,其點 $ x $ 和 $ y $ 座標在 $ k $ ,而不是在域擴展中 $ k $ ),Alice 選擇一個統一的隨機標量 $ a \in \mathbb Z/\ell\mathbb Z $ 並發表觀點 $ A = [a]P $ , 標準基點的標量乘法 $ P $ 經過 $ a $ ; 鮑勃也這樣做 $ b $ 和 $ B = [b]P $ . 現在 Alice 可以計算$$ [a]B = a = [a\cdot b]P, $$Bob 可以計算$$ [b]A = b = [b\cdot a]P = [a\cdot b]P. $$ 然後他們都可以將這個共同的曲線點散列成一個共享的秘密 $ k = H([a\cdot b]P) $ , 並使用 $ k $ 用於對稱密鑰認證加密,例如 AES-GCM。
這是一個高層次的概述——當然,在細節方面有一些問題,比如如何選擇曲線、如何表示曲線點、如何執行計算等,其中一些在SafeCurves中得到了解決。
但是公鑰加密和公鑰簽名呢?
加密
而不是使用長期密鑰對 $ (a, A) $ ,當 Alice 想向 Bob 發送消息時,她可以生成一個臨時秘密標量 $ t $ , 計算一個臨時公鑰 $ T = [t]P $ , 計算一個臨時會話密鑰 $ k = H([t]B) = H([t\cdot b]P) $ , 並傳輸 $ T $ 作為與對稱密鑰 AEAD 框(與關聯數據進行身份驗證加密)的關聯數據 $ k $ .
然後鮑勃,在收到 $ T $ 和一個 AEAD 框,計算 $ k = H([b]T) = H([t\cdot b]P) $ ,並使用它來打開 AEAD 框。
而已。這只是一個帶有臨時密鑰對的 DH 密鑰協議。
簽名
有一些基於橢圓曲線的不同簽名方案。有關傳統橢圓曲線簽名方案中的一些設計選擇的詳細討論,請參閱djb 關於如何設計橢圓曲線簽名系統的部落格文章。這是幾個(非常不同的)範例:
範例 1:EdDSA:愛德華茲曲線數字簽名算法(簡化)
這是廣泛使用的 Ed25519 簽名方案的一般形式,它被廣泛部署、理解並被許多人認為是現代標準簽名方案。
參數。 一個領域 $ k $ ,扭曲的愛德華茲曲線 $ E/k: y^2 - x^2 = 1 - d x^2 y^2 $ 在場上 $ k $ , 一個標準基點 $ B \in E(k) $ 大素數的 $ \ell $ , 和一個雜湊函式 $ H\colon {0,1}^* \to {0,1}^{512} $ .
公鑰。 公鑰是一個點的表示 $ A \in E(k) $ .
簽名。 消息上的簽名 $ m $ 是一個點的表示 $ R \in E(k) $ 和一個標量 $ s \in \mathbb Z/\ell\mathbb Z $ 滿足驗證方程$$ [s] B = R + [H(\underline R \mathbin\Vert \underline A \mathbin\Vert m)] A. $$ 這裡 $ [s]B $ 表示點的標量乘法 $ B $ 由標量 $ s $ , 和 $ \underline R $ 表示點的位串編碼 $ R $ .
私鑰。 私鑰是一個秘密的 256 位字元串 $ k $ 均勻隨機選擇。512 位雜湊 $ H(k) $ 被分成兩個 256 位的兩半,第一半被解釋為一個標量 $ a \in \mathbb Z/\ell\mathbb Z $ 第二個作為位串 $ h $ .
簽署消息 $ m $ ,簽名者計算標量 $ r = H(h \mathbin\Vert m) $ , 點 $ R = [r]B $ , 和標量$$ s = r + H(\underline R \mathbin\Vert \underline A \mathbin\Vert m) a. $$
驗證以這種方式創建的簽名是否滿足驗證方程留給讀者作為練習。
範例 2:使用基於配對的密碼學的BLS 簽名
Boneh-Lynn-Shacham 簽名方案使用一個稱為配對的函式,它是一個雙線性映射 $ e\colon E(k) \times E(k) \to G $ 從組 $ E(k) $ 的 $ k $ 曲線上的有理點 $ E/k $ 帶有現場座標 $ k $ 到一個乘法群 $ G $ ,通常是乘法群 $ (\mathbb Z/p\mathbb Z)^\times $ 整數模素數 $ p $ .
“雙線性”意味著如果 $ X $ , $ Y $ , 和 $ Z $ 是元素 $ E(k) $ , 然後 $ e(X + Y, Z) = e(X, Z) \cdot e(Y, Z) $ 和 $ e(X, Y + Z) = e(X, Y) \cdot e(X, Z) $ ,即兩個輸入的相加會導致輸出相乘。這進一步意味著標量乘法 $ [a]X $ 曲線進行冪運算 $ g^a $ 在目標群體中: $ e([a]X, [b]Y) = e(X, Y)^{a b} $ .
基於配對的密碼學沒有被廣泛部署,它的安全性也沒有被很好地理解,但它承認非常短的簽名(例如,Ed25519 的一半大小,具有可比的推測安全性曲線),而且很容易說明.
參數。 一個領域 $ k $ , 一條橢圓曲線 $ E/k $ , 團體 $ G $ , 雙線性映射 $ e \colon E(k) \times E(k) \to G $ , 一個標準基點 $ B \in E(k) $ 大素數的 $ \ell $ , 和一個雜湊函式 $ H\colon {0,1}^* \to E(k) $ 將消息映射到曲線點。
公鑰。 公鑰是一個點的表示 $ P \in E(k) $ .
簽名。 消息上的簽名 $ m $ 是一個點的表示 $ S \in E(k) $ 這樣$$ e(S, B) = e(H(m), P). $$
私鑰。 私鑰是秘密標量 $ p \in \mathbb Z/\ell\mathbb Z $ 這樣 $ P = [p]B $ , 的標量乘法 $ B $ 經過 $ p $ .
簽署消息 $ m $ ,簽名者只需計算 $ S = [p] H(m) $ .
驗證以這種方式創建的簽名是否滿足驗證方程留給讀者作為練習。