Security Reduction学习笔记(2):预备知识(群环域,双线性配对,哈希函数)
省略部分可参考密码协议学习笔记(1.4):密码学的一些数学基础 - Isakovsky - 博客园 (cnblogs.com)
有限域:
$\mathbb{F}$是有限个元素的集合
若$(\mathbb{F},+,*)$满足某些条件(条件略),则称其为有限域(Finite Field,或称Galois域)
其零元,单位元分别记为$0_{\mathbb{F}} ,1_{\mathbb{F}} \in \mathbb{F}$
记$\mathbb{F}^*=\mathbb{F} \backslash \{0_{\mathbb{F}}\}$
$u\in \mathbb{F}$,记其对$+$的逆元为$-u$
$u\in \mathbb{F}^*$,记其对$*$的逆元为$u^{-1}$
$q$为素数时,两类特殊的有限域:
素数域$(\mathbb{F}_q,+,*)$:
由$\mathbb{Z}_q=\{0,1,2,\cdots,q-1\}$和模$q$的加法,乘法构成的有限域.
有限域$(\mathbb{F}_{q^n},+,*)$:
该域上的元素形式为$(x_0,x_1,\cdots,x_{n-1})$,其中$x_i \in \mathbb{Z}_q$
容易看出其阶为$q^n$
记$u=(u_0,u_1,\cdots,u_{n-1}),v=(v_0,v_1,\cdots,v_{n-1}) \in\mathbb{F}_{q^n}$
$u+v=(u_0+v_0 \mod q,u_1+v_1 \mod q,\cdots, u_{n-1}+v_{n-1} \mod q)$
$u*v=(u_0\times v_0 \mod q,u_1\times v_1 \mod q,\cdots, u_{n-1}\times v_{n-1} \mod q)$
$0_{\mathbb{F}_{q^n}}=(0,0,\cdots,0)$
$1_{\mathbb{F}_{q^n}}=(1,1,\cdots,1)$
$-u=(q-u_0,q-u_1,\cdots,q-u_{n-1})$
$u^{-1}=((u_0)^{q-2}\mod q,(u_1)^{q-2} \mod q,\cdots,(u_{n-1})^{q-2}\mod q)$
循环群:
定义:Abel群(交换群):
$(\mathbb{H},\cdot)$为Abel群,当且仅当满足以下条件:
- 封闭性
- 结合律
- 存在恒等元$e_{\mathbb{H}}$
- 对于每个元素$u\in \mathbb{H}$均存在逆元$u^{-1}$
- 交换律
设$x\in Z,h\in \mathbb{H}$,群上的幂运算按如下方式定义:
$$g^x=\underbrace{g\cdot g \cdots g}_x$$
定义:循环Abel群:
Abel群$(\mathbb{H},\cdot)$为循环Abel群,当且仅当满足以下额外条件:
存在(至少一个)生成元,记为$h$,以如下方式生成$\mathbb{H}$
$$\mathbb{H}=\{h^1,h^2,\cdots,h^{|\mathbb{H}|}\}=\{h^0,h^1,\cdots,h^{|\mathbb{H-1}|}\}$$
定义:素数阶的循环Abel群(循环群):
若生成元$g\in \mathbb{H}$,以 $$\mathbb{G}=\{g^1,g^2,\cdots,g^{|\mathbb{G}|}\}=\{g^0,g^1,\cdots,g^{|\mathbb{G-1}|}\}$$的方式生成子群$\mathbb{G}$,且
- $|\mathbb{G}|$为质数
- $|\mathbb{G}|$为$|\mathbb{H}|$的因数
则称$\mathbb{G}$为素数阶的循环Abel群.
素数阶的循环Abel群简称循环群(Cyclic Group)
循环群$\mathbb{G}$具有如下良好的性质:
- $\mathbb{G}$是最小子群(其子群只有自身)
- 除$g^0$以外,元素均为生成元
- 可以容易地计算出逆元
要构造一个循环群,首先需要确定
- 元素空间$\mathbb{G}$
- 生成元$g$
- 阶$p$
可以用$(\mathbb{G},g,p)$来描述一个群.
循环群上的计算复杂性问题:
密码系统的构建,需要依赖一些容易求解的问题和难求解的问题的配合.
首先规定,在之后的讨论中,$|\mathbb{G}|\geq 2^{160}$
循环群$\mathbb{G}$上的幂运算是容易求解的,使用快速幂,需要进行的$\cdot$运算次数仅为$O(\log |\mathbb{G}|)$.
但对于离散对数问题,求解并不是那么容易.
定义:循环群$\mathbb{G}$上的离散对数问题
记$\mathbb{G}$上的恒等元为$e_{\mathbb{G}}$,$\mathbb{G}^*=\mathbb{G}\backslash \{e_{\mathbb{G}}\}$
若$g\in \mathbb{G}^*,x\in Z_p,g^x=h$,记$\log_gh=x$,
给定任意$g'\in \mathbb{G}^*,h'\in \mathbb{G}$,称求解$\log_{g'}h'$的问题为离散对数问题.
对于任意循环群$(\mathbb{G},g,p)$,求解离散对数问题的复杂度是$\Omega(\sqrt{p})$,这也就是为什么要规定$|\mathbb{G}|\geq 2^{160}$的原因.
(博主注:因为这样,$\mathbb{G}$中的每个元素只需要$160$这个数量级的比特位存储,然而现代超算每秒运行次数也不超过$10^{15}$,即使是$2^{80} \approx 10^{23}$次运算也需要三年多,这个复杂度足够了.)
(博主注:离散对数的求解方法:BSGS算法,见求解离散对数的方法:BSGS - Isakovsky - 博客园 (cnblogs.com))
(博主注:但并非所有循环群上的离散对数问题都是难解的,例如在模素数$p$加法循环群$$([0,p-1],+ \mod p)$$上,求解$$\log_gh$$只需引入整数的普通乘法$\times$,计算$g$的模$p$乘法逆元$$rev(g)=\underbrace{g\times g \cdots g}_{p-2}\mod p$$然后计算$$h \times rev(g) \mod p= \log_gh$$即可.
可能不那么直观,不妨举个例子,在循环群$$([0,1000000006],+ \mod 1000000007)$$上,幂运算的定义是$$g^x=\underbrace{(g+g+\cdots+g)}_x \mod 1000000007$$要求解$$\log_23$$只需使用整数的普通乘法$\times$计算$$rev(2)=\underbrace{(2\times 2\times \cdots \times 2)}_{1000000005} \mod 1000000007=500000004$$然后计算$$3 \times rev(2) \mod 10000000007 =500000005$$即为$$\log_23$$的值,实际上,$$2^{500000005}=\underbrace{(2+2+\cdots+2)}_{500000005} \mod 1000000007 = 3$$)
双线性配对:
见密码协议学习笔记(2):密钥交换协议 - Isakovsky - 博客园 (cnblogs.com) 基于身份的密钥协商部分
哈希函数:
基于安全的分类:
- 抗逆向哈希函数
- 抗碰撞哈希函数
基于输出值的分类
- 输出定长字符串$H:\{0,1\}^* \to\{0,1\}^n$
- 输出整数$H:\{0,1\}^* \to \mathbb{Z}_p$
- 输出域上的元素$H:\{0,1\}^* \to \mathbb{G}$
伪随机数发生器:
略.
不安全的密码系统的示例:
例1:
该系统中,私钥$sk=\alpha \in \mathbb{Z}_p$公钥$pk=(g,g^{\alpha})$
明文$m$的签名$\sigma_m=g^{\alpha\cdot m}$
问题:已知$(pk,m,\sigma_m)$,如何对另一串明文$m'$伪造签名?
参考答案
计算$(g^{\alpha})^{m'}$例2:
该系统中,私钥$sk=\alpha \in \mathbb{Z}_p$公钥$pk=(g,g^{\alpha})$
明文$m$的签名$\sigma_m=g^{\alpha+m}$
问题:已知$(pk,m,\sigma_m)$,如何对另一串明文$m'$伪造签名?
参考答案
计算$g^{\alpha}\cdot g^{m'}$例3:
该系统中,私钥$sk=(\alpha,\beta) \in \mathbb{Z}_p$公钥$pk=(g,g^{\alpha},g^{\beta})$
明文$m$的签名$\sigma_m=\alpha+m\beta \mod p$
问题:已知$(pk,m_1,\sigma_{m_1},m_2,\sigma_{m_2})$,如何对另一串明文$m_3$伪造签名?
参考答案:
计算$$\begin{aligned}
&(\sigma_{m_1}-\sigma_{m_2})\cdot \frac{1}{m_1-m_2}\\
=&(m_1-m_2)\beta\cdot \frac{1}{m_1-m_2}\\
=&\beta \mod p
\end{aligned}$$
$$\begin{aligned}
&\sigma_{m_1}-m_1\cdot\beta\\
=&\alpha+m_1\cdot\beta-m_1\cdot\beta\\
=&\alpha \mod p
\end{aligned}$$
私钥已求出,直接伪造即可.
例4:
该系统中,私钥$sk=(\alpha,\beta) \in \mathbb{Z}_p$公钥$pk=(g,g^{\alpha},g^{\beta})$
明文$m$的签名$\sigma_m=(g^{\alpha\beta+mr},g^r)$,其中$r\in\mathbb{Z}_p$为随机数.
问题:已知$(pk,m,\sigma_m)$,如何对另一串明文$m'$伪造签名?
参考答案
计算
$$(g^r)^m=g^{mr}$$
$$g^{-mr}=(g^{mr})^{-1}$$
$$g^{\alpha\beta}=g^{\alpha\beta+mr} \cdot g^{-mr}$$
随机生成$r'\in\mathbb{Z}_p$
然后将$$\sigma_{m'}=(g^{\alpha\beta+m'r'},g^{r'})$$作为伪造的签名
例5:
该系统中,私钥$sk=(\alpha,\beta) \in \mathbb{Z}_p$公钥$pk=(g,g^{\alpha},g^{\beta})$
明文$m$的签名$\sigma_m=(g^{\alpha\beta+mr\cdot\beta},g^r)$,其中$r\in\mathbb{Z}_p$为随机数.
问题:已知$(pk,m,\sigma_m)$,如何对另一串明文$m'$伪造签名?
参考答案
参考:万剑振铜臭的动态-哔哩哔哩 (bilibili.com)
首先需要明确该密码方案的验证方法,验证中需要用到双线性映射$e(\cdot,\cdot)$
接收方收到消息$m$,签名$\sigma_m=(g^{\alpha\beta+mr\cdot\beta},g^r)$和公钥$pk=(g,g^{\alpha},g^{\beta})$后,计算
$$\begin{aligned}
&e(g^{\alpha},g^{\beta})\cdot e((g^r)^m,g^{\beta})\\
=&e(g,g)^{\alpha\beta}\cdot e(g,g)^{mr\beta}\\
=&e(g,g)^{\alpha\beta+mr\beta}
\end{aligned}$$
然后计算
$$e(g,g^{\alpha\beta+mr\beta})=e(g,g)^{\alpha\beta+mr\beta}$$
比较两者是否相等即可.
而对于已知消息消息$m$,签名$\sigma_m=(g^{\alpha\beta+mr\cdot\beta},g^r)$和公钥$pk=(g,g^{\alpha},g^{\beta})$后,对消息$m'$伪造签名的方法如下
计算$m'$在$\mathbb{Z}_p$上的逆元$(m')^{-1}$
计算$g^{r'}=(g^{rm})^{(m')^{-1}}$
以此法得出的$g^{r'}$拥有如下性质:$g^{r'm'}=g^{rm}$
这也意味着$g^{\alpha\beta+mr\beta}=g^{\alpha\beta+r'm'\beta}$
将已知的签名前半部分进行重放攻击,得到伪造签名$\sigma_{m'}=(g^{\alpha\beta+mr\beta},g^{r'})$
例6:
该系统中,私钥$sk=\alpha \in \mathbb{Z}_p$公钥$pk=(g,g^{\alpha})$
明文$m$的签名$\sigma_m=g^\frac{1}{\alpha\cdot m}$
问题:已知$(pk,m,\sigma_m)$,如何对另一串明文$m'$伪造签名?
参考答案
计算$m'$的逆元$(m')^{-1}$后与$m$相乘得到$\frac{m}{m'}$
然后计算
\begin{aligned}
\sigma_{m'}=&(\sigma_m)^{\frac{m}{m'}}\\
=&g^{\frac{1}{\alpha\cdot m}\cdot \frac{m}{m'}}\\
=&g^{\frac{1}{\alpha\cdot m'}}
\end{aligned}
得到伪造签名.