何時生成公共 ECC 密鑰?
我一直在學習 ECC 的基礎知識,對此我有點困惑:ECC 密鑰交換中的公鑰是由什麼組成的,這個公鑰是什麼時候生成的?
在https://www.youtube.com/watch?v=F3zzNa42-tQ的影片和 StackOverflow Q&A橢圓曲線密碼學的基本解釋?,據說公鑰是在密鑰交換發生時生成的。公鑰是生成器點“乘以”每一方的私鑰。因為每次握手的生成器點都會改變,所以公鑰不能事先生成。
如果是這種情況,那么生成 ECC 公鑰的目的是什麼?對於我正在處理的項目,有必要生成一個公鑰以放置在證書籤名請求中以連接 AWS。此外,還有用於創建 ECC 公鑰的 openssl 功能:
openssl ec -in ecc_private.pem -pubout -out ecc_public.pem
“公鑰”這個詞被鬆散地使用了嗎?是否有多個公鑰?
正如其他答案中已經指出的那樣 $ A $ 和 $ B $ 影片中是 Alice 和 Bob 的公鑰。公鑰是每一方生成的密鑰對的一部分,通常表示為 $ \operatorname{Gen} $ . 使用 ECC,可以隨時從私鑰生成密鑰,因為公鑰是在私鑰之後生成的。 $ \operatorname{Gen} $ 函式,即通過將私鑰值與基點相乘 $ G $ .
基點是客戶端和伺服器在握手期間商定的域參數的一部分,預計不會為 ECDH 改變。在執行臨時-臨時密鑰協商時*,每一方都會重新生成一個密鑰對*。在這種情況下,密鑰協議不執行任何一方的身份驗證,因為另一方無法信任公鑰;身份驗證是單獨執行的。可以使用任何方式執行該身份驗證,包括使用不同的靜態密鑰對的ECDSA 。在這種情況下,靜態公鑰通常位於證書頒發機構簽署的證書中。
您正在生成的是一個靜態或密鑰,其生命週期顯示在證書中(之後它不再受信任,它不會自毀)。該密鑰仍然只是私鑰 $ s $ 乘以 $ G $ 的域參數。這是一種確定性計算:因此每個密鑰對只有一個公鑰。用於此密鑰的參數可以不同於用於密鑰協商的臨時密鑰對的參數;參數由證書中公鑰的編碼表示。
所以不,這裡沒有“鬆散地”使用“公鑰”一詞。
還有短暫靜態甚至靜態靜態 Diffie-Hellman,儘管它們都不常用。在這種情況下,靜態公鑰可以是證書的一部分並受信任。因此,持有靜態密鑰的實體會被認證。例如,擁有臨時密鑰對的一方未經過身份驗證,可能需要登錄,以防它是網站使用者。
如前所述,這並沒有被使用太多。ECDH 證書並不常見,靜態 Diffie-Hellman 不提供前向保密 - 如果靜態密鑰的保密性受到損害,會話數據將變得已知。
您正在生成一個可用於身份驗證的靜態密鑰對。使用 ECDHE 密碼套件時,您還需要生成一個臨時密鑰對,但這在 TLS 實現中是隱藏的。幸運的是,生成 ECC 密鑰對相對較快:只是隨機化和點乘。這是使用 ECC 的主要好處之一。