WEP为异步模式,
E
n
c
(
m
i
)
:
=
<
I
V
i
,
G
(
I
V
i
∥
k
)
⊕
m
i
>
\mathsf{Enc}(m_i) := \left< IV_i, G(IV_i\|k) \oplus m_i\right>
Enc(mi?):=?IVi?,G(IVi?∥k)⊕mi??
I
V
IV
IV长度为24比特,在
2
24
≈
2^{24} \approx
224≈ 16M 帧后
I
V
IV
IV会产生重复;
在一些WiFi网卡上,在电源重启后
I
V
IV
IV重置为0;
I
V
i
=
I
V
i
?
1
+
1
IV_i = IV_{i-1} + 1
IVi?=IVi?1?+1. 对于RC4,在40,000帧后可以恢复
k
k
k ;
多个明文的加密实验
P
r
i
v
K
A
,
Π
m
u
l
t
(
n
)
\mathsf{PrivK}^{\mathsf{mult}}_{\mathcal{A},\Pi}(n)
PrivKA,Πmult?(n),当一次加密多个明文时,窃听者敌手能够区分出两组明文吗?
一个敌手
A
\mathcal{A}
A与一个挑战者
C
\mathcal{C}
C进行3轮交互:
A
\mathcal{A}
A选择两个长度相同、内容不同明文向量
M
?
0
=
(
m
0
1
,
…
,
m
0
t
)
\vec{M}_0=(m_0^1,\dots,m_0^t)
M0?=(m01?,…,m0t?),
M
?
1
=
(
m
1
1
,
…
,
m
1
t
)
\vec{M}_1=(m_1^1,\dots,m_1^t)
M1?=(m11?,…,m1t?),其中两个向量中同一位置的明文长度相同
?
i
,
∣
m
0
i
∣
=
∣
m
1
i
∣
\forall i, |m_0^i| = |m_1^i|
?i,∣m0i?∣=∣m1i?∣,发送给
C
\mathcal{C}
C;
C
\mathcal{C}
C根据密钥生成算法生成一个新密钥
k
←
G
e
n
(
1
n
)
k \gets \mathsf{Gen}(1^n)
k←Gen(1n),一个随机比特
b
←
{
0
,
1
}
b \gets \{0,1\}
b←{0,1}。对向量
M
?
b
\vec{M}_b
Mb?中每个明文加密
c
i
←
E
n
c
k
(
m
b
i
)
c^i \gets \mathsf{Enc}_k(m_b^i)
ci←Enck?(mbi?) 得到一个密文向量
C
?
=
(
c
1
,
…
,
c
t
)
\vec{C}=(c^1,\dots,c^t)
C=(c1,…,ct) ,并发送给
A
\mathcal{A}
A;
A
\mathcal{A}
A输出对所加密明文向量的猜测
b
′
b'
b′,若
b
=
b
′
b=b'
b=b′,则
A
\mathcal{A}
A成功;否则,失败;
Π
\Pi
Π 是窃听者出现时不可区分的多重加密方案,如果任意PPT的敌手
A
\mathcal{A}
A, 存在可忽略的函数
n
e
g
l
\mathsf{negl}
negl 使得
Pr
?
[
P
r
i
v
K
A
,
Π
m
u
l
t
(
n
)
=
1
]
≤
1
2
+
n
e
g
l
(
n
)
.
\Pr\left[\mathsf{PrivK}^{\mathsf{mult}}_{\mathcal{A},\Pi}(n)=1\right] \le \frac{1}{2} + \mathsf{negl}(n).
Pr[PrivKA,Πmult?(n)=1]≤21?+negl(n).
CPA不可区分实验
P
r
i
v
K
A
,
Π
c
p
a
(
n
)
\mathsf{PrivK}^{\mathsf{cpa}}_{\mathcal{A},\Pi}(n)
PrivKA,Πcpa?(n):
挑战者生成密钥
k
←
G
e
n
(
1
n
)
k \gets \mathsf{Gen}(1^n)
k←Gen(1n);(这里与窃听者不可区分实验相比,密钥的生成提前了,这是为了下一步提供加密预言机)
A
\mathcal{A}
A 被给予输入
1
n
1^n
1n 和对加密函数
E
n
c
k
(
?
)
\mathsf{Enc}_k(\cdot)
Enck?(?)的预言机访问(oracle access)
A
E
n
c
k
(
?
)
\mathcal{A}^{\mathsf{Enc}_k(\cdot)}
AEnck?(?) ,输出相同长度
m
0
,
m
1
m_0, m_1
m0?,m1? ;
挑战者生成随机比特
b
←
{
0
,
1
}
b \gets \{0,1\}
b←{0,1},将挑战密文
c
←
E
n
c
k
(
m
b
)
c \gets \mathsf{Enc}_k(m_b)
c←Enck?(mb?) 发送给
A
\mathcal{A}
A;
A
\mathcal{A}
A 继续对
E
n
c
k
(
?
)
\mathsf{Enc}_k(\cdot)
Enck?(?)的预言机的访问,输出
b
′
b'
b′;如果
b
′
=
b
b' = b
b′=b,则
A
\mathcal{A}
A成功
P
r
i
v
K
A
,
Π
c
p
a
=
1
\mathsf{PrivK}^{\mathsf{cpa}}_{\mathcal{A},\Pi}=1
PrivKA,Πcpa?=1,否则 0。
Π
\Pi
Π 是CPA不可区分加密方案 (CPA安全的),如果任意概率多项式时间算法
A
\mathcal{A}
A,存在可忽略的函数
n
e
g
l
\mathsf{negl}
negl使得,
Pr
?
[
P
r
i
v
K
A
,
Π
c
p
a
(
n
)
=
1
]
≤
1
2
+
n
e
g
l
(
n
)
\Pr\left[\mathsf{PrivK}^{\mathsf{cpa}}_{\mathcal{A},\Pi}(n)=1\right] \le \frac{1}{2} + \mathsf{negl}(n)
Pr[PrivKA,Πcpa?(n)=1]≤21?+negl(n)
F
k
:
{
0
,
1
}
?
→
{
0
,
1
}
?
F_k : \{0,1\}^* \to \{0,1\}^*
Fk?:{0,1}?→{0,1}?,
F
k
(
x
)
=
def
F
(
k
,
x
)
F_k(x) \overset{\text{def}}{=} F(k,x)
Fk?(x)=defF(k,x)
两个输入到一个输出,看上去像,但不是加密函数;输入key,得到一个一输入到一输出的函数;
查表Look-up table
f
f
f:
{
0
,
1
}
n
→
{
0
,
1
}
n
\{0,1\}^n \to \{0,1\}^n
{0,1}n→{0,1}n 需要多少比特信息存储?
函数族Function family
F
u
n
c
n
\mathsf{Func}_n
Funcn?: 包含所有函数
{
0
,
1
}
n
→
{
0
,
1
}
n
\{0,1\}^n \to \{0,1\}^n
{0,1}n→{0,1}n.
∣
F
u
n
c
n
∣
=
2
n
?
2
n
|\mathsf{Func}_n| = 2^{n\cdot2^n}
∣Funcn?∣=2n?2n
一个PRF是函数族中一个子集,key确定下的PRF是函数族中一个元素,一个查表是函数族中一个元素;
长度保留Length Preserving:
?
k
e
y
(
n
)
=
?
i
n
(
n
)
=
?
o
u
t
(
n
)
=
n
\ell_{key}(n) = \ell_{in}(n) = \ell_{out}(n) = n
?key?(n)=?in?(n)=?out?(n)=n;密钥长度与函数输入、输出长度相同为
n
n
n;没有特殊说明时,只讨论长度保留的函数;
伪随机函数定义
直觉上,一个PRF生成的带密钥的函数与从函数族中随机选择的真随机函数(查表)之间是不可区分的;然而,一个真随机函数具有指数长度,无法“预先生成”,只能“on-the-fly”(边运行、边生成)的使用,引入一个对函数
O
\mathcal{O}
O的确定性的预言机访问(oracle access)
D
O
D^\mathcal{O}
DO。
一个带密钥的函数是一个伪随机函数(PRF),对任意PPT区分器
D
D
D,
∣
Pr
?
[
D
F
k
(
?
)
(
1
n
)
=
1
]
?
Pr
?
[
D
f
(
?
)
(
1
n
)
=
1
]
∣
≤
n
e
g
l
(
n
)
\left|\Pr[D^{F_k(\cdot)}(1^n)=1] - \Pr[D^{f(\cdot)}(1^n)=1]\right| \le \mathsf{negl}(n)
?Pr[DFk?(?)(1n)=1]?Pr[Df(?)(1n)=1]?≤negl(n),其中
f
f
f是
F
u
n
c
n
\mathsf{Func}_n
Funcn?中随机函数。
F
k
(
r
)
F_k(r)
Fk?(r):
∣
k
∣
=
∣
m
∣
=
∣
r
∣
=
n
|k| = |m| = |r| = n
∣k∣=∣m∣=∣r∣=n. 长度保留;
G
e
n
\mathsf{Gen}
Gen:
k
∈
{
0
,
1
}
n
k \in \{0,1\}^n
k∈{0,1}n.
E
n
c
\mathsf{Enc}
Enc:
s
:
=
F
k
(
r
)
⊕
m
s := F_k(r)\oplus m
s:=Fk?(r)⊕m,
c
:
=
<
r
,
s
>
c := \left<r, s\right>
c:=?r,s?. 密文包括两部分新随机串,以及异或输出;
D
e
c
\mathsf{Dec}
Dec:
m
:
=
F
k
(
r
)
⊕
s
m := F_k(r)\oplus s
m:=Fk?(r)⊕s.
定理:上述方案是CPA安全的。
从PRF到CPA安全的证明
思路:从PRF的区分器算法
D
\mathcal{D}
D规约到加密方案敌手算法
A
\mathcal{A}
A,区分器
D
\mathcal{D}
D作为敌手
A
\mathcal{A}
A的挑战者,敌手
A
\mathcal{A}
A实验成功时区分器
D
\mathcal{D}
D输出1。分两种情况,当输入真随机函数
f
f
f时,相当于一次一密;当输入伪随机函数
F
k
F_k
Fk?时,为加密方案。
规约:
D
\mathcal{D}
D输入预言机,输出一个比特;
A
\mathcal{A}
A的加密预言机访问通过
D
\mathcal{D}
D的预言机
O
\mathcal{O}
O来提供,
c
:
=
<
r
,
O
(
r
)
⊕
m
>
c := \left<r, \mathcal{O}(r) \oplus m \right>
c:=?r,O(r)⊕m?;
D
\mathcal{D}
D输出1,当
A
\mathcal{A}
A在实验中成功。
这里有两个预言机:
D
\mathcal{D}
D访问的预言机
O
\mathcal{O}
O,
A
\mathcal{A}
A访问的加密预言机
E
n
c
k
\mathsf{Enc}_k
Enck?,后者不能直接访问前者的预言机。
从PRF到CPA安全的证明(续)
考虑真随机函数
f
f
f的情况,分析不可区分实验成功概率
Pr
?
[
P
r
i
v
K
A
,
Π
~
c
p
a
(
n
)
=
1
]
=
Pr
?
[
B
r
e
a
k
]
\Pr[\mathsf{PrivK}_{\mathcal{A},\tilde{\Pi}}^{\mathsf{cpa}}(n) = 1] = \Pr[\mathsf{Break}]
Pr[PrivKA,Π~cpa?(n)=1]=Pr[Break]。敌手
A
\mathcal{A}
A访问加密预言机可以获得多项式
q
(
n
)
q(n)
q(n)个明文与密文对的查询结果并得到随机串和pad
{
<
r
i
,
f
(
r
i
)
>
}
\{ \left< r_i, f(r_i) \right> \}
{?ri?,f(ri?)?};当收到挑战密文
c
=
<
r
c
,
s
:
=
f
(
r
c
)
⊕
m
b
>
c=\left<r_c, s:=f(r_c)\oplus m_b\right>
c=?rc?,s:=f(rc?)⊕mb??时,根据之前查询结果中随机串是否与挑战密文中随机串相同,分为两种情况:
当有相同随机串时,根据
r
r
r可以得到
f
(
r
c
)
f(r_c)
f(rc?),
m
b
=
f
(
r
c
)
⊕
s
m_b=f(r_c)\oplus s
mb?=f(rc?)⊕s,但这种情况发生的概率
q
(
n
)
/
2
n
q(n)/2^n
q(n)/2n是可忽略的;
当没有相同随机串时,输出是随机串,相当于一次一密,成功概率=1/2;
Pr
?
[
D
F
k
(
?
)
(
1
n
)
=
1
]
=
Pr
?
[
P
r
i
v
K
A
,
Π
c
p
a
(
n
)
=
1
]
=
1
2
+
ε
(
n
)
.
\Pr[D^{F_k(\cdot)}(1^n)=1] = \Pr[\mathsf{PrivK}_{\mathcal{A},\Pi}^{\mathsf{cpa}}(n) = 1] = \frac{1}{2} + \varepsilon(n).
Pr[DFk?(?)(1n)=1]=Pr[PrivKA,Πcpa?(n)=1]=21?+ε(n).
Pr
?
[
D
f
(
?
)
(
1
n
)
=
1
]
=
Pr
?
[
P
r
i
v
K
A
,
Π
~
c
p
a
(
n
)
=
1
]
=
Pr
?
[
B
r
e
a
k
]
≤
1
2
+
q
(
n
)
2
n
.
\Pr[D^{f(\cdot)}(1^n)=1] = \Pr[\mathsf{PrivK}_{\mathcal{A},\tilde{\Pi}}^{\mathsf{cpa}}(n) = 1] = \Pr[\mathsf{Break}] \le \frac{1}{2} + \frac{q(n)}{2^n}.
Pr[Df(?)(1n)=1]=Pr[PrivKA,Π~cpa?(n)=1]=Pr[Break]≤21?+2nq(n)?.
Pr
?
[
D
F
k
(
?
)
(
1
n
)
=
1
]
?
Pr
?
[
D
f
(
?
)
(
1
n
)
=
1
]
≥
ε
(
n
)
?
q
(
n
)
2
n
.
\Pr[D^{F_k(\cdot)}(1^n)=1] - \Pr[D^{f(\cdot)}(1^n)=1] \ge \varepsilon(n) - \frac{q(n)}{2^n}.
Pr[DFk?(?)(1n)=1]?Pr[Df(?)(1n)=1]≥ε(n)?2nq(n)?. 根据伪随机函数定义,
ε
(
n
)
\varepsilon(n)
ε(n) 是可忽略的.
小结:通过规约将
A
\mathcal{A}
A的不可区分实验成功的概率与
D
D
D的区分器实验输出1的概率建立等式;分析输入真随机函数预言机时
D
D
D输出1的概率(即不可区分实验成功概率)是1/2+一个可忽略函数;根据PRF的定义,输入伪随机函数预言机时
D
D
D输出1的概率(1/2+
ε
(
n
)
\varepsilon(n)
ε(n))与输入真随机函数预言机时
D
D
D输出1的概率(1/2)的差异时可忽略的。
CPA安全例题
E
n
c
k
(
m
)
=
P
R
G
(
k
∥
r
)
⊕
m
\mathsf{Enc}_k(m) = PRG(k\|r) \oplus m
Enck?(m)=PRG(k∥r)⊕m,
r
r
r 是新的随机串。这是CPA安全的吗?
从PRF到CPA安全:变长消息
对于任意长度消息
m
=
m
1
,
…
,
m
?
m = m_1, \dots , m_{\ell}
m=m1?,…,m??,
c
:
=
<
r
1
,
F
k
(
r
1
)
⊕
m
1
,
r
2
,
F
k
(
r
2
)
⊕
m
2
,
…
,
r
?
,
F
k
(
r
?
)
⊕
m
?
>
c := \left< r_1, F_k(r_1) \oplus m_1, r_2, F_k(r_2) \oplus m_2, \dots, r_\ell, F_k(r_\ell) \oplus m_\ell\right>
c:=?r1?,Fk?(r1?)⊕m1?,r2?,Fk?(r2?)⊕m2?,…,r??,Fk?(r??)⊕m???
推论:如果
F
F
F是一个 PRF,那么
Π
\Pi
Π 对任意长度消息是 CPA 安全的。
问题:这个方案有什么缺点?
有效性:
∣
c
∣
=
2
∣
m
∣
|c| = 2|m|
∣c∣=2∣m∣. 密文长度是明文长度的二倍,并且需要大量的真随机串。
伪随机排列PRP
伪随机排列(Pseudorandom Permutations)
为了提高对任意长度消息加密的效率,以及更高级的加密基础工具,学习伪随机排列PRP的概念;
双射 Bijection:
F
F
F 是一到一的(一个输入对应一个唯一输出)且满射(覆盖输出集中每个元素);
排列 Permutation: 一个从一个集合到自身的双射函数;
带密钥的排列 Keyed permutation:
?
k
,
F
k
(
?
)
\forall k, F_k(\cdot)
?k,Fk?(?)是排列;类似带密钥的函数;
F
F
F 是一个双射
??
?
??
F
?
1
\iff F^{-1}
?F?1 是一个双射;函数和逆函数都是双射;
定义:一个有效的带密钥的排列
F
F
F 是PRP,如果对于任意PPT的区分器
D
D
D,
∣
Pr
?
[
D
F
k
(
?
)
,
F
k
?
1
(
?
)
(
1
n
)
=
1
]
?
Pr
?
[
D
f
(
?
)
,
f
?
1
(
?
)
(
1
n
)
=
1
]
∣
≤
n
e
g
l
(
n
)
\left|\Pr[D^{F_k(\cdot),F_k^{-1}(\cdot)}(1^n)=1] - \Pr[D^{f(\cdot),f^{-1}(\cdot)}(1^n)=1]\right| \le \mathsf{negl}(n)
?Pr[DFk?(?),Fk?1?(?)(1n)=1]?Pr[Df(?),f?1(?)(1n)=1]?≤negl(n)
问题:一个PRP也是一个PRF吗?
PRP例题
对1比特的PRP、PRF的分析;
交换引理:如果
F
F
F 是一个 PRP 并且
?
i
n
(
n
)
≥
n
\ell_{in} (n) \ge n
?in?(n)≥n,那么
F
F
F 也是一个 PRF。
一个随机排列和一个查表是不可取分的,PRP和随机排列不可取分,因此,PRP和查表是不可取分的。
操作模式概念(Modes of Operation)
操作模式是使用PRP或PRF来加密任意长度消息的方法;
操作模式是从PRP或PRF来构造一个PRG的方法;
将一个消息分成若干等长的块(分组,block),每个块以相似方式处理;
Electronic Code Book (ECB) 模式
在窃听者出现时,是否是不可区分的?
F
F
F 可以是任意PRF吗?
对ECB的攻击
为什么仍然可以识别企鹅?
Cipher Block Chaining (CBC) 模式
I
V
IV
IV初始向量,一个新的随机串;
是CPA的吗?可并行化吗?F可以是任意PRF吗?
Output Feedback (OFB) Mode模式
是CPA安全吗?可并行化吗?F可以是任意PRF吗?
Counter (CTR) Mode模式
c
t
r
ctr
ctr是一个初始向量,并且逐一增加;
是CPA安全吗?可并行化吗?F可以是任意PRF吗?
CTR模式是CPA安全
定理:如果
F
F
F是一个PRF,那么随机CTR模式是CPA安全的。
证明:其安全性与之前基于PRF的CPA安全证明类似,从PRF的伪随机假设规约到CPA安全加密方案。其中,对
c
t
r
ctr
ctr的安全性直觉在于,
c
t
r
ctr
ctr也是在加密前不可预测的,且每个块所用
c
t
r
ctr
ctr都是不同的;
当加密预言机是由真随机查表构成时,敌手多次访问加密预言机得到的
c
t
r
ctr
ctr序列与挑战密文的
c
t
r
ctr
ctr序列之间有重叠的概率
2
q
(
n
)
2
2
n
\frac{2q(n)^2}{2^n}
2n2q(n)2?是可以忽略的;若没有重叠,则相当于一次一密;
规约与之前证明基于PRF的CPA安全加密方案一样,证明过程也类似。
初始向量不应该可预测
如果
I
V
IV
IV是可预测的,那么CBC/OFB/CTR模式不是CPA安全的。
为什么?(作业)
在SSL/TLS 1.0中的漏洞:记录
#
i
\#i
#i的
I
V
IV
IV是上一个记录
#
(
i
?
1
)
\#(i-1)
#(i?1)的密文块。
OpenSSL中API:需要用户输入
I
V
IV
IV,但
I
V
IV
IV应在函数内实现。当
I
V
IV
IV不充分随机时不安全。
非确定性加密
有三种通用的实现CPA安全的非确定性加密方法:
随机化的:
r
r
r随机生成,如构造5;需要更多熵,长密文
有状态的:
r
r
r为计数器,如CTR模式;需要通信双方同步计数器
基于Nonce的:
r
r
r只用一次;需要保证只用一次,长密文
CCA安全加密方案
选择密文攻击 Chosen-Ciphertext Attacks (CCA)
CCA不可区分实验
P
r
i
v
K
A
,
Π
c
c
a
(
n
)
\mathsf{PrivK}^{\mathsf{cca}}_{\mathcal{A},\Pi}(n)
PrivKA,Πcca?(n):
挑战者生成密钥
k
←
G
e
n
(
1
n
)
k \gets \mathsf{Gen}(1^n)
k←Gen(1n);(为了下一步的预言机)
A
\mathcal{A}
A 被给予输入
1
n
1^n
1n 和对加密函数
E
n
c
k
(
?
)
\mathsf{Enc}_k(\cdot)
Enck?(?)和解密函数
D
e
c
k
(
?
)
\mathsf{Dec}_k(\cdot)
Deck?(?)的预言机访问(oracle access)
A
E
n
c
k
(
?
)
\mathcal{A}^{\mathsf{Enc}_k(\cdot)}
AEnck?(?) 和
A
D
e
c
k
(
?
)
\mathcal{A}^{\mathsf{Dec}_k(\cdot)}
ADeck?(?),输出相同长度
m
0
,
m
1
m_0, m_1
m0?,m1? ;
挑战者生成随机比特
b
←
{
0
,
1
}
b \gets \{0,1\}
b←{0,1},将挑战密文
c
←
E
n
c
k
(
m
b
)
c \gets \mathsf{Enc}_k(m_b)
c←Enck?(mb?) 发送给
A
\mathcal{A}
A;
A
\mathcal{A}
A 继续对除了挑战密文
c
c
c之外的预言机的访问,输出
b
′
b'
b′;如果
b
′
=
b
b' = b
b′=b,则
A
\mathcal{A}
A成功
P
r
i
v
K
A
,
Π
c
c
a
=
1
\mathsf{PrivK}^{\mathsf{cca}}_{\mathcal{A},\Pi}=1
PrivKA,Πcca?=1,否则 0。
A
\mathcal{A}
A 获得挑战密文
c
=
<
r
,
F
k
(
r
)
⊕
m
b
>
c = \left<r, F_k(r)\oplus m_{b}\right>
c=?r,Fk?(r)⊕mb??,并且查询与
c
c
c只相差了一个翻转的比特的密文
c
′
c'
c′,那么
m
′
=
c
′
⊕
F
k
(
r
)
m' = c' \oplus F_k(r)
m′=c′⊕Fk?(r) 应该与
m
b
m_{b}
mb? 除了什么之外都相同?(见下方的补充)
问题:上述操作模式也不是CCA安全的(作业)
由此,可以总结出CCA下敌手的常用策略:
修改挑战密文
c
c
c为
c
′
c'
c′,并查询解密预言机得到
m
′
m'
m′
根据关系,由
m
′
m'
m′来猜测被加密明文
m
b
m_b
mb?
补充
在这个情况下,
A
\mathcal{A}
A 获得了挑战密文
c
=
<
r
,
F
k
(
r
)
⊕
m
b
>
c = \left<r, F_k(r)\oplus m_{b}\right>
c=?r,Fk?(r)⊕mb?? 并查询了一个只在一个比特上与
c
c
c 不同的密文
c
′
c'
c′。我们来分析一下
m
′
=
c
′
⊕
F
k
(
r
)
m' = c' \oplus F_k(r)
m′=c′⊕Fk?(r) 与
m
b
m_{b}
mb? 的关系。
首先,我们明确
c
c
c 的构成:
c
c
c 包含两个部分:一个随机数
r
r
r 和使用密钥
k
k
k 的函数
F
k
(
r
)
F_k(r)
Fk?(r) 与明文
m
b
m_{b}
mb? 的异或结果。
因此,
c
=
<
r
,
F
k
(
r
)
⊕
m
b
>
c = \left<r, F_k(r)\oplus m_{b}\right>
c=?r,Fk?(r)⊕mb??。
现在,如果
A
\mathcal{A}
A 查询了一个与
c
c
c 只在一个比特上不同的密文
c
′
c'
c′,那么
c
′
c'
c′ 也可以写成两部分,但其中一部分与
c
c
c 有一个比特的差异。这个差异可以在
r
r
r 部分,也可以在
F
k
(
r
)
⊕
m
b
F_k(r)\oplus m_{b}
Fk?(r)⊕mb? 部分。
当
A
\mathcal{A}
A 计算
m
′
=
c
′
⊕
F
k
(
r
)
m' = c' \oplus F_k(r)
m′=c′⊕Fk?(r) 时,他们实际上是在解开
F
k
(
r
)
⊕
m
b
F_k(r)\oplus m_{b}
Fk?(r)⊕mb? 的异或操作。这是因为异或操作是可逆的,且当两次使用相同的值时会取消彼此的效果(即
A
⊕
B
⊕
B
=
A
A \oplus B \oplus B = A
A⊕B⊕B=A)。
因此,如果
c
′
c'
c′ 的变化发生在
F
k
(
r
)
F_k(r)
Fk?(r) 部分,则
m
′
m'
m′ 将与
m
b
m_{b}
mb? 完全相同,因为
F
k
(
r
)
F_k(r)
Fk?(r) 部分的变化被异或操作取消了。但如果变化发生在
r
r
r 部分,则这个变化不会影响到
F
k
(
r
)
⊕
m
b
F_k(r)\oplus m_{b}
Fk?(r)⊕mb? 部分,因此
m
′
m'
m′ 将与
m
b
m_{b}
mb? 在一个比特上不同。
综上所述,
m
′
m'
m′ 与
m
b
m_{b}
mb? 将在以下方面相同:
如果变化发生在
F
k
(
r
)
F_k(r)
Fk?(r) 部分,那么
m
′
m'
m′ 与
m
b
m_{b}
mb? 完全相同。
如果变化发生在
r
r
r 部分,那么
m
′
m'
m′ 与
m
b
m_{b}
mb? 除了那个翻转的比特之外都相同。
填充预言机Padding-Oracle攻击真实案例
Padding-Oracle(填充预言机)攻击真实案例
CAPTCHA服务商为Web网站提供验证用户是否为人类的服务。为此,一个CAPTCHA服务器与Web服务器间事先共享一个密钥
k
k
k,服务工作原理如下:
当Web服务器验证用户是否为人类时,生成一个消息
w
w
w并以
k
k
k加密,向用户发送一个密文
E
n
c
k
(
w
)
Enc_k(w)
Enck?(w);
用户将密文
E
n
c
k
(
w
)
Enc_k(w)
Enck?(w)转发给CAPTCHA服务器;(可实施填充预言机攻击)
CAPTCHA服务器用密钥
k
k
k将密文解密,根据解密结果返回给用户信息:一个由
w
w
w生成的图像,或者坏填充错误;
在PKCS #5 padding(填充)标准中,为了将一个消息的长度“填充”到块长度的整数倍,在最后一个块中填充
b
b
b个字节的
b
b
b;必要时,添加一个哑块(dummy block,不包含消息的一个填充块)。存在一种攻击手段:当填充错误时,解密服务器返回一个“坏填充错误”,这相当于提供了一个解密预言机,最终可以获得整个明文;
攻击的第一步判断消息是否为空:在单个块的CBC中,通过更改
I
V
IV
IV的首个字节,攻击者能够获知是否
m
m
m是否为空。因为如果
m
m
m是空的话,更改
I
V
IV
IV首个字节将更改解密出的填充内容,解密服务器就会返回坏填充错误(1比特信息),具体分析如下:
如果
m
m
m是空的,那么明文会添加一个哑块
{
b
}
b
\{b\}^b
{b}b;
PRP的输入为
I
V
⊕
{
b
}
b
IV\oplus \{b\}^b
IV⊕{b}b;设
I
V
IV
IV的首个字节为
x
x
x,则PRP的输入为
(
x
⊕
b
)
∥
(
{
?
}
b
?
1
⊕
{
b
}
b
?
1
)
(x \oplus b) \| (\{\cdot\}^{b-1} \oplus \{b\}^{b-1})
(x⊕b)∥({?}b?1⊕{b}b?1);
将
I
V
IV
IV的首个字节从
x
x
x改成
y
y
y变为
y
∥
(
{
?
}
b
?
1
)
y \| (\{\cdot\}^{b-1})
y∥({?}b?1),不改变
c
1
c_1
c1?解密得到的PRP的输入不会变,而解密出的明文会改变为
(
x
⊕
y
⊕
b
)
∥
{
b
}
b
?
1
(x \oplus y \oplus b) \| \{b\}^{b-1}
(x⊕y⊕b)∥{b}b?1;
上述明文首个字节一定不是
b
b
b,这是填充格式错误,会触发服务器返回错误;
如果上面的尝试没有触发错误,那么说明消息非空;下一步,发现消息长度是否为1字节,方法与上一步一样,区别在于只改变
I
V
IV
IV的第2个字节;如此继续,获得消息的长度;(作业)
填充预言机攻击:获得消息内容
一旦获得消息的长度,也就知道了填充的长度
b
b
b,采用下面的方法来获得消息的最后一个字节内容,进而获得整个消息;
更改密文中倒数第二块,来获得消息的最后一个字节
s
s
s;
明文的最后一个块
m
l
a
s
t
=
?
s
∥
{
b
}
b
m_{last} = \cdots s \| \{b\}^{b}
mlast?=?s∥{b}b,密文的倒数第二个块
c
l
a
s
t
?
1
=
?
t
∥
{
?
}
b
c_{last-1} = \cdots t \| \{\cdot \}^{b}
clast?1?=?t∥{?}b;
最后一块的PRP输入为
c
l
a
s
t
?
1
⊕
m
l
a
s
t
=
?
(
s
⊕
t
)
∥
(
{
b
}
b
⊕
{
?
}
b
)
c_{last-1} \oplus m_{last} = \cdots (s \oplus t) \| (\{b\}^b \oplus \{\cdot \}^{b})
clast?1?⊕mlast?=?(s⊕t)∥({b}b⊕{?}b);
敌手更改
c
l
a
s
t
?
1
c_{last-1}
clast?1? 为
c
l
a
s
t
?
1
′
=
?
u
∥
(
{
?
}
b
⊕
{
b
}
b
⊕
{
b
+
1
}
b
)
c_{last-1}' = \cdots u \| (\{\cdot \}^{b} \oplus \{b\}^{b} \oplus \{b+1\}^{b})
clast?1′?=?u∥({?}b⊕{b}b⊕{b+1}b);其中,
u
u
u是敌手猜测的某个字节;
解密获得最后一块明文
m
l
a
s
t
′
=
c
l
a
s
t
?
1
⊕
m
l
a
s
t
⊕
c
l
a
s
t
?
1
′
=
?
(
s
⊕
t
⊕
u
)
∥
{
b
+
1
}
b
m'_{last} = c_{last-1} \oplus m_{last} \oplus c_{last-1}' = \cdots (s \oplus t \oplus u)\| \{ b+1 \}^b
mlast′?=clast?1?⊕mlast?⊕clast?1′?=?(s⊕t⊕u)∥{b+1}b;
如果没有返回坏填充错误,那么意味着填充了
b
+
1
b+1
b+1个字节的
b
+
1
b+1
b+1,所以
s
⊕
t
⊕
u
=
(
b
+
1
)
s \oplus t \oplus u = (b+1)
s⊕t⊕u=(b+1) ,而
s
=
t
⊕
u
⊕
(
b
+
1
)
s = t \oplus u \oplus (b+1)
s=t⊕u⊕(b+1) 。