Files
2026-05-27 23:03:00 +08:00

6.3 KiB
Raw Permalink Blame History

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$(不同的迭代次数)并根据服务端公钥验证。