密码协议学习笔记(5):高级签名协议
(回顾:当待签名的数据无法参与签名算法的运算时,可以对其哈希值进行签名.)
盲签名:
盲签名的使用场景举例:
投票人需要让选举委员会为自己的选票背书,但又不愿向委员会透露自己到底向哪位候选人投票(防止被委员会或其他人打击报复)
用户User提供信息,私钥持有者Signer在不知道信息是什么的情况下进行签名.
一个盲签名方案一般由以下三个算法构成:
- Setup:概率多项式时间算法,输出系统参数$params$和签名人的公私密钥对$(pk,sk)$
- Sign:概率多项式时间交互协议,公共输入:公钥$pk$,签名人秘密输入:私钥$sk$,用户秘密输入:信息$m$,停止后得到签名$s$
- Verify:输入:系统参数$params$,签名人公钥$pk$,消息签名对$(m,s)$输出为1或0,代表签名有效或无效
盲签名的安全需求:
- 正确性:Sign进行的签名,Verify一定输出签名有效
- 不可伪造:不知道私钥$sk$则无法生成有效签名
- 盲性:除请求签名的User,任何人都无法将Sign过程中的会话信息和最终的签名联系起来.
基本设计思路:
- 盲化:User用消息$m$计算出$m'$
- 签名:Signer对$m'$签名得到$s'$
- 去盲:User通过$s'$计算出签名$s$
基于RSA问题的盲签名:
Setup:
Signer选定大质数$p,q$,$n=pq$,$d\in[\max(p,q),n-1]$,$e=d^{-1} \mod (p-1)(q-1)$
将$(p,q,d)$作为私钥保留,$(n,e)$作为公钥公开.
Sign:
User | Signer | |
选择一个随机数$k\in[\max(p,q)+1,n-1]$ 使用扩展欧几里得算法计算出$k^{-1} \mod n$ 对于待签名的信息$m$,计算$m'=k^em \mod n$进行盲化 |
$m' \rightarrow$ | |
$s' \leftarrow$ | 计算$s'=(m')^{d} \mod n$ | |
计算$s=k^{-1} s' \mod n$进行去盲 |
Verify:
判断$s^e=m \mod n$是否成立,若成立则签名有效,否则无效.
$$\begin{aligned}
s^e=&(s'k^{-1})^e\\
=&((m')^{d}k^{-1})^e \\
=&((k^em)^dk^{-1})^e \\
=&(k^{ed}k^{-1}m^d)^e \\
=&(kk^{-1}m^d)^e \\
=&m^{de} \\
=&m \qquad (\mod n)
\end{aligned}$$
基于离散对数的盲签名:
(感觉书上的方案有点问题,先略过)
部分盲签名-基于双线性映射:
在盲签名协议中,被签名的消息完全由User控制,可能存在风险.为解决此问题,考虑允许Signer在签名中嵌入公共信息,这就是部分盲签名的概念.例如,将有效期作为电子货币的公共信息嵌入盲签名中.
回顾:双线性映射:
设$q$为大素数,$G_1$是$q$阶的加法循环群(一般采用椭圆曲线上的群),$P\in G_1$是生成元,$G_2$是与$G_1$同阶的乘法循环群,将存在如下性质的函数$e:G_1 \times G_1 \to G_2$称为双线性映射
- 双线性性 $\forall Q_1,Q_2,R_1,R_2\in G_1,e(Q_1+Q_2,R_1+R_2)=e(Q_1,R_1+R_2)e(Q_2,R_1+R_2)=e(Q_1+Q_2,R_1)e(Q_1+Q_2,R_2) $,$\forall Q,R \in G_1,a,b\in Z_q,e(aQ,bR)=e(Q,R)^{ab}$
- 非退化性 $e(P,P)\neq 1$
- 计算有效性 $\forall Q,R$,存在有效算法计算$e(Q,R)$
Setup:
取大素数$q$,$q$阶加法循环群$G_1$,$P\in G_1$为其生成元,$G_2$为$q$阶的乘法循环群,
双线性映射$e:G_1 \times G_1 \to G_2$
$H:\{0,1\}^* \to [0,q-1]$是从任意字符串映射到数字的哈希函数
$H:\{0,1\}^* \to G_1$是从任意字符串映射到加法群$G_1$上的哈希函数
Signer选择$x\in [1,q-1]$作为私钥$sk=x$
将$pk=xP \in G_1$作为公钥公开.
Sign:
User | Signer | |
双方约定公共信息$c$ $\leftrightarrow$ |
||
选择随机数$r\in[1,p-1]$ 对于待签名的信息$m$ 计算$U=H_1(m||c)+r(H(c)P+pk)$ 其中$||$代表比特串级联(字符串连接?) |
$U \rightarrow$ | |
$V \leftarrow$ | 计算$V=U \cdot (H(c)+x)^{-1} \mod q$ | |
计算$S=V-rP$,然后作为签名和消息$(m,c)$一同发布. |
Verify:
对于消息$(m,c)$和签名$S$,签名有效当且仅当下式成立:
$$e(H(c)P+pk,S)=e(P,H_1(m||c))$$
证明:
首先考虑$V,S$的值
$$\begin{aligned}
V=&\frac{U}{H(c)+x} \\
=&\frac{H_1(m||c)+r(H(c)P+pk)}{H(c)+x} \\
=&\frac{H_1(m||c)}{H(c)+x}+\frac{r(H(c)P+xP)}{H(c)+x} \\
=&\frac{H_1(m||c)}{H(c)+x}+rP
\end{aligned}$$
$$\begin{aligned}
S=&V-rP \\
=&\frac{H_1(m||c)}{H(c)+x}
\end{aligned}$$
然后观察等式左端:
$$\begin{aligned}
&e(H(c)P+pk,S) \\
=&e(P\cdot(H(c)+x),H_1(m||c)\cdot (H(c)+x)^{-1}) \\
=&e(P,H_1(m||c))^{(H(c)+x)\cdot(H(c)+x)^{-1}} \qquad (\text{双线性映射的双线性性})\\
=&e(P,H_1(m||c))
\end{aligned}$$
安全性:
由于User在计算$U$时,使用了随机数$r$,因此Signer或其他人在信息论上就是无法获知$m$的
如果User要伪造签名,则需要计算哈希碰撞,这在计算复杂性上是不可能的.
群签名:
一些成员(member)和管理员(manager)所组成的群(group),任何成员可代表整个群做出签名,验证者只能验证签名来自该群,而无法验证来自哪个成员.除非管理员打开(open)该签名,此时才可揭示签名者的身份.
注意,一般群签名体制都要求允许额外添加成员,有的还允许移除成员.
群签名体制的构成:
- 初始化:产生用于验证的群公钥,属于成员的成员公钥,成员私钥,用于打开签名的管理员私钥
- 成员加入:新用户和管理员交互,获得批准后加入群,并获得密钥,有的协议中还需要颁发证书.
- 签名:群成员对消息产生签名.
- 验证:验证者使用群公钥验证某签名是否由该群成员签署.
- 打开:群管理员利用管理员私钥揭示签名由群中哪个成员签署.
群签名体制的安全性要求:
- 正确性:成员产生的合法密钥验证必然有效
- 不可伪造性:非群成员无法产生合法签名
- 匿名性:除非群管理员打开签名,否则无法揭示签名由哪个群成员产生
- 无关联性(强匿名性):除非群管理员打开签名,否则无法揭示任意两个不同的群签名是否由同一人产生
- 可跟踪性:群管理员可以通过打开揭示签名来自哪个成员
- 防陷害性:包括群管理员在内的任何群成员都不能产生其他成员的合法签名
- 抗联合攻击(强防陷害性):即使多个成员和管理员勾结,也不能产生其他成员的合法签名
一个简单的群签名方案:
假设$n$个人构成一个群,GM为群管理员
初始化:
GM为每个人分发一份私钥表,这些密钥表互不相交.
GM计算出所有表中的私钥对应的公钥,并以随机顺序排列为一张公钥表,并公开.
签名:
某成员要进行签名时,在自己的私钥表中选择一个未使用过的私钥,使用此私钥对消息签名.
验证:
验证者用公钥表中的所有公钥依次尝试验证,只要有一个公钥验证通过,则认为该签名是在群中产生的.
打开:
因为GM知道公钥表中公钥与私钥的对应关系,因此可以根据验证签名有效的那个公钥属于谁,来揭示谁是签名者.
该方案的缺陷:
- 每个私钥只能使用一次,否则会丧失无关联性
- GM由于知道所有人的私钥表,因此可以通过生成签名陷害成员
- 验证时,需要对公钥表中所有公钥进行验证,开销太大.
- ...
另一个简单的群签名方案:
该方案的改进在于不让GM知道群成员的私钥,该方案依赖ElGamal签名算法.回顾:密码协议学习笔记(1.5):几种常用的非对称密码体系 - Isakovsky - 博客园 (cnblogs.com)
设$p$为大素数,取$Z_p=([0,p-1],+ \mod p)$上的一个生成元$g$,假设$n$个人构成了一个群.
初始化:
$n$个人分别产生自己的私钥$s_i$,并计算出公钥$y_i=g^{s_i}$,发送给GM.
(博主注:如何防止私钥重复呢?注意,还要防止成员因为被告知私钥重复而推测出他人的私钥.博主想到的方案是,保证$p > \frac{2}{\pi}n^2$,这样,根据生日攻击理论,冲突的概率就会$<1/2$,一旦冲突要求所有人重新生成公私钥对)
GM为群成员随机生成$r_i \in[1,p]$并发送给它们,另将$pk_i=y_i^{r_i}$以随机顺序排列为公钥表,并公开.(此过程就不涉及会话,冲突了直接换一个就好)
签名:
群成员将$r_is_i \mod (p-1)$作为私钥,使用ElGamal数字签名体系,对消息$m$进行签名.
具体而言,在$[1,p-2]$中随机选取一个与$p-1$互质的数$k$,计算$\mod p-1$意义下的逆元$k^{-1}$,然后计算
$$R=g^k \mod p$$
$$S=(m-r_is_iR) k^{-1} \mod (p-1)$$
将$(R,S)$作为签名.
验证:
验证者使用公钥表中所有的公钥$pk_i$对签名$(R,S)$进行验证.
具体而言,是判断$(pk_i)^R\cdot R^S=g^m$是否成立.
$$\begin{aligned}
&(pk_i)^{R}\cdot R^S \\
=&(y_i^{r_i})^{g^k}\cdot (g^k)^{(m-r_is_ig^k)\cdot k^{-1}} \\
=&((g^{s_i})^{r_i})^{g_k} \cdot (g^k)^{(m-r_is_ig^k)\cdot k^{-1}} \\
=&g^{r_is_ig^k} \cdot g^{k\cdot (m-r_is_ig^k)\cdot k^{-1}} \\
=&g^{r_is_ig^k} \cdot g^{m-r_is_ig^k} \\
=&g^m
\end{aligned}$$
打开:
GM由于持有$r_i,y_i$和成员的对应关系,因此可以揭示出签名的成员是谁.
该方案的优点:
- GM不持有私钥,因此无法再陷害成员
- 密钥表大小明显减小,验证开销降低
该方案的缺陷:
- 每个成员的私钥只有一个,多次签名会导致产生关联性,可通过定时颁发新的$r_i$来解决,或者一次颁发多个$r_i^{(1)},r_i^{(2)} \cdots$
- 当新成员加入时,也需要重新为所有人颁发新的$r_i$(否则攻击者就可以通过对比公钥表更新前后添加了谁,而区分出旧成员和新成员的签名)
- 密钥表大小是$O(n)$,当成员较多时开销还是太大.
短的群签名方案:
该方案基于双线性对,存在两个管理者,一个被称为issuer,负责颁发私钥,另一个称为opener,负责打开群成员身份.
注意,这个方案中,由于私钥是由issuer产生后颁发的,因此要求issuer可信(不主动陷害成员),以及issuer和成员之间的信道安全.(而opener则无法伪造签名)
初始化:
令$p$为大素数,$P$为$p$阶加法循环群$G_1$的生成元,$H$为$G_1$中任意非单位元的点,$G_2$为$p$阶乘法循环群,$e:G_1 \times G_1 \to G_2$为双线性映射,$Hash:\{0,1\}^*\to [0,p-1]$为哈希函数.
取$\xi_1,\xi_2,\gamma\in[1,p-1]$
取$U,V\in G_1$使得$\xi_1U=\xi_2V=H$
(用如下方式生成$\xi_1,\xi_2,U,V$,首先随机选取$\xi_1,U$,然后随机生成整数$w\in[1,p-1]$,计算$V=wU$,$\xi_2=\xi_1 \cdot w^{-1} \mod p$,即可避免计算离散对数问题.)
记$W=\gamma P$
将$gpk=(P,H,U,V,W)$作为群公钥公开
$gmsk=(\xi_1,\xi_2)$作为opener的私钥,用于打开过程
$\gamma$作为issuer的私钥,用于颁发群成员私钥
加入:
假设系统中有$n$个群成员,issuer为第$i$个成员选取$x_i\in[1,p-1]$,计算$A_i=(\gamma+x_i)^{-1}\cdot P$,将$(A_i,x_i)$作为私钥颁发给群成员,并将$A_i$交给opener,让opener知道其与群成员的对应关系,以便于执行打开操作.
签名:
给定群公钥$gpk=(P,H,U,V,W)$,群成员的私钥$(A_i,x_i)$,待签名的消息$m\in\{0,1\}^*$,成员$i$执行如下操作:
- 选择$\alpha,\beta\in [1,p-1]$
- 计算
$$\delta_1=x_i\alpha$$
$$\delta_2=x_i\beta$$
$$T_1=\alpha U$$
$$T_2=\beta V$$
$$T_3=A_i+(\alpha+\beta)H$$
- 选择$r_{\alpha},r_{\beta},r_x,r_{\delta_1},r_{\delta_2}\in[1,p-1]$
- 计算
$$R_1=r_{\alpha}U$$
$$R_2=r_{\beta}V$$
$$R_3=e(T_3,P)^{r_x}e(H,W)^{-r_{\alpha}-r_{\beta}}e(H,P)^{-r_{\delta_1}-r_{\delta_2}}$$
$$R_4=r_xT_1-r_{\delta_1}U$$
$$R_5=r_xT_2-r_{\delta_2}V$$
- 计算$c=Hash(m,T_1,T_2,T_3,R_1,R_2,R_3,R_4,R_5)$
- 计算
$$s_{\alpha}=r_{\alpha}+c\alpha$$
$$s_{\beta}=r_{\beta}+c\beta$$
$$s_x=r_x+cx_i$$
$$s_{\delta_1}=r_{\delta_1}+c\delta_1$$
$$s_{\delta_2}=r_{\delta_2}+c\delta_2$$
- 将$(T_1,T_2,T_3,c,s_{\alpha},s_{\beta},s_x,s_{\delta_1},s_{\delta_2})$作为对$m$产生的签名发布.
(博主注:如何计算$G_2$上元素的负指数幂呢?)
验证:
当已知公钥$gpk=(P,H,U,V,W)$,消息$m$和签名$(T_1,T_2,T_3,c,s_{\alpha},s_{\beta},s_x,s_{\delta_1},s_{\delta_2})$时,用以下方法验证签名的有效性:
- 计算
$$R_1'=s_{\alpha}U-cT_1$$
$$R_2'=s_{\beta}V-cT_2$$
$$R_3'=e(T_3,P)^{s_{x}}e(H,W)^{-s_{\alpha}-s_{\beta}}e(H,P)^{-s_{\delta_1}-s_{\delta_2}}(\frac{e(T_3,W)}{e(P,P)})^c$$
$$R_4'=s_xT_1-s_{\delta_1}U$$
$$R_5'=s_xT_2-s_{\delta_2}V$$
- 接受签名,当且仅当$c=Hash(m,T_1,T_2,T_3,R_1',R_2',R_3',R_4',R_5')$
不考虑哈希碰撞的问题,签名被接受,当且仅当$R_1'=R_1,R_2'=R_2,R_3'=R_3,R_4'=R_4,R_5'=R_5$
$$\begin{aligned}
R_1'=&s_{\alpha}U-cT_1 \\
=&(r_{\alpha}+c\alpha)U-c\alpha U\\
=&r_{\alpha}U\\
=&R_1
\end{aligned}$$
$$\begin{aligned}
R_2'=&s_{\beta}V-cT_2 \\
=&(r_{\beta}+c\beta)V-c\beta V\\
=&r_{\beta}V\\
=&R_2
\end{aligned}$$
$$\begin{aligned}
R_3'=&e(T_3,P)^{s_{x}}e(H,W)^{-s_{\alpha}-s_{\beta}}e(H,P)^{-s_{\delta_1}-s_{\delta_2}}(\frac{e(T_3,W)}{e(P,P)})^c \\
=&e(T_3,P)^{r_{x}+cx_i}e(H,W)^{-(r_{\alpha}+c\alpha)-(r_{\beta}+c\beta)}e(H,P)^{-(r_{\delta_1}+c\delta_1)-(r_{\delta_2}+c\delta_2)}(\frac{e(T_3,W)}{e(P,P)})^c \\
=&e(T_3,P)^{r_x}e(H,W)^{-r_{\alpha}-r_{\beta}}e(H,P)^{-r_{\delta_1}-r_{\delta_2}}\cdot e(T_3,P)^{cx_i}e(H,W)^{-c\alpha-c\beta}e(H,P)^{-c\delta_1-c\delta_2} \cdot(\frac{e(T_3,W)}{e(P,P)})^c \\
=&R_3\cdot (e(T_3,P)^{cx_i}e(H,W)^{-c\alpha-c\beta}e(H,P)^{-c\delta_1-c\delta_2})\cdot (\frac{e(T_3,W)}{e(P,P)})^c
\end{aligned}$$
观察第二项:
$$\begin{aligned}
&(e(T_3,P)^{cx_i}e(H,W)^{-c\alpha-c\beta}e(H,P)^{-c\delta_1-c\delta_2})\\
=&(e(T_3,P)^{x_i}e(H,W)^{-\alpha-\beta}e(H,P)^{-\delta_1-\delta_2})^c\\
\end{aligned}$$
然后分别观察:
$$\begin{aligned}
e(T_3,P)^{x_i}=&e(A_i+(\alpha+\beta)H,P)^{x_i} \\
=&e(A_i,P)^{x_i}\cdot e((\alpha+\beta)H,P)^{x_i} \qquad (\text{双线性性}) \\
=&e(\frac{1}{\gamma+x_i}P,P)^{x_i}\cdot e((\alpha+\beta)H,P)^{x_i}\\
=&e(\frac{x_i}{\gamma+x_i}P,P)\cdot e(H,P)^{(\alpha+\beta)x_i} \qquad (\text{同上})\\
=&e((1-\frac{\gamma}{\gamma+x_i})P,P)\cdot e(H,P)^{(\alpha+\beta)x_i} \\
=&e(P,P)\cdot e(\frac{-\gamma}{\gamma+x_i}P,P)\cdot e(H,P)^{(\alpha+\beta)x_i} \qquad (\text{同上})\\
=&e(P,P)\cdot e(\frac{1}{\gamma+x_i}P,\gamma P)^{-1} \cdot e(H,P)^{(\alpha+\beta)x_i} \qquad (\text{同上})\\
=&e(P,P)\cdot e(A_i,W)^{-1} \cdot e(H,P)^{(\alpha+\beta)x_i}
\end{aligned}$$
$$\begin{aligned}
e(H,W)^{-\alpha-\beta}=&e((\alpha+\beta)H,W)^{-1} \qquad (\text{双线性性})\\
\end{aligned}$$
$$\begin{aligned}
e(H,P)^{-\delta_1-\delta_2}=&e(H,P)^{-x_i\alpha-x_i\beta} \\
=&e(H,P)^{-x_i(\alpha+\beta)}
\end{aligned}$$
将结论代回:
$$\begin{aligned}
&(e(T_3,P)^{x_i}e(H,W)^{-\alpha-\beta}e(H,P)^{-\delta_1-\delta_2})^c\\
=&(e(P,P)\cdot e(A_i,W)^{-1}\cdot e(H,P)^{(\alpha+\beta)x_i}\cdot e((\alpha+\beta)H,W)^{-1}\cdot e(H,P)^{-x_i(\alpha+\beta)})^c\\
=&(e(P,P)\cdot e(A_i,W)^{-1}\cdot e((\alpha+\beta)H,W)^{-1})^c \\
=&(e(P,P)\cdot e(A_i+(\alpha+\beta)H,W)^{-1})^c \qquad (\text{双线性性}) \\
=&(e(P,P)\cdot e(T_3,W)^{-1})^c
\end{aligned}$$
因此:
$$\begin{aligned}
R_3'=&R_3\cdot (e(T_3,P)^{cx_i}e(H,W)^{-c\alpha-c\beta}e(H,P)^{-c\delta_1-c\delta_2})\cdot (\frac{e(T_3,W)}{e(P,P)})^c \\
=&R_3 \cdot (e(P,P)\cdot e(T_3,W)^{-1})^c \cdot (\frac{e(T_3,W)}{e(P,P)})^c \\
=&R_3
\end{aligned}$$
$$\begin{aligned}
R_4'=&s_xT_1-s_{\delta_1}U \\
=&(r_x+cx_i)\alpha U-(r_{\delta_1}+c\delta_1)U \\
=&(r_x\alpha U-r_{\delta_1}U)+(cx_i\alpha U-c\delta_1U) \\
=&(r_xT_1-r_{\delta_1}U)+(cx_i\alpha U-cx_i\alpha U) \\
=&R_4
\end{aligned}$$
$$\begin{aligned}
R_5'=&s_xT_2-s_{\delta_2}V \\
=&(r_x+cx_i)\beta V-(r_{\delta_2}+c\delta_2)V \\
=&(r_x\beta V-r_{\delta_2}V)+(cx_i\beta V-c\delta_2V) \\
=&(r_xT_2-r_{\delta_2}V)+(cx_i\beta V-cx_i\beta V) \\
=&R_5
\end{aligned}$$
打开:
给定群公钥$gpk=(P,H,U,V,W)$,消息$m$,待打开的签名$(T_1,T_2,T_3,c,s_{\alpha},s_{\beta},s_x,s_{\delta_1},s_{\delta_2})$,以及用于打开的私钥$gmsk=(\xi_1,xi_2)$,要揭露是哪个成员签下的签名,opener的工作如下:
- 验证该签名是群成员产生的有效签名.
- 计算$A=T_3-(\xi_1T_1+\xi_2T_2)$
- 检查$A$与哪个$A_i$相符,以此获知对应的成员
该方案的的公钥大小与成员数量无关,大大减小运算开销(使用了椭圆曲线上的"压缩存储技术")
虽然双线性映射计算开销较大,但$e(H,W),e(H,P),e(P,P)$均可预先计算一次并存储起来,作为群公钥的附加信息一同发布,群成员也可以自行计算$e(A_i,P)$并存储起来加快运算.
成员撤销:
在群签名体制中,有时(由于离职等原因)需要撤销成员的身份,不再认可该成员使用群的私钥做出的签名有效性.
在前文提到的两种"简单的群签名方案"中,管理员只需要将成员对应的公钥从公钥表中移除即可.
短的群签名方案的成员撤销操作:
在"短的群签名方案"中,可以通过发布"撤销成员列表"的方式撤销群成员.
成员$i$被撤销后,仍持有$(A_i,x_i)$,如果沿用原来的$gpk=(P,H,U,V,W)$,它使用$(A_i,x_i)$进行的签名仍会被误认为有效,为了更新$gpk$而组织剩余成员重新进行一次密钥体系的初始化是不现实的,因此可考虑使用如下方法更新公私钥:
撤销成员$i$时,
- issuer将撤销成员的私钥发布在撤销成员列表上$RL=(A_i,x_i)$
- (任何人都可以)计算$$P'=A_i$$ $$W'=P-x_iA_i$$ 然后将$gpk'=(P',H,U,V,W')$作为新的群公钥发布,此时,仍满足$$\begin{aligned}
W'=&P-x_iA_i\\
=&P-x_i\frac{1}{\gamma+x_i} P \\
=&\gamma \cdot \frac{1}{\gamma+x_i} P \\
=&\gamma P'
\end{aligned}$$ - 剩下的群成员以如下方式更新它们的私钥,以成员$j$为例,它的原私钥是$(A_j,x_j)$,它计算$$A_j'=A_j\cdot P^{-1} \cdot A_i $$更新自己的私钥.此时$$\begin{aligned}
A_j'=&A_j\cdot P^{-1} \cdot A_i \\
=&\frac{P}{\gamma+x_j}\cdot P^{-1} \cdot A_j \\
=&\frac{A_j}{\gamma+x_j} \\
=&\frac{P'}{\gamma+x_j}
\end{aligned}$$(撤销列表发布时也可以预先计算出$P^{-1}$并作为附加信息发布)
这样做的好处是,当成员被撤销时,不需要所有成员在线,只需要当它们上线的时候,检查撤销列表的末尾,更新自己的私钥即可.
环签名:
在古代,大臣们向皇上进谏,但由于忠言逆耳,皇帝如果不满意直谏,就会发威将带头进谏的人杀掉。于是大臣们想了一个办法,在奏折上画个圈圈,每个赞同提议的大臣们在圆圈外围署名,这样一来,一荣俱荣,一损俱损,皇上无法从名字上来识别出谁是带头者,从而大臣们就保全了自己。
密码学中的环签名则考虑这样的场合:某个国家的内阁成员他知道一条关于首相的丑闻,并想将这个丑闻泄露给报刊记者。自然不能对这个丑闻使用普通数字签名,因为这样会暴露自己的身份。也不能随便让一个平民百姓去告诉记者,因为这样的检举不具有可信性。 此时,可以选择所有内阁成员,连同自己一起构成一个环,然后使用环签名体制,对该丑闻产生环签名,将产生的消息签名对发送给记者。记者接到后执行环签名验证算法,之后可以确信这个消息是由内阁中的某个成员泄露,从而具有很大的可信性;但同时记者无法获知检举人的身份.
安全性需求:
- 正确性(consistency):环内任意成员进行的签名都能被验证有效
- 匿名性(anonymity):任一验证者无法识别真正的签名人
- 不可伪造性(unforgeability):不在环中的成员无法生成有效签名
- 可链接性(linkabilily):(部分环签名提供这种性质)可以确定两个签名是否是同一人产生的(但仍然无法确认此人身份)(例如,要向某公司中所有员工匿名收集问卷,但每人最多允许提交一份)
不具有可链接性的环签名:
该体系基于双线性映射构造.
令$q$为大素数,$G_1$为$q$阶加法循环群,$P$为其生成元,$G_2$为同阶的乘法循环群,双线性映射$e:G_1 \times G_1 \to G_2$,哈希函数$Hash:\{0,1\}^* \to G_1$.
设环中有$n$个用户$\{U_1,U_2,\cdots\}$,私钥为$x_i\in [1,q-1]$,公钥为$Y_i=x_iP$
环签名生成算法(ring-sign):
设成员$k$要对消息$m$进行环签名
- 计算$H=Hash(m)$
- 选择随机数$a_1,\cdots,a_{k-1},a_{k+1},\cdots,a_n \in [1,q-1]$
- 计算$\sigma_i=a_iP (i \in [1,k-1]\cup[k+1,n])$
- 计算$\sigma_k=\frac{1}{x_k}(H-\underset{j=1,\cdots,k-1,k+1,\cdots,n}{\Sigma}(a_jY_j))$
- 输出$(\sigma_1,\cdots,\sigma_{k-1},\sigma_k,\sigma_{k+1},\cdots,\sigma_n)$
环签名验证算法(ring-verify):
给定环$\{U_1,\cdots,U_n\}$,消息$m$和对该消息的签名$(\sigma_1,\cdots,\sigma_{k-1},\sigma_k,\sigma_{k+1},\cdots,\sigma_n)$,验证者首先计算$H=Hash(m)$,然后判断:
$$e(H,P)=\Pi_{i=1}^{n}e(\sigma_i,Y_i)$$
若成立,则认为签名有效.
实际上:
$$\begin{aligned}
&\Pi_{i=1}^{n}e(\sigma_i,Y_i) \\
=&\Pi_{i=1}^{n}e(\sigma_i,x_iP) \\
=&\Pi_{i=1}^{n}e(x_i\sigma_i,P) \qquad (\text{双线性性}) \\
=&e(\Sigma_{i=1}^{n}(x_i\sigma_i),P) \qquad (\text{同上}) \\
\end{aligned}$$
注意,
$$x_k\sigma_k=H-\underset{j=1,\cdots,k-1,k+1,\cdots,n}{\Sigma}(a_jY_j)$$
而对于$i\neq k$
$$x_i\sigma_i=x_ia_iP=a_iY_i$$
因此,
$$\begin{aligned}
&\Sigma_{i=1}^{n}(x_i\sigma_i) \\
=&x_k\sigma_k+\underset{i=1,\cdots,k-1,k+1,\cdots,n}{\Sigma}(x_i\sigma_i) \\
=&H-\underset{j=1,\cdots,k-1,k+1,\cdots,n}{\Sigma}(a_jY_j)+\underset{j=1,\cdots,k-1,k+1,\cdots,n}{\Sigma}(a_jY_j) \\
=&H
\end{aligned}$$
代回原式,
$$\begin{aligned}&\Pi_{i=1}^{n}e(\sigma_i,Y_i) \\
=&e(\Sigma_{i=1}^{n}(x_i\sigma_i),P)\\
=&e(H,P)
\end{aligned}$$
需要说明的是,$(\sigma_1,\cdots,\sigma_{k-1},\sigma_k,\sigma_{k+1},\cdots,\sigma_n)$在验证者的视角下都是完全随机的,因此它无法判断出哪个里面包含了哈希值$H$的信息,也就无法得知谁是签名者.
具有可链接性的环签名:
该体系基于离散对数问题构造.
令$q$为大素数,$G$为$q$阶循环群,哈希函数$Hash_1:\{0,1\}\to [0,q-1],Hash_2:\{0,1\}^* \to G$.
设环中有$n$个用户$\{U_1,U_2,\cdots\}$,私钥为$x_i\in [1,q-1]$,公钥为$y_i=g^{x_i}$
环签名生成算法(ring-sign):
设成员$k$要对消息$m$进行环签名
- 计算$h=Hash_2(y_1,y_2,\cdots,y_n),t=h^{x_k}$
- 选择随机数$r,s_1,\cdots,s_{k-1},s_{k+1},\cdots,s_n,c_1,\cdots,c_{k-1},c_{k+1},\cdots,c_n \in [0,q-1]$
- 对于$i=1,2,\cdots,k-1,k+1,\cdots,n$,计算$$u_i=g^{s_i}y_i^{c_i}$$ $$v_i=h^{s_i}t^{c_i}$$
- 计算$$u_k=g^{r}$$ $$v_k=h^r$$
- 计算$$c_k=Hash_1(m,t,u_1,\cdots,u_n,v_1,\cdots,v_n)-\underset{i=1,\cdots,k-1,k+1,\cdots,n}{\Sigma}c_i$$ $$s_k=r-c_kx_k$$
- 将$(t,s_1,\cdots,s_n,c_1,\cdots,c_n)$作为签名输出.
环签名验证算法(ring-verify):
给定消息$m$,签名$(t,s_1,\cdots,s_n,c_1,\cdots,c_n)$,公钥$y_1,\cdots,y_n$,验证者计算
$$h=Hash_2(y_1,\cdots,y_n)$$
$$u_i'=g^{s_i}y_i^{c_i}$$
$$v_i'=h^{s_i}t^{c_i}$$
然后检查如下等式是否成立:
$$\Sigma_{i=1}^{n}c_i=Hash_1(m,t,u_1,\cdots,u_n,v_1,\cdots,v_n)$$
如果成立,则接受签名.
显然,若不考虑哈希碰撞的话,当且仅当$u_k=u_k'$且$v_k=v_k'$时签名有效
观察
$$\begin{aligned}
u_k'=&g^{s_k}y_k^{c_k} \\
=&g^{r-c_kx_k}y_k^{c_k} \\
=&g^{r}\cdot (g^{x_k})^{-c_k} \cdot y_k^{c_k} \\
=&g^{r} \cdot (y_k)^{-c_k} \cdot y_k^{c_k}\\
=&g^{r} \\
=&u_k
\end{aligned}$$
$$\begin{aligned}
v_k'=&h^{s_k}t^{c_k} \\
=&h^{r-c_kx_k}t^{c_k} \\
=&h^{r}\cdot (h^{x_k})^{-c_k} \cdot t^{c_k} \\
=&h^{r} \cdot (t)^{-c_k} \cdot t^{c_k}\\
=&h^{r} \\
=&v_k
\end{aligned}$$
环签名链接算法(link):
给定签名$(t,s_1,\cdots,s_n,c_1,\cdots,c_n),(t',s_1',\cdots,s_n',c_1',\cdots,c_n')$,要检验是否为环上同一人签署,先验证二者是否是合法签名,然后判断是否有$t=t'$,若相等,由于$t=h^{x_k}$,则说明两个签名为环上的同一个人所签署.
当环内成员试图陷害环内其他成员$k'$时,由于即使是环内成员,因为不知道$x_{k'}$,也无法构造出$t=h^{x_{k'}}$
而当环内成员只是试图隐藏自己的身份,不去管到底嫁祸给了谁时,它尝试截获其他场合获得的某个过期的$t$用在自己伪造的签名中,然而,由于不知道这个$t$对应的$x_{k}$,它也无法构造出合法的$s_k=r-c_kx_k$使得签名成立.
基于身份的数字签名(Identity Based Signature, IBS):
(回顾:基于身份的密钥分配密码协议学习笔记(2):密钥交换协议 - Isakovsky - 博客园 (cnblogs.com))
将用户的公开身份信息(电子邮件,身份证号)等作为公钥(或将其哈希值作为公钥)私钥则通过可信第三方由密钥生成器(Private Key Generator, PKG)生成.并通过安全信道发送给用户.
IBS的构成:
常用的IBS体系由以下四个算法构成:
初始化(Setup):
PKG生成系统的主密钥和参数$param$,将参数公开发布,主密钥$s$秘密保存
私钥提取(Extract):
PKG获得用户身份信息$ID \in \{0,1\}^*$后,利用自己的主密钥$s$和系统参数,计算出$ID$对应的私钥$d_{ID}$,然后通过安全信道发送给用户.
签名(Sign):
用户使用系统参数$param$,自己的私钥$d_{ID}$,待签名的消息$m$,输出签名$\sigma=Sign(param,d_{ID},m)$
验证(Verify):
验证者使用系统参数$param$,签名者的身份(公钥)$ID$,消息签名对$(m,\sigma)$,计算$Verify(param,ID,m,\sigma)$判断签名是否有效.
安全性需求:
一般地,说数字签名体制是安全的,是指它具有在适应性选择消息攻击下的不可伪造性.
说一个基于身份的数字签名体制是安全的,是指它具有在适应性选择消息和选择身份攻击下的不可伪造性.
更严格地,可以使用下面的形式化定义:
设IBS=(Setup,Extract,Sign,Verify)是一个基于身份的数字签名体系,防御者$Charlie$和攻击者$Alice$以交互的方式进行如下的博弈:
Charlie | Alice | |
运行Setup算法,生成系统参数$param$和主密钥$s$ | $param \rightarrow$ | |
$\leftarrow ID_1$ | 任意选择身份信息$ID_1$并提交 | |
生成$d_{ID_1}$并返回 | $d_{ID_1} \rightarrow$ | |
$\leftarrow ID_2$ | 任意选择身份信息$ID_2$并提交 | |
生成$d_{ID_2}$并返回 | $d_{ID_2} \rightarrow$ |
|
$\cdots$ |
|
|
$\leftarrow (ID^*,m^*,\sigma^*)$ |
最后,生成一个三元组$(ID^*,m^*,\sigma^*)$,但$ID^*$不能是之前询问过的. |
|
运行验证算法$Verify(param,ID^*,m^*,\sigma^*)$ 若验证的结果是签名有效,则称Alice赢得了博弈. |
|
如果攻击者无法在多项式时间内以不可忽略的概率在上述博弈中获胜,则称IBS在适应性选择消息身份攻击下是不可伪造的.
使用双线性对技术的IBS:
Setup:
令$q$为一大素数,$G_1$为$q$阶加法循环群,$P$为其的一个生成元,$G_2$为同阶的乘法循环群,$e:G_1 \times G_1 \to G_2$为双线性映射
$Hash_1:\{0,1\}^*\to [0,q-1]$是输出结果为整数的哈希函数.
$Hash_2:\{0,1\}^*\to G_1$是输出结果为$G_1$上元素的哈希函数.
PKG随机选择$s\in [1,q-1]$,令$P_{pub}=sP$
$s$作为主密钥秘密保存
$param=(q,G_1,G_2,P,e,Hash_1,Hash_2,P_{pub})$作为系统参数公开.
Extract:
用户提交一个身份信息$ID$,PKG计算$Q_{ID}=Hash_2(ID),d_{ID}=sQ_{ID}$,将$d_{ID}$作为私钥,在安全信道上发送给用户.而$Q_{ID}$则可看作用户的公钥
Sign:
给定消息$m$,持有私钥$d_{ID}$的用户选取随机数$r\in[1,q-1]$,计算
$$U=rQ_{ID}$$
$$h=Hash_1(m,U)$$
$$V=(r+h)d_{ID}$$
最后输出$\sigma=(U,V)$作为签名.
Verify:
验证签名$\sigma=(U,V)$是否是身份信息为$ID$的用户对消息$m$产生的,验证者可计算
$$h=Hash_1(m,U)$$
然后验证下列等式是否成立:
$$e(P_{pub},U+hQ_{ID})=e(P,V)$$
若成立,则认为签名有效.
实际上:
$$\begin{aligned}
e(P_{pub},U+hQ_{ID})=&e(sP,rQ_{ID}+hQ_{ID})\\
=&e(sP,(r+h)Q_{ID}) \\
=&e(P,(r+h)sQ_{ID}) \qquad (\text{双线性性})\\
=&e(P,(r+h)d_{ID})\\
=&e(P,V)
\end{aligned}$$
不使用双线性对的IBS(基于RSA):
由于双线性对计算开销较大,因此一些不使用双线性对的技术也被提出了
(回顾:RSA签名体系:密码协议学习笔记(1.5):几种常用的非对称密码体系 - Isakovsky - 博客园 (cnblogs.com))
Setup:
PKG选择两个大素数$p,q$,计算$N=pq$,选择一个与$\phi(N)=(p-1)(q-1)$互质的数$e$(实际上在$[\max(p,q)+1,\phi(N)-1]$上任选就行),计算$d=e^{-1} \mod \phi(N)$
选择哈希函数$Hash:\{0,1\}^* \to [0,n-1]$
(博主注:书中写的哈希函数值域是$[0,\phi(N)-1]$,但博主认为为了防止泄露$\phi(N)$,值域应当为$[0,n-1]$)
将$param=(N,e,H)$作为系统参数公开.
$d$作为主密钥秘密保留.
Extract:
用户发送$ID$,PKG计算$g_{ID}=ID^d$,然后将$g_{ID}$通过安全信道发送给用户作为私钥
Sign:
对于消息$m$,持有签名$g_{ID}$的用户取随机数$r\in [1,n-1]$,然后计算
$$t=r^{e} \mod N$$
$$s=g_{ID}r^{Hash(t||m)}$$
将$(t,s)$作为签名发布.
Verify:
验证者计算下列等式是否成立:
$$s^e=IDt^{H(t||m)} \mod n$$
成立则认为签名有效.
实际上:
$$\begin{aligned}
s^e=&(g_{ID}r^{Hash(t||m)})^e\\
=&g_{ID}^e\cdot r^{e\cdot Hash(t||m)} \\
=&(ID^d)^e\cdot (r^e)^{Hash(t||m)} \\
=&ID\cdot t^{Hash(t||m)} (\mod n) \end{aligned}$$