1.EIGamal加密
1.1.基于素数群的 EIGamal加密
系统参数:素数群
G
\mathbb{G}
G 的阶为p,生成元为g
密钥生成:选择随机数
α
∈
Z
p
,
\alpha\in\mathbb{Z}_{p},
α∈Zp, ,计算
g
1
=
g
a
g_{1}=g^{a}
g1=ga ,则私钥和公钥为
(
α
,
g
1
)
(\alpha,g_{1})
(α,g1)。
加密:将消息编码为群元素
m
∈
G
\ m\in\mathbb{G}
m∈G ,公钥
g
1
g_{1}
g1,选择随机数 r
∈
Z
p
,
\in\mathbb{Z}_{p},
∈Zp, ,计算密文
C
1
=
g
r
,
C
2
=
g
1
r
⋅
m
C_{1}=g^{r},C_{2}=g_{1}^{r}\cdot m
C1=gr,C2=g1r⋅m
解密:对于密文
(
C
1
,
C
2
)
(C_{1}, C_{2})
(C1,C2),使用私钥
α
{\alpha}
α ,计算
m
=
C
2
⋅
C
1
−
α
m=C_{2}\cdot C_{1}^{-\alpha}
m=C2⋅C1−α
公式推导过程:
C
2
⋅
C
1
−
α
=
(
g
1
r
⋅
m
)
(
g
r
)
−
α
=
m
C_{2}\cdot C_{1}^{-\alpha}=(g_{1}^{r}\cdot m)(g^{r})^{-\alpha}=m
C2⋅C1−α=(g1r⋅m)(gr)−α=m
安全性分析:基于DDH 困难问题,归约损失为 2, 1bits
离散对数是困难的,但是计算逆元是简单的
h
n
=
e
h
⋅
h
n
−
1
=
e
h
⋅
h
−
1
=
e
h
−
1
=
h
n
−
1
\begin{array}{l}{h^{n}=e}\\ {h \cdot h^{n-1}=e}\\ {h\cdot h^{-1}=e}\\ {h^{-1}=h^{n-1}}\end{array}
hn=eh⋅hn−1=eh⋅h−1=eh−1=hn−1
方案扩展:
应用需求:将消息编码到群上
m
∈
G
m\in\mathbb{G}
m∈G 很难,需要加密任意长的数据
m
∈
{
0
,
1
}
∗
m\in \lbrace0,1 \rbrace^{*}
m∈{0,1}∗ (代表0~1比特的任意字符串)。
**加密:**对于任意长消息
m
∈
{
0
,
1
}
∗
m\in \lbrace0,1 \rbrace^{*}
m∈{0,1}∗ ,公钥
g
1
g_{1}
g1,选择随机数
r
∈
Z
p
,
r\in\mathbb{Z}_{p},
r∈Zp, 和随机群元素
x
∈
G
.
x\in\mathbb{G}.
x∈G. ,计算密文
C
1
=
g
r
,
C
2
=
g
1
r
⋅
x
,
C
3
=
G
C
M
−
A
E
S
−
E
n
c
(
h
a
s
h
(
x
)
,
m
)
C_{1}=g^{r},C_{2}=g_{1}^{r}\cdot x,C_{3}=GCM_{-}AES_{-}Enc(hash(x),m)
C1=gr,C2=g1r⋅x,C3=GCM−AES−Enc(hash(x),m)
解密:对于密文
(
C
1
,
C
2
)
(C_{1}, C_{2})
(C1,C2),使用私钥α,计算
x
=
C
2
⋅
C
1
−
α
x=C_{2}\cdot C_{1}^{-\alpha}
x=C2⋅C1−α ,然后计算
m
=
G
C
M
−
A
E
S
−
D
e
c
(
h
a
s
h
(
x
)
,
C
3
)
m=G C M_{-}AES_{-}D e c(hash(x),C_{3})
m=GCM−AES−Dec(hash(x),C3)
数字信封:公钥加密一个对称密钥x,使用对称密钥x进行 AES 对称加密。
1.2.基于素数群的 Hashed ElGamal 加密
系统参数:素数群
G
\mathbb{G}
G的阶为p,生成元为g ·
密钥生成:选择随机数
α
∈
Z
p
\alpha\in\mathbb{Z}_{p}
α∈Zp ,计算
g
1
=
g
α
g_{1}=g^{\alpha}
g1=gα ,则私钥和公钥为
(
a
,
g
1
)
(a,g_{1})
(a,g1)。
加密:对于消息
m
∈
{
0
,
1
}
256
m\in \lbrace0,1 \rbrace^{256}
m∈{0,1}256 ,公钥
g
1
g_{1}
g1,选择随机数
r
∈
Z
p
r\in\mathbb{Z}_{p}
r∈Zp ,计算密文
C
1
=
g
r
,
C
2
=
h
a
s
h
(
g
1
r
)
⊕
m
C_{1}=g^{r},C_{2}=h a s h(g_{1}^{r})\oplus m
C1=gr,C2=hash(g1r)⊕m
解密:对于密文
(
C
1
,
C
2
)
(C_{1}, C_{2})
(C1,C2),使用私钥α,计算
m
=
C
2
⊕
h
a
s
h
(
C
1
α
)
m=C_{2}\oplus h a s h(C_{1}^{\alpha})
m=C2⊕hash(C1α)
公式推导过程:
C
2
⋅
C
1
−
α
=
(
h
a
s
h
(
g
1
r
)
⊕
m
)
⊕
h
a
s
h
(
(
g
r
)
α
)
=
m
C_{2}\cdot C_{1}^{-\alpha}=\left(h a s h(g_{1}^{r})\oplus m\right)\oplus h a s h\left((g^{r})^{\alpha}\right)=m
C2⋅C1−α=(hash(g1r)⊕m)⊕hash((gr)α)=m (
⊕
异或运算,
a
⊕
b
=
c
则
b
=
c
⊕
a
,
推导
\oplus异或运算,a\oplus b=c则b=c\oplus a,推导
⊕异或运算,a⊕b=c则b=c⊕a,推导)
安全性分析:基于 CDH困难问题,归约损失为 q h a s h q_{\mathrm{hash}} qhash ,查询随机预言机的次数,通常是 2 40 2^{40} 240 。假设私钥长度为 1000bit,算法安全性为 960bit.
1.3.基于椭圆曲线群的ElGamal 加密
系统参数:椭圆曲线群
G
\mathbb{G}
G 的阶为p,生成元为
G
G
G。
密钥生成:选择随机数
α
∈
Z
p
\alpha\in\mathbb{Z}_{p}
α∈Zp ,计算
G
1
=
α
⋅
G
G_{1}=\alpha\cdot G
G1=α⋅G ,则私钥和公钥分别为
(
α
,
G
1
)
(\alpha,G_{\mathrm{1}})
(α,G1)。
加密:消息编码到椭圆曲线群
M
∈
G
M\in\mathbb{G}
M∈G ,公钥
G
1
G_{1}
G1 ,选择随机数
r
∈
Z
p
r\in\mathbb{Z}_{p}
r∈Zp ,计算密文
C
1
=
r
⋅
G
,
C
2
=
M
+
r
⋅
G
1
C_{1}=r\cdot G,C_{2}=M+r\cdot G_{1}
C1=r⋅G,C2=M+r⋅G1
解密:对于密文
(
C
1
,
C
2
)
(C_{1}, C_{2})
(C1,C2),使用私钥
α
{\alpha}
α ,计算
M
=
C
2
−
α
⋅
C
1
M=C_{2}-\alpha\cdot C_{1}
M=C2−α⋅C1
公式过程:
C
2
−
α
⋅
C
1
=
(
M
+
r
⋅
G
1
)
−
α
r
⋅
G
=
M
C_{2}-\alpha\cdot C_{1}=(M+r\cdot G_{1})-\alpha r\cdot G=M
C2−α⋅C1=(M+r⋅G1)−αr⋅G=M
安全性分析:基于 DDH 困难问题,归约损失为 2。
1.4.基于椭圆曲线群的 Hashed ElGamal 加密
引入hash类似于2中的换成椭圆曲线即可
加密:对于消息
m
∈
{
0
,
1
}
256
m\in \lbrace0,1 \rbrace^{256}
m∈{0,1}256 ,公钥
G
1
G_{1}
G1,选择随机数
r
∈
Z
p
r\in\mathbb{Z}_{p}
r∈Zp ,计算密文
C
1
=
r
⋅
G
,
C
2
=
m
⊕
h
a
s
h
(
r
⋅
G
1
)
C_{1}={r\cdot G},C_{2}=m\oplus h a s h({r}\cdot{G}_{1})
C1=r⋅G,C2=m⊕hash(r⋅G1)
解密:对于密文
(
C
1
,
C
2
)
(C_{1},C_{2})
(C1,C2) ,使用私钥α,计算
m
=
C
2
⊕
h
a
s
h
(
α
⋅
C
1
)
m=C_{2}\oplus hash(\alpha\cdot C_{1})
m=C2⊕hash(α⋅C1)
公式过程:
C
2
⊕
h
a
s
h
(
α
⋅
C
1
)
=
(
m
⊕
h
a
s
h
(
r
⋅
G
1
)
)
⊕
h
a
s
h
(
α
r
⋅
G
)
=
m
C_{2}\oplus hash(\alpha\cdot C_{1})=(m\oplus h a s h({r}\cdot{G}_{1})) \oplus hash(\alpha r\cdot G) = m
C2⊕hash(α⋅C1)=(m⊕hash(r⋅G1))⊕hash(αr⋅G)=m
安全性分析:基于 CDH 困难问题,归约损失为
q
h
a
s
h
q_{hash}
qhash ,查询随机预言机的次数,通常是
2
40
2^{40}
240 。私钥长度为256bit,算法安全性为216bit。对于椭圆曲线,通常70 bit的随机数就足够安全。
1.5.基于素数群的 Twin Hashed ElGamal 加密
系统参数:素数群
G
\mathbb{G}
G的阶为p,生成元为g 。
密钥生成:选择2个随机数
α
,
β
∈
Z
p
\alpha,\beta\in\mathbb{Z}_{p}
α,β∈Zp ,计算
g
1
=
g
α
,
g
2
=
g
β
g_{1}=g^{\alpha},g_{2}=g^{\beta}
g1=gα,g2=gβ ,则私钥为
α
,
β
\alpha,\beta
α,β 和公钥为
g
1
,
g
2
g_{1},g_{2}
g1,g2。
加密:对于消息
m
∈
{
0
,
1
}
256
m\in\{0,1\}^{256}
m∈{0,1}256 ,公钥
g
1
,
g
2
g_{1},g_{2}
g1,g2,选择随机数
r
∈
Z
p
r\in\mathbb{Z}_{p}
r∈Zp ,计算密文
C
1
=
g
r
,
C
2
=
h
a
s
h
(
g
1
r
,
g
2
r
)
⊕
m
C_{1}=g^{r},C_{2}=h a s h(g_{1}^{r},g_{2}^{r})\oplus m
C1=gr,C2=hash(g1r,g2r)⊕m
解密:对于密文
(
C
1
,
C
2
)
(C_{1},C_{2})
(C1,C2),使用私钥
α
,
β
\alpha,\beta
α,β ,计算
m
=
C
2
⊕
h
a
s
h
(
C
1
α
,
C
2
β
)
m=C_{2}\oplus h a s h(C_{1}^{\alpha},C_{2}^{\beta})
m=C2⊕hash(C1α,C2β)
公式推导过程:
C
2
⊕
h
a
s
h
(
(
C
1
α
,
C
2
β
)
=
(
h
a
s
h
(
(
g
1
r
,
g
2
r
)
⊕
m
)
⊕
h
a
s
h
(
g
r
α
,
g
r
β
)
=
m
C_{2}\oplus hash((C_{1}^{\alpha},C_{2}^{\beta})=(hash((g_{1}^{r},g_{2}^{r})\oplus m) \oplus hash(g^{r\alpha},g^{r\beta })=m
C2⊕hash((C1α,C2β)=(hash((g1r,g2r)⊕m)⊕hash(grα,grβ)=m
安全性分析:添加了一个随机因子(私钥),基于CDH 困难问题,无归约损失
2.Cramer-shoup(EIGamal的安全升级)
2.1基于数群的Cramer-shoup加密
系统参数:素数群
G
\mathbb{G}
G的阶为p,生成元为
g
1
,
g
2
g_{1},g_{2}
g1,g2。
密钥生成:选择5个随机数
x
1
,
x
2
,
y
1
,
y
2
,
z
∈
Z
p
x_{1},x_{2},y_{1},y_{2},z\in\mathbb{Z}_{p}
x1,x2,y1,y2,z∈Zp ,计算3个群元素
c
=
g
1
x
1
g
2
x
2
,
d
=
g
1
y
1
g
2
y
2
,
h
=
g
1
z
c=g_{1}^{x_{1}}g_{2}^{x_{2}},d=g_{1}^{y_{1}}g_{2}^{y_{2}},h=g_{1}^{z}
c=g1x1g2x2,d=g1y1g2y2,h=g1z ,则私钥为
(
x
1
,
x
2
,
y
1
,
y
2
,
z
)
(x_{1},x_{2},y_{1},y_{2},z)
(x1,x2,y1,y2,z)和公钥为
(
c
,
d
,
h
)
(c,d,h)
(c,d,h)。
加密:对于消息
m
∈
G
m\in\mathbb{G}
m∈G ,公钥
(
c
,
d
,
h
)
(c,d,h)
(c,d,h) ,选择随机数
r
∈
Z
p
r\in\mathbb{Z}_{p}
r∈Zp ,计算密文
(
u
1
,
u
2
,
e
,
v
)
(u_{1},u_{2},e,v)
(u1,u2,e,v)
u
1
=
g
1
r
,
u
2
=
g
2
r
,
e
=
h
r
⋅
m
,
α
=
h
a
s
h
(
u
1
,
u
2
,
e
)
,
v
=
c
r
d
r
α
\begin{array}{l}{{u_{1}=g_{1}^{r},u_{2}=g_{2}^{r},e=h^{r}\cdot m,}}\\ {{\alpha=h a s h(u_{1},u_{2},e),}}\\ {{v=c^{r}d^{r\alpha}}}\end{array}
u1=g1r,u2=g2r,e=hr⋅m,α=hash(u1,u2,e),v=crdrα
解密:对于密文
(
u
1
,
u
2
,
e
,
v
)
(u_{1},u_{2},e,v)
(u1,u2,e,v) ,使用私钥
(
x
1
,
x
2
,
y
1
,
y
2
,
z
)
(x_{1},x_{2},y_{1},y_{2},z)
(x1,x2,y1,y2,z),计算
α
=
h
a
s
h
(
u
1
,
u
2
,
e
)
\alpha=h a s h(u_{1},u_{2},e)
α=hash(u1,u2,e)
校验
v
=
u
1
x
1
+
y
1
α
u
2
x
2
+
y
2
α
v=u_{1}^{x_{1}+y_{1}\alpha}u_{2}^{x_{2}+y_{2}\alpha}
v=u1x1+y1αu2x2+y2α ,然后解密
m
=
e
⋅
u
1
−
z
m=e\cdot u_{1}^{-z}
m=e⋅u1−z ·
公式推导过程:
2.2基于椭圆曲线群 Cramer-Shoup 加密
系统参数:素数群
G
\mathbb{G}
G的阶为p,生成元为
G
1
,
G
2
G_{1},G_{2}
G1,G2。
密钥生成:选择5个随机数
x
1
,
x
2
,
y
1
,
y
2
,
z
∈
Z
p
x_{1},x_{2},y_{1},y_{2},z\in\mathbb{Z}_{p}
x1,x2,y1,y2,z∈Zp ,计算3个群元素
C
=
x
1
⋅
G
+
x
2
⋅
G
,
D
=
y
1
⋅
G
+
y
2
⋅
G
,
,
H
=
z
⋅
G
C=x_{1}\cdot G+x_{2}·G,D=y_{1}·G+y_{2}·G,,H=z·G
C=x1⋅G+x2⋅G,D=y1⋅G+y2⋅G,,H=z⋅G,则私钥为
(
x
1
,
x
2
,
y
1
,
y
2
,
z
)
(x_{1},x_{2},y_{1},y_{2},z)
(x1,x2,y1,y2,z) 和公钥为
(
C
,
D
,
H
)
(C,D,H)
(C,D,H)
加密:对于消息
M
∈
G
M\in\mathbb{G}
M∈G ,公钥
(
C
,
D
,
H
)
(C,D,H)
(C,D,H) ,选择随机数
r
∈
Z
p
r\in\mathbb{Z}_{p}
r∈Zp ,计算密文
(
U
1
,
U
2
,
e
,
V
)
(U_{1},U_{2},e,V)
(U1,U2,e,V)
U
1
=
r
⋅
G
1
,
U
2
=
r
⋅
G
2
,
E
=
r
⋅
H
+
M
,
α
=
h
a
s
h
(
U
1
,
U
2
,
E
)
,
V
=
r
⋅
C
+
r
α
⋅
D
\begin{array}{l c r}{{U_{1}=r\cdot G_{1},U_{2}=r\cdot G_{2},E=r\cdot H+M,}}\\ {{\alpha=h a s h(U_{1},U_{2},E),}}\\ {{V=r\cdot C+r\alpha\cdot D}}\end{array}
U1=r⋅G1,U2=r⋅G2,E=r⋅H+M,α=hash(U1,U2,E),V=r⋅C+rα⋅D
解密:对于密文
(
U
1
,
U
2
,
e
,
V
)
(U_{1},U_{2},e,V)
(U1,U2,e,V) ,使用私钥
(
x
1
,
x
2
,
y
1
,
y
2
,
z
)
(x_{1},x_{2},y_{1},y_{2},z)
(x1,x2,y1,y2,z),计算
α
=
h
a
s
h
(
U
1
,
U
2
,
E
)
\alpha=h a s h(U_{1},U_{2},E)
α=hash(U1,U2,E)
校验
V
=
(
x
1
+
y
1
α
)
⋅
U
1
+
(
x
2
+
y
2
α
)
⋅
U
2
V=(x_{1}+y_{1}\alpha)\cdot U_{1}+(x_{2}+y_{2}\alpha)\cdot U_{2}
V=(x1+y1α)⋅U1+(x2+y2α)⋅U2 ,然后解密
M
=
E
−
z
U
1
M=E-z\ U_{1}
M=E−z U1
公式推导过程:
(
x
1
+
y
1
α
)
⋅
U
1
+
(
x
2
+
y
1
α
)
U
2
=
(
x
1
+
y
1
α
)
r
⋅
G
1
+
(
x
2
+
y
2
α
)
r
⋅
G
2
=
x
1
r
⋅
G
1
+
y
1
α
r
⋅
G
1
+
x
2
r
⋅
G
1
+
y
2
α
r
⋅
G
2
=
r
(
x
1
G
1
+
x
2
⋅
G
2
)
+
r
α
(
y
1
⋅
G
1
+
y
2
⋅
G
2
)
=
r
C
+
r
α
D
=
V
E
−
z
⋅
U
1
=
(
r
⋅
H
+
M
)
−
z
r
⋅
G
1
=
M
\begin{array}{c}{{(x_{1}+y_{1}\alpha)\cdot U_{1}+(x_{2}+y_{1}\alpha)U_{2}=(x_{1}+y_{1}\alpha)r\cdot G_{1}+(x_{2}+y_{2}\alpha)r\cdot G_{2}}}\\ {{=x_{1}r\cdot G_{1}+y_{1}\alpha r\cdot G_{1}+x_{2}r\cdot G_{1}+y_{2}\alpha r\cdot G_{2}}}\\ {{=r(x_{1}G_{1}+x_{2}\cdot G_{2})+r\alpha(y_{1}\cdot G_{1}+y_{2}\cdot G_{2})}}\\ {{=rC+r\alpha D=V}}\\ {{E-z\cdot U_{1}=(r\cdot H+M)-zr\cdot G_{1}=M}}\end{array}
(x1+y1α)⋅U1+(x2+y1α)U2=(x1+y1α)r⋅G1+(x2+y2α)r⋅G2=x1r⋅G1+y1αr⋅G1+x2r⋅G1+y2αr⋅G2=r(x1G1+x2⋅G2)+rα(y1⋅G1+y2⋅G2)=rC+rαD=VE−z⋅U1=(r⋅H+M)−zr⋅G1=M
优点:校验使得安全性从 CPA 安全提升到 CCA 安全。
缺点:私钥、公钥、密文长度增加,计算复杂度增加。
补充:
当密码系统只有承受住选择明文攻击(CPA)和选择密文攻击(CCA),才能算是安全的。
其中,四种攻击方式对应的攻击强度为:
攻击难度:选择密文攻击(CCA)>选择明文攻击(CPA)>已知明文攻击(KPA)>唯密文攻击(COA)
难易程度:选择密文攻击(CCA)<选择明文攻击(CPA)<已知明文攻击(KPA)<唯密文攻击(COA)