6.3 KiB
SM2协同签名的隐私外包计算(Outsourcing Computation)
参与方:
- 协同签名服务器
- 协同签名客户端
- (协同签名客户端)外包服务器
其中,协同签名服务端与常规的一致,并且它并不能感知协同签名的客户端是否使用了外包计算。
外包计算一般应用在协同签名客户端为弱计算环境下,如小程序,浏览器等-当然也可以是APP或PC端。它将协同签名客户端的计算外包给外包服务器。并且外包服务器不能获取所计算的内容的信息。
Paillier加密
Paillier密钥为:
p,$q$为素数,n=pq.\lambda = \mathrm{LCM}(p-1, q-1).
公钥:n.
私钥:n, \lambda
记$\mathrm{Enc},\mathrm{Dec}$为Paillier加密。满足加同态: 若
c_1 = Enc(m_1),\\
c_2 = Enc(m_2)
则
c_1\cdot c_2 = Enc(m_1 + m_2 \mod n^2)
签名密钥生成
原始的协同签名服务端和客户端密钥分别为
d_s,d_c,并且和实际密钥$d$满足d_s*d_c*(1+d) = 1 \mod N
- 客户端 选取
d_{c1} \leftarrow [1, N-1],
计算A_1= \mathrm{Enc}(d_{c1}),A_2 =\mathrm{Enc}(d_{c1}^{-1}),并发送$A_1,A_2$给外包服务器;
- 外包服务器 选取
d_{c2} \leftarrow [1, N-1],
计算
\begin{array}{rcl}
P &=& [d_{c2}^{-1}]G \\
B_1 &=& \mathrm{Enc}(d_{c1})^{d_{c2}}= \mathrm{Enc}(d_{c1}d_{c2}) = \mathrm{Enc}(d_{c})\\
B_2&=&\mathrm{Enc}(d_{c2}^{-1})^{d_{c2}^{-1}} = \mathrm{Enc}(d_{c1}^{-1}d_{c2}^{-1})=\mathrm{Enc}(d_{c}^{-1})
\end{array}
外包服务器保存B_1, B_2, 把$P$,发给客户端
- 客户端 计算
Q = [d_{c1}^{-1}]P = [d_{c}^{-1}]G,
发送$Q$给协同签名服务端。
- 协同签名服务器计算
R = [d_s^{-1}]G - 客户端计算公钥
S = [d_{c1}^{-1}]R= [d_{c1}^{-1}d_s^{-1}]G, 把$(R,S)$发给外包服务器 - 外包服务器计算
T_1 = [d_{c2}^{-1}]R, T_2 = [d_{c2}^{-1}]S,PK =T_2-G=[d_{c2}^{-1}d_{c1}^{-1}d_s^{-1}-1]G = [d]G, 把T_1, PK - 客户端计算
PK' = [d_{c1}^{-1}]T_1-G, 并与外包服务器发送的$PK$对比若一致则公钥生成成功。
sequenceDiagram;
客户端 ->> 外包服务器: A1,A2;
外包服务器 ->> 外包服务器: 计算B1,B2并保存;
外包服务器 ->> 客户端: P;
客户端 ->> 协同签名服务器: Q;
协同签名服务器->>客户端: R;
客户端 ->> 外包服务器: R,S;
外包服务器 ->> 客户端: T1, PK
客户端 ->> 客户端: PK;
1.上述流程中,客户端部分密钥$d_c$未出现,并且客户端参与生成。 2.客户端与外包服务间应使用HTTPS/TLCP连接防止中间人攻击。 3.密钥生成后可以通过计算签名验证密钥生成成功。 4.一种简单的实现是客户端先按常规生成dc,把加密后的dc注册并放到OS上。
签名流程
前提条件:
- 协同签名服务器:
d_s - 协同签名客户端: Paillier私钥
\lambda - 外包服务器: Paillier公钥
n
签名流程:
- 客户端 计算e,向外包服务器发起请求
- 外包服务器
选择随机数
k_1', 计算$P' = [k_1']G$,发送$P'$给客户端 - 客户端
选择随机数
k_1'', 计算P = [k_1'']P'=[k_1'k_1'']G. 将$(e,P)$发送给协同签名服务器.
$k_1''$可以取1
- 协同签名服务器 选择随机数$k_2,k_3$并计算
\begin{array}{rcl}
Q &=& [k_2]P + [k_3]G\\
r &=& e + x_Q\\
s_1 &=& d_sk_2\\
s_2 &=& (k_3 + r)d_s
\end{array}
将$r,s_1,s_2$发送给客户端
- 客户端 将$r,k_1''s_1,s_2$发送给外包服务器
- 外包服务器 计算
\begin{array}{rcl}
s' &=& k_1'k_1''s_1+s_2 \mod N\\
u &=& Enc(d_c)^{s'} = Enc(d_cs')
\end{array}
选择随机数k_4 \in [1,N-1],计算
\begin{array}{rcl}
v &=& Enc(k_4N)\\
w &=& uv = Enc(d_cs' + k_4N)
\end{array}
将$w$发给客户端
- 客户端 计算
s = Dec(w) - r \equiv d_cs' - r\mod N
输出签名值(r,s).
sequenceDiagram;
客户端 ->> 外包服务器: 请求;
外包服务器 ->> 外包服务器: k1',P';
外包服务器 ->> 客户端: P';
客户端 ->> 客户端: k1'', P=[k1'']P';
客户端 ->> 协同签名服务器: (e,P);
协同签名服务器->>协同签名服务器: 计算r,s1,s2 ;
协同签名服务器 ->> 客户端: (r,s1,s2)
客户端 ->> 外包服务器: (r,k1s1,s2);
外包服务器 ->> 客户端: w = Enc(·);
客户端 ->> 客户端: 解密w;
客户端 ->> 客户端: 输出签名(r,s);
使用签名密钥解密加密密钥保护结构
前提条件:
- 协同签名客户端外包服务器持有Enc(
d_c^{-1}).
SM2密文
(C_1,C_3,C_2),解密只需要协同计算$[d]C_1 = [d_s^{-1}]\cdot[d_c^{-1}]C_1 - C1$。
解密流程:
- 客户端 把$C_1$发送给外包服务器;
- 外包服务器
选取随机数
k_1, k_2 \in [1, N-1], 计算
E = \mathrm{Enc}(d_c^{-1})^{k_1} \cdot \mathrm{Enc}(k_2N) = \mathrm{Enc}(d_c^{-1}k_1+k_2N)
和
F = [k_1^{-1}]C_1
把$E,F$发给客户端。
- 客户端 计算
\begin{array}{rcl}
e &=& \mathrm{Dec}(E) \mod N \equiv d_c^{-1}k_1\\
H &=& [e]F = [d_c^{-1}]C_1
\end{array}
- 客户端 发送$H$给协同签名服务器
- 协同签名服务器 计算
I = [d_s^{-1}]H = [d_s^{-1}d_c^{-1}]G
发送$I$给客户端
- 客户端 计算
J=[d_s^{-1}]\cdot[d_c^{-1}]C_1 - C_1 = [d]C_1
- 客户端
解密得到加密密钥$d_e$(加密密钥明文)。选取随机数
k\in [1,N-1],计算
K = \mathrm{Enc}(d_e)\\
L = K^k = \mathrm{Enc}(d_ek)
d_{es} = k^{-1} \mod N. 并将$d_{es}$作为协同签名服务端密钥分量发给服务端,$L$为加密的协同签名客户端密钥分量发给外包服务器。
sequenceDiagram;
客户端 ->> 外包服务器: C1;
外包服务器 ->> 外包服务器: 计算E,F;
外包服务器 ->> 客户端: E,F;
客户端 ->> 客户端: e = Dec(E), H;
客户端 ->> 协同签名服务器: H;
协同签名服务器->>协同签名服务器: 计算I;
协同签名服务器 ->> 客户端: I
客户端 ->> 客户端:计算并得到加密密钥明文;
客户端 ->> 客户端:拆分加密密钥;
客户端 ->> 协同签名服务器: 服务端部分加密密钥;
客户端 ->> 外包服务器: 加密的客户端部分密钥
协同解密
略,此部分类似使用签名密钥解密流程
口令派生Paillier密钥
口令派生出1024bit的字节数组,并转为整数p'. $p$为大于$p'$的(满足安全条件)的最小素数。
同样派生出$q$(不同的迭代次数)并根据服务端公钥验证。