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