了解 ECDSA P256 的範例
我是密碼學新手,我在一個不錯的網站上找到了以下範例,但我無法理解使用的大部分術語(H:雜湊,K:隨機數,E =?,Kinv =?,Rx =? =RY?,R=Private key?,D?,S?同驗證)。請幫我解決這個例子的命名法/表示法/什麼是什麼,我自己試著弄清楚其他部分。提前謝謝
############################################################## Elliptic Curve Digital Signature Algorithm Curve: P-256 Hash Algorithm: SHA-256 Message to be signed: "Example of ECDSA with P-256" ############################################################## Signature Generation H: A41A41A12A799548211C410C65D8133AFDE34D28BDD542E4B680CF2899C8A8C4 E: A41A41A12A799548211C410C65D8133AFDE34D28BDD542E4B680CF2899C8A8C4 K: 7A1A7E52797FC8CAAA435D2A4DACE39158504BF204FBE19F14DBB427FAEE50AE Kinv: 62159E5BA9E712FB098CCE8FE20F1BED8346554E98EF3C7C1FC3332BA67D87EF R_x: 2B42F576D07F4165FF65D1F3B1500F81E44C316F1F0B3EF57325B69ACA46104F R_y: 3CE76603264661EA2F602DF7B4510BBC9ED939233C553EA5F42FB3F1338174B5 R: 2B42F576D07F4165FF65D1F3B1500F81E44C316F1F0B3EF57325B69ACA46104F D: C477F9F65C22CCE20657FAA5B2D1D8122336F851A508A1ED04E479C34985BF96 S: DC42C2122D6392CD3E3A993A89502A8198C1886FE69D262C4B329BDB6B63FAF1 Signature R: 2B42F576D07F4165FF65D1F3B1500F81E44C316F1F0B3EF57325B69ACA46104F S: DC42C2122D6392CD3E3A993A89502A8198C1886FE69D262C4B329BDB6B63FAF1 ============================================================= Signature Verification Q_x: B7E08AFDFE94BAD3F1DC8C734798BA1C62B3A0AD1E9EA2A38201CD0889BC7A19 Q_y: 3603F747959DBF7A4BB226E41928729063ADC7AE43529E61B563BBC606CC5E09 H: A41A41A12A799548211C410C65D8133AFDE34D28BDD542E4B680CF2899C8A8C4 E: A41A41A12A799548211C410C65D8133AFDE34D28BDD542E4B680CF2899C8A8C4 Sinv: F63AFA3939902A4CA9F019CE77E5A59FB48E4CAA50EB9601EF02809E033F9057 U: B807BF3281DD13849958F444FD9AEA808D074C2C48EE8382F6C47A435389A17E V: 1777F73443A4D68C23D1FC4CB5F8B7F2554578EE87F04C253DF44EFD181C184C Rprime.X:2B42F576D07F4165FF65D1F3B1500F81E44C316F1F0B3EF57325B69ACA46104F Rprime.Y:3CE76603264661EA2F602DF7B4510BBC9ED939233C553EA5F42FB3F1338174B5 Rprime: 2B42F576D07F4165FF65D1F3B1500F81E44C316F1F0B3EF57325B69ACA46104F Verification Passed!
ECDSA 在SEC1中指定。它的曲線 P-256 的實例在FIPS 186-4中指定(或等效地在SEC2中的名稱下
secp256r1
),並告訴它必須使用FIPS 180-4定義的 SHA-256 雜湊。我將拋開ASN.1裝飾(因為問題不使用)、整數到固定寬度的字節串之間的轉換(這些都是按照大端約定)和十六進制¹。
在 P-256 上使用 ECDSA 簽名作為輸入
- 私鑰 $ d $ (問題的
D
),這是一個 32 字節的字節串- 一條消息,它是字節串 $ M $ 的 $ 0 $ 至 $ 2^{61}-1 $ 字節
- 隨機數發生器
和輸出
一個簽名 $ S=(r,s) $ 包含由…組成
- 一個 $ r $ 組件(問題的
R
),它是一個 32 字節的字節串- 一個 $ s $ 組件(問題的
S
),它是一個 32 字節的字節串在 P-256 上使用 ECDSA 驗證簽名作為輸入
可信的公鑰 $ Q $ ,它應該是曲線 P-256 上的一個點,而不是無窮遠點。它最初被計算為 $ d,G $ 在密鑰生成期間。它由它的笛卡爾座標定義
- $ x_Q $ (問題的
Qx
),這是一個 32 字節的字節串- $ y_Q $ (問題的
Qy
),在問題中是³一個 32 字節的字節串一個消息 $ M $
簽名 $ S=(r,s) $ 在簽名過程輸出的表單中。
並輸出有效(如果消息與簽名匹配並且沒有錯誤)或無效(在所有其他情況下,除了成功的偽造)。
問題的消息是
Example of ECDSA with P-256
根據某些未指定的約定(可能是 ASCII 或 UTF-8)轉換為字節串的 27 個字元。兩者都產生相同的 27 字節字節串 $ M $4578616D706C65206F66204543445341207769746820502D323536
簽名和驗證都操縱 $ M $ 只計算它的 SHA-256 雜湊 $ H $ (問題的
H
),它是一個 32 字節的字節串。它被轉換為整數 $ e $ (問題的E
),當使用 P-256 時,SHA-256 是² $ H $ .根據SEC1 第 4.1.3 節進行簽名。簡而言之:
- 繪製一個秘密隨機數 $ k $ (問題的
K
)在範圍內 $ [1,n) $ , 在哪裡 $ n $ 是曲線 P-256 的階數。至關重要的是 $ k $ 均勻分佈在這個區間上並且獨立於其他的⁴ $ k $ .- 計算橢圓曲線點 $ R=k,G $ 曲線 P-256,其中 $ G $ 是生成點。 $ R $ 有笛卡爾座標 $ (x_R,y_R) $ (問題的
R_x
和R_y
),但只有 $ x_R $ 是需要的。- 計算 $ r=x_R\bmod n $ (問題的
R
)。如果 $ r=0 $ 出了點問題⁵ , ⁶。- 計算 $ k^{-1} $ 模組 $ n $ (問題的
Kinv
),即範圍內的整數 $ [1,n) $ 和 $ k,k^{-1}-1 $ 的倍數 $ n $ .- 計算 $ s=k^{-1}(e+r,d)\bmod n $ . 如果 $ s=0 $ ,出了點問題⁵。
- 輸出 $ (r,s) $ .
注意:簽名可能成為各種攻擊的目標,例如定時或其他側通道,以及故障注入。緩解這些攻擊是困難的。
根據SEC1 第 4.1.4 節進行驗證。簡而言之:
- 檢查點 $ Q $ 座標 $ (x_Q,y_Q) $ 是P-256的一個普通點;否則,輸出無效。
- 檢查 $ r $ 和 $ s $ 兩者都在範圍內 $ [1,n) $ ; 否則,輸出無效
- 計算 $ s^{-1} $ 模組 $ n $ (問題的
Sinv
),即範圍內的整數 $ [1,n) $ 和 $ s,s^{-1}-1 $ 的倍數 $ n $ .- 計算 $ u_1=e,s^{-1}\bmod n $ (問題的
U
)- 計算 $ u_2=r,s^{-1}\bmod n $ (問題的
V
)- 計算橢圓曲線點 $ R=u_1,G+u_2,Q $ 曲線 P-256,其中 $ G $ 是生成點,並且 $ Q $ 由公鑰決定。 $ R $ 有笛卡爾座標 $ (x_R,y_R) $ (問題的
Rprime.X
和Rprime.Y
),但只有 $ x_R $ 是需要的。- 如果 $ R $ 是無窮遠點,輸出無效。
- 如果 $ e\bmod n\ne x_R\bmod n $ ,輸出無效(見註⁶)。
- 輸出有效。
免責聲明:這包含簡化和可能的錯誤⁷。它僅用於幫助理解標準。
¹ 十六進制僅用於問題和本答案中的顯示目的。它在應用程序中的使用並不常見,並且會浪費空間。
² 一些實現避免了罕見的情況 $ e\ge n $ (在哪裡 $ n $ 是曲線 P-256 的階數)通過減少 $ H $ 模組 $ n $ 生產 $ e $ . 這不會改變簽名和驗證的結果,因此不會妨礙互操作性。
³ 如果使用點壓縮, $ y_Q $ 被減少到它的低位,它結合 $ x_Q $ 曲線方程足以完全定義點 $ Q $ .
⁴ 特別是,獨立性排除了重用。如果我們想要符合標準,這包括使用相同的密鑰簽署相同的消息時。但是,從安全形度來看,僅在這種情況下,重用較早的 $ k $ . 在一些 ECDSA 變體中,用於生成 $ k $ 作為由以下鍵控的偽隨機函式的輸出 $ d $ 帶輸入 $ H $ .
⁵ 然後建議將其視為攻擊並擦除/歸零/銷毀私鑰,儘管官方的做法是嘗試另一個 $ k $ .
⁶ 在絕大多數情況下發生沒有攻擊或故意測試, $ x_R<n $ . 官方的事情是不為所動地處理相反的事情,但這是一個值得考慮的極端情況,如果只是在簽名時按上述方式處理⁵。案子 $ e\ge n $ 很少見²(如 40 億分之一),但比較常見。
⁷感謝dave_thompson_085像往常一樣指出我犯的許多錯誤;並原諒源源不斷的編輯。