密码学学习--签名算法

Posted by Luc on November 17, 2023

1 Elgamal 签名

1. Hashed Elgamal Scheme

SysGen: The system parameter generation algorithm takes as input a security parameter $\lambda$. It chooses a cyclic group $(\mathbb{G},p,g)$, selects a cryptographic hash function $H:\{0,1\}^{*}\rightarrow \{0,1\}^{n}$, and returns the system parameters $SP=(\mathbb{G},p,g,H)$.

KeyGen: The key generation algorithm takes as input the system parameters $SP$. It randomly chooses $\alpha\in \mathbb{Z}_{p}$, computes $g_1 = g^{\alpha}$, and returns a public/secret key pair $(pk, sk)$ as follows:

$ pk = g_1, sk = \alpha $.

Encrypt: The encryption algorithm takes as input a message $m\in \{0,1\}^{n}$, the public key $pk$, and the system parameters $SP$. It chooses a random number $r\in \mathbb{Z}_{p}$ and returns the ciphertext $CT$ as:

$CT=(C_1,C_2)=(g^r,H(g_1^r)\oplus m)$.

Decrypt: The decryption algorithm takes as input a ciphertext $CT$, the secret key $sk$, and the system parameter $SP$. Let $CT=(C_1, C_2)$. It decrypts the message by computing

$C_2\oplus H(C_1^{\alpha})=H(g_1^r)\oplus m\oplus H(g^{\alpha r})=m$.

Theorem: Suppose the hash function $H$ is a random oracle. If the CDH problem is hard, the Hashed Elgamal encryption scheme is provably secure in the IND-CPA security model with reduction loss $L=q_H$, where $q_H$ is the number of hash queries to the random oracle.

1.1 公共参数

  • $\alpha$ 是 $q$ 的原根。

1.2 Gen 过程

  • 随机选择 $X_A \in \mathbb{Z}$, $1 < X_A < q - 1$。

  • 计算 $Y_A = \alpha^{X_A}\bmod q$。

  • 私钥 $\{X_A\} $,公钥 $\{Y_A\}$。

1.3 Sign 过程

  • $m = H(M)$, $0 \leq m \leq q-1$。

  • 随机选择 $K \in \mathbb{Z}$, $1 \leq K \leq q-1$ 和 $gcd(K,q-1)=1$。

  • 计算 $S_1 = \alpha^{K}\bmod q$。

  • 计算 $S_2 = [K^{-1}(m - X_AS_1)]\bmod(q-1)$。

  • 输出签名 $(S_1, S_2)$。

1.4 Vrfy 过程

  • 计算 $V_1 = \alpha^m\bmod q$。

  • 计算 $V_2 = [(Y_A)^{S’_1}(S’_1)^{S’_2}]\bmod q$。

  • 验证 $V_1 \overset{\text{?}}= V_2$。

2 Schnorr 签名

2.1 公共参数

  • 选择素数 $p$ 和 $q$ , $p - 1 = 0\bmod q$。

  • 选择 $\alpha \in \mathbb{Z}$, $\alpha^q = 1\bmod p$。

2.2 Gen 过程

  • 随机选择 $s \in \mathbb{Z}$,$0 < s < q$。

  • 计算 $v = \alpha^{-s}\bmod p$。

  • 私钥 $\{s\}$,公钥$\{v\}$。

2.3 Sign 过程

  • 随机选择 $r \in \mathbb{Z}$,$0 < r < q$。

  • 计算 $x = \alpha^r\bmod p$。

  • 计算 $e = H(M\|x)$。

  • 计算 $y = (r + se)\bmod q$。

  • 输出签名 $(e, y)$。

2.4 Vrfy 过程

  • 计算 $x’ = (\alpha^{y’}v^{e’})\bmod p$。

  • 验证 $e’ \overset{\text{?}}= H(M\|x’)$。

3 DSA 签名

3.1 公共参数

  • 选择素数 $p$,$2^{L-1} < p < 2^L$,$512\leq L\leq 1024$,$L = 0\bmod 64$。

  • 选择素数 $q$,$p - 1 = 0\bmod q$,$2^{N-1} < q < 2^N$。

  • 选择 $h \in \mathbb{Z}$,$h^{(p - 1) / q}\bmod p > 1$,$1 < h < p - 1$

  • 计算 $g = [h(p - 1)/q]\bmod p$。

3.2 Gen 过程

  • 随机选择 $x\in \mathbb{Z}$,$0 < x < q$。

  • 计算 $y = g^x\bmod p$。

  • 私钥 $\{x\}$,公钥 $\{y\}$。

3.3 Sign 过程

  • 随机选择 $k \in \mathbb{Z}$,$0 < k < q$。

  • 计算 $r = (g^k\bmod p)\bmod q$。

  • 计算 $s = [k^{-1}(H(M) + xr)]\bmod q$。

  • 输出签名 $(r, s)$。

3.4 Vrfy 过程

  • 计算 $w = (s’)^{-1}\bmod q$。

  • 计算 $u_1 = [H(M’)w]\bmod q$。

  • 计算 $u_2 = (r’w)\bmod q$。

  • 计算 $v = [(g^{u_1}y^{u_2})\bmod p]\bmod q$。

  • 验证 $v \overset{\text{?}}= r’$。

4 ECDSA 签名

4.1 公共参数

  • 选择素数 $q$。

  • 选择 $a\in Z_p$ 和 $b\in Z_p$,定义椭圆曲线 $y^2 = (x^3 + ax + b)\bmod q$。

  • 椭圆曲线的基点 $G = (x_g, y_g)$。

  • 基点 $G$ 的阶为 $n$。

4.2 Gen 过程

  • 随机选择 $d\in \mathbb{Z}$,$1\leq d\leq n - 1$。

  • 计算 $Q = dG$。

  • 私钥 $\{d\}$,公钥 $\{Q\}$。

4.3 Sign 过程

  • 随机选择 $k\in \mathbb{Z}$,$1\leq k\leq n - 1$。

  • 计算 $P = (x, y)= kG$ 和 $r = x\bmod n$,如果 $r = 0$ 则重新选择。

  • 计算 $e = H(m)$。

  • 计算 $s = [k^{-1}(e + dr)]\bmod n$,如果 $s = O$ 则重新选择。

  • 输出签名 $(r, s)$。

4.4 Vrfy 过程

  • 检验 $r’$ 和 $s’$ 是否是 $[1, n - 1]$ 中的整数。

  • 计算 $e’ = H(m’)$。

  • 计算 $w = s’^{-1}\bmod n$。

  • 计算 $u_1 = e’w$。

  • 计算 $u_2 = r’w$。

  • 计算 $X = (x_1, y_1) = u_1G + u_2Q$,如果 $X = O$ 则拒绝。

  • 计算 $v = x_1\bmod n$。

  • 验证 $v \overset{\text{?}}= r’$。

5 RSA 签名

5.1 Gen 过程

  • 选择两个 $n$ 比特的素数 $p$ 和 $q$。

  • 计算 $n = p\times q$。

  • 计算 $\phi(n) = (p - 1)\times (q - 1)$。

  • 随机选择 $e\in \mathbb{Z}$,$0 < e < \phi(n)$,$gcd(e, \phi(n)) = 1$。

  • 计算 $d = e^{-1}\bmod \phi(n)$。

  • 私钥 $\{p, q, d\}$,公钥 $\{n, e\}$。

5.2 Sign 过程

  • 计算 $\sigma = m^d\bmod n$。

  • 输出签名 $\sigma$。

5.3 Vrfy 过程

  • 计算 $m’’ = \sigma’^e\bmod n$。

  • 验证 $m’ \overset{\text{?}}= m’’$。

6 SM2 签名

6.1 公共参数

  • 椭圆曲线 $E(F_q)$ 的规模 $q$ 和两个元素 $a,b\in F_q$。

  • 椭圆曲线的基点 $G = (x_G, y_G)$。

  • 基点 $G$ 的阶。

6.2 Gen 过程

  • 随机选择 $d_A\in \mathbb{Z}$,$1\leq d_A\leq n - 1$。

  • 计算 $P_A = [d_A]G = (x_A, y_A)$。

  • 私钥 $\{d_A\}$,公钥 $\{P_A\}$。

6.3 Sign 过程

  • 计算 $Z_A = H(ENTL_A\|ID_A\|a\|b\|x_G\|y_G\|x_A\|y_A)$。

  • 计算 $\overline{M} = Z_A\|M$。

  • 计算 $e = H(\overline{M})$。

  • 随机选择 $k\in \mathbb{Z}$,$1\leq k\leq n - 1$.

  • 计算 $(x_1, y_1) = [k]G$。

  • 计算 $r = (e + x_1)\bmod n$,若 $r = 0$ 或 $r + k = n$ 则重新选择。

  • 计算 $s = [(1 + d_A)^{-1}\times (k - rd_A)]\bmod n$,若 $s = 0$ 则重新选择。

  • 输出签名 $(r, s)$。

6.4 Vrfy 过程

  • 检验 $r’$ 和 $s’$ 是否是 $[1, n - 1]$ 中的整数。

  • 计算 $\overline{M}’ = Z_A\|M’$。

  • 计算 $e’ = H(\overline{M}’)$。

  • 计算 $t = r’ + s’$,若 $t = 0$ 则不通过。

  • 计算 $(x’_1 + y’_1) = [s’]G + [t’]P_A$。

  • 计算 $R = (e’ + x’_1)\bmod n$。

  • 验证 $R \overset{\text{?}}= r’$。

7 BLS 签名

7.0 预备知识

  • 双线性映射:对于阶数均为素数 $p$ 的加性群 $G_1$ 和 $G_2$,乘性群 $G_T$ ,$G_1$ 的生成元为 $P$,$G_2$ 的生成元为 $Q$。双线性映射 $e:G_1\times G_2\rightarrow G_T$ 满足以下性质:

    • 双线性性:$\forall a,b\in \mathbb{Z}:e(aP, bQ) = e(P,Q)^{ab}$;

    • 非退化性:$e(P,Q)\neq 1$;

    • 出于应用目的,$e$ 的计算应是可高效计算的。

    特别地,当 $G_1 = G_2 = G$ 时,称 $e$ 是对称的;当 $G$ 是循环群时,$e$ 是可交换的,即 $e(P,Q) = e(g^p, g^q) = e(g, g)^{pq} = e(g^q, g^p) = e(Q, P)$。

  • Computational Diffie-Hellman Problem, CDHP:对于 $G$,给定 $g^a, g^b\in G$,计算 $g^{ab}$ 是困难的。

  • Decisional Diffie-Hellman Problem, DDHP:对于 $G$,以下两个三元组的概率分布是计算不可区分的:

    • $(g^a, g^b, g^{ab})$,其中 $a,b$ 是从 $\mathbb{Z}_q$ 中独立且随机抽取的;

    • $(g^a, g^b, g^c)$,其中 $a,b,c$ 是从 $\mathbb{Z}_q$ 中独立且随机抽取的。

  • Computational co-Diffie-Hellman, co-CDH:对于 $(G_1, G_2)$,给定 $g_2, g_2^a\in G_2$ 和 $h\in G_1$,计算 $h^a\in G_1$ 是困难的。

  • Decisional co-Diffie-Hellman, co-DDH:对于 $(G_1, G_2)$,给定 $g_2, g_2^a\in G_2$ 和 $h, h^b\in G_1$,判断 $a\overset{\text{?}}= b$。如果 $a = b$,则称 $(g_2, g_2^a, h, h^a)$ 是 co-DDH 元组。

7.1 公共参数

  • Gap co-Diffie-Human group pair $(G_1, G_2)$,$|G_1| = |G_2| = p$,co-CDH 计算困难,co-DDH 计算简单。

7.2 Gen 过程

  • 随机选择 $x\in \mathbb{Z}_p$。

  • 计算 $v = g_2^x\in G_2$。

  • 私钥 $\{x\}$,公钥 $\{v\}$。

7.3 Sign 过程

  • 计算 $h = H(M)\in G_1$。

  • 计算 $\sigma = h^x\in G_1$。

  • 输出签名 $\sigma$。

7.4 Vrfy 过程

  • 验证 $(g_2, v, h, \sigma)$ 是否为 co-DDH 元组。