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

228 lines
6.3 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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$对比若一致则公钥生成成功。
```mermaid
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)$.
```mermaid
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$为加密的协同签名客户端密钥分量发给外包服务器。
```mermaid
sequenceDiagram;
客户端 ->> 外包服务器: C1;
外包服务器 ->> 外包服务器: 计算E,F;
外包服务器 ->> 客户端: E,F;
客户端 ->> 客户端: e = Dec(E), H;
客户端 ->> 协同签名服务器: H;
协同签名服务器->>协同签名服务器: 计算I;
协同签名服务器 ->> 客户端: I
客户端 ->> 客户端:计算并得到加密密钥明文;
客户端 ->> 客户端:拆分加密密钥;
客户端 ->> 协同签名服务器: 服务端部分加密密钥;
客户端 ->> 外包服务器: 加密的客户端部分密钥
```
## 协同解密
略,此部分类似使用签名密钥解密流程
## 口令派生Paillier密钥
口令派生出1024bit的字节数组,并转为整数$p'$. $p$为大于$p'$的(满足安全条件)的最小素数。
同样派生出$q$(不同的迭代次数)并根据服务端公钥验证。