前言:
前面介绍了RSA公钥加密算法,而在公钥加密体系中,另一类重要的加密体制是基于离散对数的难解性,如ECC椭圆曲线加密、Diffie-Hellman算法、ElGamal算法等。为了解决离散对数问题,我们需要先学习《近世代数》。
本文涉及知识点实操练习——密码学原理(密码学是研究如何隐密地传递信息的学科。在现代特别指对信息以及其传输的数学性研究,常被认为是数学和计算机科学的分支,和信息论也密切相关。密码学是信息安全等相关议题,如认证、访问控制的核心。
代数基本知识:
1.群
2.环
3.域
4.有限域GF()
5.多项式环
群:
定义:
设G是非空集合,若在G内定义一种代数运算$\bigodot$,且满足下列4个条件,则称G(对运算$\bigodot$)构成一个群:
(1) 封闭性:对任意的a,b $\epsilon$ G,恒有 a$\bigodot$b $\epsilon$ G;
(2) 结合律:对任意的a,b,c $\epsilon$ G,恒有 (a$\bigodot$b)$\bigodot$c = a$\bigodot$(b$\bigodot$c)
(3) 有单位元:存在e $\epsilon$ G,对任意的a $\epsilon$ G,有 a$\bigodot$e=e$\bigodot$a=a
(4) 每个元存在逆元:对任意a $\epsilon$ G,存在b $\epsilon$ G,使得 a$\bigodot$b=b$\bigodot$a=e,称 b 为 a 的逆元。
其中运算 $\bigodot$ 可以是通常的乘法或者是加法。若 $\bigodot$ 为乘法,则称G为乘法群,单位元记为1.若$\bigodot$为加法,则称G为加法群,单位元记为0。
一般情况下,记: $$ \underbrace{a \bigodot a \bigodot \cdots \bigodot a }_{k个}=a^k$$
群 G 所含元素的个数,称为该群的阶。若群G含有有限个元素,则称G为有限群,否则,为无限群。
若对群G中任何a,b $\epsilon$ G,有 a $\bigodot$ b = b $\bigodot$ a,则称G为交换群或Abel群。
循环群:
定义:
设($G,\cdot)$是一个群如果群 $G$ 中存在一个元素 $\alpha$,使得对群 $G$ 任意元素 $b$ 都存在一个整数 $i$ ,使得 $b=\alpha^i$,则我们称 $G$ 是一个循环群。元素 $\alpha$ 是 $G$ 的一个生成元
加法循环群:
例:$(Z_6,\oplus)$是循环群,其中$Z_6=${0,1,2,3,4,5} ,$\oplus$ 为模6加法,其生成元为 1 或 5。
生成元的含义可以理解为:1或5的加法,可以实现群 $Z_6$ 内所有的元素,如:5+5+.....+
5 mod 6 = 5,35 mod 6 = 5
10 mod 6 = 4,40 mod 6 = 4,
15 mod 6 = 3,45 mod 6 = 3
20 mod 6 = 2,50 mod 6 = 2
25 mod 6 = 1,55 mod 6= 1
30 mod 6 = 0,60 mod 6= 0
所以通过 生成元 5 的模6的加法,可以得到群内的所有元素,实现循环群。而 2,3,4不能作为生成元,是因为这些元素的模6加法并不能得到群内所有的元素,且并不是连续循环的数。
乘法循环群也是同样的道理。
有限循环群的生成元还具有以下性质:
(元素的阶):循环群$(G,\cdot)$,$\alpha$ 为 $G$ 的一个生成元,1为 $G$ 的单位元,$G$ 的阶为 $n$ ,则:
$\alpha^n=1$
环:
定义:
若集合R上定义了两种二元运算:+(加法)及 x(乘法),且满足下列4个条件,则称R对这两种运算构成了一个环,记为 (R,$+$,$\times$):
(1) (R,$+$)是一个Abel群,其恒等元为零元,用0表示。
(2) 对任何a,b,c $\epsilon$ R,有$a\times (b \times c)=(a \times b) \times c$
(3)如果一个环(R,$+$,$\times$)还满足条件:对任意的a,b$\epsilon$ R,有$a\times b =b\times a$,则称环(R,$+$,$\times$)为交换环。
域:
定义:
设$F$是一个交换环,若$F$中的所有的非零元素对乘法都存在逆元,则称$F$为一个域。如果一个域所包含的元素是有限的则称此域是有限域,否则称为无限域。有限域中所含元素的个数称为有限域(R,$+$,$\times$)的阶。
有限域:
定义1:
有限域又常称为Galois域,并以GF(q)或$F_q$表示,其中q表示有限域的阶。
定义2:
设$F_1$、$F_2$是两个域,称$F_1$ 到 $F_2$ 的一个可逆映射 $\sigma$ 为一个同构(映射),如果 $\sigma$ 是保持运算的映射,即对任意的$a,b cF_1$,有: $\sigma(a+b)=\sigma(a)+\sigma(b)$,$\sigma(a \cdot b)=\sigma(a) \cdot \sigma(b)$
定理3:
设$F$是有限域,则有:
(1) 在同构的意义下,阶与$F$相同的有限域只有一个。同阶的有限域必同构。
(2)有限域 $F$的阶必为某个素数的幂.
(3) 设$F$的阶为 $q=p^n$,p是一个素数,则$F$的任何一个子域的阶为$p^m$,其中m是n的因子。
(4) 记$F_q^$为有限域$F_q$的所有非零元构成的集合,则$F_q^$关于乘法做成一个阶为 $q-1$ 的循环群。因此,对所有的 $a\epsilon F_q$,有 $a^q=a$ 。这个群称为$F_q$的乘法群,乘法群 $F_q^*$ 的生成元称为 $F_q$ 的本原元,共有 $\phi(q-1)$ 个本原元。
(5) 设$F_q$(其中$q=p^n$)是一个有限域,则对任何 $a,b\epsilon F_q$及非负整数 $k\geqslant 0$,有: $(a+b)^{p^k}=a^{p^k}+b^{p^k}$
多项式环:
定义:
设$F$是一个域,多项式$f(x)=a_nx^n+\cdot\cdot\cdot+a_1x+a_0$,其中$a_i\epsilon F$,$n\epsilon N$。
若$a_n \neq 0$,称n为该多项式的次数,称$a_n$为首项系数。
对于域 $F$ 上 $x$ 的多项式的全体组成的集合记为 $F[x]$ 。 多项式 $a(x)$ 的次数记为 $deg(a(x))$
设存在多项式 $f(x)与g(x)$,满足:
1.加法运算: $f(x)+g(x) \epsilon F[x]$
2.乘法运算: $f(x)\cdot g(x) \epsilon F[x]$
容易验证 $F[x]$ 对这样定义的多项式加法与乘法构成一个交换环,称为多项式交换环。
不可约多项式:
设 $f(x)$ 是 $F[x]$ 上的一个次数大于零的多项式,如果它不能分解成两个低次数的多项式的乘积,则称 $f(x)$ 是 $F$ 上的不可约多项式。
设 $p(x)$ 是 $F[x]$ 中的 $n$ 次不可约多项式,令 $F[x]_{p(x)}$ 为 $F[x]$ 中所有次数小于 $n$ 的多项式的集合。
定义 $F[x]_{p(x)}$上的二元运算 $\oplus$ 和 $\otimes$ 如下: 任取 $a(x),b(x)\epsilon F[x]_{p(x)}$,
$a(x)\oplus b(x)= (a(x)+b(x)) mod$ $p(x)$
$a(x)\otimes b(x)= (a(x)\cdot b(x)) mod$ $p(x)$
加密算法:
ElGamal算法
Menezes-Vanstone椭圆曲线密码体制
Diffie-Hellman算法
椭圆曲线上的Diffie-Hellman算法
椭圆曲线加密ECC
$Z_p$上的离散对数问题:
$Z_p$上的离散对数问题是指对于循环群 $Z_p$ (p是一个素数),$\alpha \epsilon Z_p$是群 $Z_p$ 的生成元,对于任意的 $c\epsilon Z_p$,寻找唯一 的整数 $d(0\leqslant d\leqslant p-1)$满足: $$C\equiv a^d (modp)$$ 我们把整数 $d$ 记为 $log_{\alpha}c$,并称之为离散对数。
ElGamal算法:
背景:ElGamal是建立在解有限乘法群上的离散对数问题的困难性基础上的一种公钥密码体制。
算法描述:
(1) 公开参数:取大素数 $p$ ,并取 $\alpha$ 是乘法群 $Z_p^*=$ { $1,\cdot\cdot\cdot,p-1$} 的一个生成元。
(2) 密钥生成:随机选取整数 $d$:$0 < d < (p-1)$ 并计算 $\beta =\alpha^d$ $mod$ $p$。
公开参数:$p 和 \alpha$
公钥:$\beta$
私钥:$d$
(3) 加密运算:对于明文 $m$ ,选取随机整数 $k$ :$0 < k < (p-1)$,计算:
$c_1=\alpha^k$ $mod$ $p$,
$c_2=m\beta^k$ $mod$ $p$
得到密文 $c=(c_1,c_2)$
(4) 解密运算:对于密文 $c=(c_1,c_2)$ ,用私钥 $d$ 解密。
$m=c_2(c_1^d)^{-1}$ $mod$ $p$
计算离散对数的算法:
1. Shanks算法
2. 小步大步发(baby-step 、giant-step)算法
3. Pohlig-Hellman算法
4. 指数演算法(index-calculus)
Menezes-Vanstone椭圆曲线密码体制
背景:Menezes-Vanstone椭圆曲线密码体制是ElGamal密码体制在椭圆曲线上的模拟。
算法描述:
(1) 公开参数:设 $p>3$是一个素数, E是有限域 $F_p$ 上的由方程 $y^2=x^3+ax+b$表示的椭圆曲线,$E(F_p)$是相应的 Abel 群。G是 $E(F_p)$ 中具有较大素数阶 $n$ 的一个点。
(2) 生成密钥:随机选取整数 $d$ : $2\leqslant n\leqslant n-1$,计算 $P=dG$。
$d$是私钥
$P$是公钥
(3) 加密运算:对任意明文 $m=(m_1,m_2)$,随机选取一个整数 $k$:$1\leqslant k\leqslant n-1$,使得$(x,y)=kP$,满足 $x$ 与 $y$ 均为非零元素。并计算:
$C_0=kG$
$c_1=m_1x$ $mod$ $p$
$c_2=m_2y$ $mod$ $p$
得到密文为 $(C_0,c_1,c_2)$
(4) 解密运算:
- 计算 $dC_0=(x,y)$
- 计算 $m_1=c_1x^{-1}$ $mod$ $p$
- 计算 $m_2=c_2y^{-1}$ $mod$ $p$
即得明文为 $(m_1,m_2)$
Diffie-Hellman算法:
背景:Diffie-Hellman算法由Whitfield Diffie 和 Martin Hellman 提出,该算法的安全性也是基于一般有限域上的离散对数问题的难解性。
算法描述:
(1) 假设Alice和Bob之间要建立一个共享密钥。Alice和Bob首先选定一个大素数 $p$ ,并选 $g$ 为乘法群 $F_p^*$ 中的一个生成元。
(2) Alice选取一个私钥 a(整数):$1\leqslant a\leqslant p-2$,计算 $A=g^a$ $mod$ $p$。发送A给Bob。
(3) Bob选取一个私钥 b(整数):$1\leqslant b\leqslant p-2$,计算 $B=g^b$ $mod$ $p$。发送B给Alice。
(4) Alice 计算 $k=B^a$ $mod$ $p$
(5) Bob 计算 $k=A^b$ $mod$ $p$
因为 $B^a=(g^b)^a=g^{ab}=(g^a)^b=A^b$ $mod$ $p$,Alice与Bob计算得到的 $k$ 是相同的。这样的 $k$ 可以作为通信的共享密钥
由于 $a$ 与 $b$ 是保密的,所以即使攻击者知道了 $p、g、A、B$,也很难获得 Alice 与 Bob 的共享密钥 $k$。因为攻击者要想获得 $k$ ,则需要先解决离散对数问题 $A=g^x$ $mod$ $p$ 或 $B=g^x$ $mod$ $p$ ,而这是困难的。
椭圆曲线上的Diffie-Hellman算法:
(1) Alice和Bob之间要建立一个共享密钥。 选取公共参数:取 $q>3$ 是某个素数幂,$E是F_q$上的椭圆曲线,$E(F_q)$ 是相应的 Abel 群,G 是 $E(F_q)$ 中的一个具有较大素数阶 $n$ 的点。
(2) Alice选取一个私钥 a(整数):$1\leqslant a\leqslant n-2$,计算 $A=aG$ 。发送A给Bob。
(3) Bob选取一个私钥 b(整数):$1\leqslant b\leqslant n-2$,计算 $B=bG$ 。发送B给Alice。
(4) Alice 计算 $K=aB$
(5) Bob 计算 $K=bA$
显然 Alice 与 Bob 计算得到的 $K$ 是相同的:
$aB=a(bG)=(ab)G=b(aG)=bA$
$K$ 即为 Alice 与 Bob 之间的共享密钥。
椭圆曲线上的Diffie-Hellman密钥交换算法的安全性基于椭圆曲线上离散对数问题的难解性。
椭圆曲线密码体制
1.有限域 $F_p$ 上 $ECC$ 的加法运算规则:
设 $p>3$ 是一个素数,那么有限域 $F_p$ 上的椭圆曲线 $E$ 可以表示成方程: $$y^2=x^3+ax+b(mod p)$$
- 椭圆曲线$E_p(a,b)$,$p$为素数,$x,y \epsilon[0,p-1]$ ,$y^2=x^3+ax+b$ ($mod$ $p$)
这里 $a,b \epsilon F_q$,满足: $$4a^3+27b^2 \neq 0 mod p$$
集合 $E(F_p)$ 中的加法运算定义为: 对任何 $P=(x_1,y_1) \epsilon E(F_p)$,$Q=(x_2,y_2) \epsilon E(F_p)$
- $P+O=P$ ($O$为无穷远点)
2. $$P+Q=\begin{cases}O,&如果x_1=x_2,y_1=-y_2\ \(x_3,y_3),&否则\end{cases}$$
其中: $$\begin{cases}x_3=\lambda^2-x_1-x_2\y_3=\lambda(x_1-x_3)-y_1\end{cases}$$
$$\lambda =\begin{cases} \frac{y_2-y_1}{x_2-x_1},&如果 P\neq Q\ \ \frac{3x_1^2+a}{2y_1},&如果P=Q \ \end{cases}$$
如果 $P+Q=O$,则记 $Q=-P$ ,并称 $-P$ 为 $P$ 的负元。
一般地,我们将 $\underbrace{P+P+\cdot\cdot\cdot+P}{n次}$ 记为 $np$ ,即 $np=$ $\underbrace{P+P+\cdot\cdot\cdot+P}{n次}$,同时,定义:$nP=O$(零元)
有限域模p
一个有限域是整数模 $p$ 的集合(integers mod p,p为素数),可表示为 $z/p$, $GF(p)$,或者 $F_p$,一般用 $F_p$。
椭圆曲线的阶
定义:一个群有多少个点叫做这个群的 “阶” (order)
2.ECC加密算法描述:
- 点G称为基点(base point)
- $k$为私钥
- $K$为公钥
其中$K=kG$, $K、G$ 为椭圆曲线 $E_p(a,b)$ 上的点,$n$ 为 $G$ 的阶 $(nG=O无穷大)$,$k$为小于$n$的整数。对于给定的$k$和$G$,根据加法法则,计算$K$很容易。而基于离散对数的难解性,给定$K$和$G$,求$k$则非常困难。
- 公开参数:Alice选取一条椭圆曲线$E_p(a,b)$,并选取椭圆曲线上的一点,作为基点G。
- 生成公钥:Alice 选取一个私钥 $k$ $(k < n)$,生成公钥 $K=kG$。
- Alice 将$E_p(a,b)$ 和点K,G传给用户 Bob
- 加密运算:Bob 将 明文 编码到 $E_p(a,b)$ 上的一点 $M$ ,取一个随机数 $r(r < n)$。
- Bob 计算点 $C_1=M+rK$ 和 $C_2=rG$
- 用户Bob将 $C_1、C_2$ 传给用户 A 。
- 解密运算: Alice计算:$M=C_1-kC_2$,将 M 解码就得到明文了。
(这里:$C_1-kC_2=M+rK-k(rG)=M+rkG-rkG=M$)
后记:
在学习ECC椭圆曲线加密等,基于离散对数难解性问题的加密算法前。我们需要先掌握好《近世代数》的知识点。因为常见的椭圆曲线加密都是在有限域内实现的,首先得知道啥是"有限域"。下一篇我会给大家演示在实战中的应用,所以基础先要打好。文中有错误的地方,欢迎读者留言指出。
来源:oschina
链接:https://my.oschina.net/hetianlab/blog/4808442