SM9 algorithm design
SM9
Setup(系统建立)
- KGC 选择双线性群 ($BP = (G_1, G_2, G_T, e, N))$,生成元 $(P_1 \in G_1, P_2 \in G_2)$
- 选主私钥 ($\alpha \in [1, N-1]$),计算主公钥 ($P_{pub}$ =$ \alpha P_2 \in G_2$)
- 计算 (g = e($P_1$, $P_{pub}$) $\in$ $G_T$)
- 输出:主公钥 (mpk = ($BP, P_1, P_2, P_{pub}, g, H_1, H_2, hid$)),主私钥 (msk =$ \alpha$)
KeyGen(用户私钥生成)
- 给定用户标识 ($ID$),KGC 计算:
- ($t_1 = H_1(ID \parallel hid, N) + \alpha \pmod N$)
- ($t_2 = \alpha \cdot t_1^{-1} \pmod N$)
- ($sk_{ID}$ = $t_2 $$\cdot $$P_1$)(群 ($G_1$) 中的元素)
- 关键设计:私钥 ($sk_{ID} = \frac{\alpha}{H_1(ID)+\alpha} \cdot P_1$),把身份标识”嵌入”到了私钥中
补充:需要一个公开锚点和检验量构造,需要一个独立生成元$H\in G_1$
委托密钥融合
构造$sk_p$
前置思路:

这是IBS代理签名密钥sk的设计思路结合该方案设计出SM9代理签名对应的私钥
那么代理私钥的形式应该是这样的:
$sk_p=S_\omega+sk_{ID_P}$
但是这样看似没问题的公式却在运用双线性验证时存在问题、
解决思路:

添加一个辅助验证点:

KGC通过安全信道把$(t_p,T_p)$发给$P$
推导

ok,有了私钥之后问题就变得简单起来了
代理签名与验证
Sign($P$用$sk_p$作为私钥使用标准SM9签名)
- 选随机数 (r),计算 ($w = g^r$)(把 (g) 作为”一次性基底”)
- 计算哈希 ($h = H_2(M \parallel w, N$))
- 计算 ($\ell = r - h \pmod N$),若 ($\ell = 0$) 则重新选 (r)
- $S=\ell \cdot sk_p$
- 签名 $\sigma = (h, S)$
Verify(验证)
- 计算 ($t’ = g^{h’}$),
- 计算 $u = e(S’, T_p)$,
- $w’ = u \cdot t’$
- $ h_2=H_2(M’ \parallel w’, N)$检查$h_2=h’$
NAPS机制
NAPS定义;

$sk_p=t_p\cdot P_1$满足NAPS那篇文章内$class\ c$的要求
class C:

所以NAPS直接套用在$t_{dpk}$上
$pk_p=t_p\cdot H$
P收到$t_p$后生成NAPS密钥:
参考DAPS基础设计进行构造

ElGamal加密密钥对:$x_E\in [1,N-1]$(random),$PK_E=x_E\cdot H$
对每个地址$\tau\in [1,n]$,随机系数$\rho_{\tau,j}$,$j\in[1,N-1]$
$r_{\tau}$(random)
ElGamal加密
$C_{\tau,1}=r_{\tau}\cdot H$
$C_{\tau,2}=r_{\tau}\cdot PK_E+\Sigma_j\rho_{\tau,j}\cdot H$
- $crs$(只需要$G_1$上DDH困难就行)
代理公钥(和$m_\omega$一起公开):($pk_p,PK_E,(C_\tau)_{\tau\in[n]},crs$)
构造份额多项式

单次代理签名(第i次操作,地址$\tau$)
标准SM9 Sign部分
→($h,S$)
NAPS分享部分
$p=H_3(\tau||M)\pmod N$
$z=f_\tau(p)=t_p+\Sigma_j\rho_{\tau,j}p^j\pmod N$
验证:

一致性证明


输出签名($m_\omega,h_\omega,S_\omega,T_p,\tau,h,S,z,\pi$)
Verify:
Verify(验证)
- 计算 ($t = g^{h}$),
- 计算 ($h_1$ = $H_1(ID \parallel hid, N)$),($P = h_1 P_2 + P_{pub} = (h_1 + \alpha)P_2$)
- 计算 ($u = e(S, P)$),($w’ = u \cdot t$)
- 检查 ($H_2(M \parallel w’, N) = h$)
把原来的验证点$P = h_1 P_2 + P_{pub} = (h_1 + \alpha)P_2$换成$T_p$
- $u=e(S,T_p)$
- $\omega’=u\cdot g^h$
- 检查$H_2(M \parallel w’, N) = h$
验证$\pi,z$:

双签(N次)
同一个$\tau$下出现$N$个不同payload的合法签名,Lagrange插值

辅助提取出$t_p$之后可以考虑加重代理者P的惩罚,以达到让它不敢越权的效果
押金锁定:$P$在申请委托,拿到($t_p,T_p$)前,先把一笔押金锁定导一个由$pk_p$控制的账户,
只有持有$t_p$,能提供$S=l\cdot sk_p$有效签名才能转出。




