---
# System prepended metadata

title: ECDSA Signature Generation & Verification
tags: [' Cryptocurrency', ' Notes', NTHU]

---

---
lang: zh-tw
tags: NTHU, Notes, Cryptocurrency
date: 20210513
robots: noindex, nofollow
license: GPL-3.0
---

ECDSA Signature Generation & Verification
===
Introduction
---
- Elliptic Curve Digital Signature Algorithm (ECDSA)
    - EC 版本的 DSA
    - 基於 ElGamal 簽章系統做修改得來的
    - EdDSA 是變形版的 ECDSA，加速計算的效率且不犧牲安全性，例如：Ed25519
- 一般來說，公認 ECDSA 所需的 bit length 是兩倍於 security level
    - 例如：希望達到 80-bit security level 需要至少使用 160-bit ECDSA
    - n-bit security level 意旨攻擊者機率上需要嘗試 $2^n$ 次才能猜出 private key


Notation
---
- 情境
    - Alice 要傳送訊息給 Bob，Bob 要驗證訊息的正確性
- 符號定義
    - $E(\mathbb{F}_p)$：The *set of points* belong to the elliptic curve $E$ over $\mathbb{F}_p$
    - $G$：The base point of an EC.
    - $n$：The (additive) **order** of the base point $G$
    - $d$：Alice's private key
    - $Q$：Alice's public key
    - *msg*：The message to send
    - *HASH*( )：A cryptographic hash function (e.g., SHA-256, SHA-3)


Private Key and Public Key
---
- $d$
    - Private key
    - A **pseudorandom** integer scalar ${\in}\ [1,\ n-1]$
- $Q$
    - Public key
    - $Q=G+G+{\dots}+G=[d]G\ {\in}\ E(\mathbb{F}_p)$


Signature Generation
---
Alice 利用 $d$ 和 $Q$ 針對 *msg* 製作 ECDSA signature

1. 利用「魔法」得到 pseudorandom number $k\ {\in}\ [1,\ n-1]$ 當作 ephemeral key
2. 計算 $[k]G=(x_1,\ y_1)\ {\in}\ E(\mathbb{F}_p)$
    - 有的文件在這邊多一步「convert $x_1$ to an integer $\overline{x_1}$」
    - 用意是把 $x_1$ 從 field element over $\mathbb{F}_p$ 轉換成一般的「數字」
    - 例如：over $\mathbb{F}_{2^m}$ 的時候就需要把 bit string $x_1$ 轉成 decimal $\overline{x_1}$
3. 得到簽章的前半部分 $r={x_1}\mod{n}$
    - 若 $r=0$，則重回第 1 步從頭來過
    - 在敘述其它功能的時候，可能會多一個記號 $R=(x_1,\ y_1)=[k]G$
4. 計算 $k^{-1}\mod{n}$
    - 乘法反元素可以用 Euclidean algorithm 求得
6. 計算 *HASH*( *msg* ) 並把結果從 bit string 轉換為整數記做 $e$
7. 得到簽章的後半部分 $s=k^{-1}(e+dr)\mod{n}$
    - 若 $s=0$，則重回第 1 步從頭來過
8. 最終的簽章就是合併兩半部分 $(r,\ s)$

- 注意事項
    - 因為 $r$ 和 $s$ 都 ${\in}\ \mathbb{Z}_n$（$n$ 是 $G$ 的 order），所以簽章結果會是 private key $d$ 的兩倍長
    - 第 1 步的「魔法」很重要，每次簽章都必須使用不同的 $k$，否則可以反推出 private key $d$
    - $(r,\ -s)$ 也是合法有效的簽章，同樣可透過 verification 步驟驗證正確性
    - 因為 $r={x_1}\mod{n}$ 是同餘關係，也就是 $r=x_1+tn$ where $t\ {\in}\ \mathbb{Z}$，所以有機會出現選到某個不同的 $k'$ 使得 $[k']G=(x_1+{\square}n,\ \dots)\ {\in}\ E(\mathbb{F}_p)$，此時同樣具有 $r=x_1\mod{n}$；雖然看起來其扯無比，不過這與 public key recovery 步驟有關


Signature Verification
---
Bob 收到四樣東西：$Q$、*msg*、$r$、$s$；若 Bob 執行以下步驟出現失敗，則直接認為收到不合法簽章

0. 驗證 $Q\ {\in}\ E(\mathbb{F}_p)$ 且 $Q\ {\neq}\ \mathcal{O}$
1. 驗證 $r$ 和 $s$ 都 ${\in}\ [1,\ n-1]$
2. 計算 *HASH*( *msg* ) 並把結果從 bit string 轉換為整數記做 $e$
3. 計算 $w=s^{-1}\mod{n}$
4. 計算 $u_1=ew\mod{n}$ 和 $u_2=rw\mod{n}$
5. 計算 $X=[u_1]G+[u_2]Q\ {\in}\ E(\mathbb{F}_p)$，然後我們記做 $X=(x_1,\ y_1)$
6. 檢查 $X\ {\neq}\ \mathcal{O}$，然後取 $v=\overline{x_1}\mod{n}$
    - 和 [Signature Generation](#Signature-Generation) 第二步的邏輯相同
    - 把 $x_1$ 從 field element over $\mathbb{F}_p$ 轉換成一般「數字」$\overline{x_1}$
7. 檢查 $v=r$

- 注意事項
    - 因為計算反元素很耗時，所以最高效的實作應該只計算一次 $s^{-1}\ \mod{n}$
    - 利用 Shamir's trick 可以讓 $[u_1]G+[u_2]Q$ 的求解快一點
    - 其實 Alice 不必傳送 $Q$，利用[方法](http://www.secg.org/sec1-v2.pdf#subsubsection.4.1.6)可以透過 *msg*、$r$、$s$ 還原出 public key
- Correctness of the algorithm
    - $[u_1]G+[u_2]Q$
    - $=[ew]G+[rw]\Big([d]G\Big)$
    - $=[we+wdr]G$
    - $=[s^{-1}e+s^{-1}dr]G$
    - $=[\Big(k^{-1}(e+dr)\Big)^{-1}(e+dr)]G$
    - $=[k(e+dr)^{-1}(e+dr)]G=[k]G$
    - $\Longrightarrow$ Both of $r$ and $v$ are the x-coordinate of the $[k]G$.

Public Key Recovery
---
在傳輸頻寬非常珍貴的情況下（e.g., blockchain txn payload），其實 Alice 不需要每次都把自己的 public key $Q$ 附在 signature 當中，Bob 可以透過 *msg*、$r$、$s$ 反推得到，接著 Bob 再用其他方法查詢並比對反推結果是否吻合 Alice 事前公告的 public key


1. 利用 $r$、$(r+n)$、$(r+2n)$、、、 over $\mathbb{F}_p$ 推算出一堆可能的 $R$ 點們
    - 若 $[n]R\ {\neq}\ \mathcal{O}$，則把「這種點」排除掉、不要放進下一步
    - 原因請見 [Signature Generation](#Signature-Generation) 的注意事項
2. 計算 *HASH*( *msg* ) 並把結果從 bit string 轉換為整數記做 $e$
3. 計算 $Q=[r^{-1}]\Big([s]R-[e]G\Big)$ 和 $Q=[r^{-1}]\Big([s](-R)-[e]G\Big)$
    - 因為 EC 是對稱於 X 軸，所以會有兩個可能的 public key $Q$ 是透過 $R$ 和 $-R$ 所生出來
    - 雖然有可能得到 0、1 或 2 把 public key $Q$，但是如果有額外資訊唯一規定到底誰是正確的那把（e.g., EIP-155 `v` payload），那這一步就不必算正負 $R$
    - 通常優良的的 EC 會取 $n=\#E(\mathbb{F}_p)$（i.e., cofactor 等於一），因此第一步只會有唯一的 $R$

- Correctness of the algorithm
    - $[r^{-1}]\Big([s]R-[e]G\Big)$
    - $=[r^{-1}s]R-[r^{-1}e]G$
    - $=[r^{-1}k^{-1}(e+dr)]\Big([k]G\Big)-[r^{-1}e]G$
    - $=[r^{-1}e+d]G-[r^{-1}e]G$
    - $=[r^{-1}e+d-r^{-1}e]G$
    - $=[d]G=Q\ {\in}\ E(\mathbb{F}_p)$



Reference
---
- https://link.springer.com/content/pdf/10.1007/s102070100002.pdf
- ANSI X9.62-1998
- https://www.secg.org/sec1-v2.pdf
- https://cryptobook.nakov.com/digital-signatures/ecdsa-sign-verify-messages
- https://medium.com/cryptoadvance/how-schnorr-signatures-may-improve-bitcoin-91655bcb4744


Further Reading
---
- Elliptic Curve 與 secp256k1 筆記
    - https://hackmd.io/oFmZZHamQUOKG9DHhEV7lw
- Schnorr Signature Generation & Verification
    - https://hackmd.io/S4VkJObyRB6sdMauNLusYQ
