Elliptic-Curves

了解 ECDSA P256 的範例

  • April 22, 2020

我是密碼學新手,我在一個不錯的網站上找到了以下範例,但我無法理解使用的大部分術語(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_xR_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.XRprime.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像往常一樣指出我犯的許多錯誤;並原諒源源不斷的編輯。

引用自:https://crypto.stackexchange.com/questions/80137