论文阅读笔记:Improving Attacks on Speck32 / 64 using Deep Learning
本文通过神经网络利用了减少轮数的 Speck 的差分性质。为此,作者对神经网络进行训练,以将给定输入差分的 Speck 输出与随机数据区分开来。为了测试这些机器学习识别器的强度,首先,基于给定输入差引起的完全差分分布,区分出 Speck 的输出与随机数据,并计算使用传统密码分析技术的、减少轮数的 Speck32 / 64 的多重差分识别器的预期效率。这是已知的最强差分攻击形式,并不涉及到密钥的搜索。针对 Speck 的变体,此类差分攻击的效率仍尚未有过研究。通过选择的输入差分,可以实现相当高的检测效率。
本文的神经网络识别器在准确性、灵敏度和特异性方面均优于一些非常强大的研究。作者通过设计加密任务来进一步分析这一点,其中攻击者必须区分 具有完全相同密文差的两个密文对的分布。然而,与差分密码分析中使用的传统识别器相比, 深度残差神经网络【1】的评估开销较大。
注:
【1】深度残差神经网络:假设现在有一个比较浅的网络(Shallow Net)已达到了饱和的准确率,这时在它后面再加上几个恒等映射层(Identity Mapping,也即
y
=
x
y=x
y=x,输出等于输入),这样就增加了网络的深度,并且不会增加误差,即更深的网络不应该带来训练集上误差的上升。而这里使用恒等映射直接将前一层输出传到后面的思想,便是深度残差网络的灵感来源。通过残差网络结构,可以把网络层弄的很深,并且最终的分类效果也非常好。
残差网络借鉴了高速网络(Highway Network)的跨层链接思想,但对其进行了改进(残差项原本是带权值的,但 ResNet 用恒等映射代替之)。假定某段神经网络的输入是
x
x
x,期望输出是
H
(
x
)
H(x)
H(x),即
H
(
x
)
H(x)
H(x) 是期望的复杂潜在映射,如果要学习这样的模型,则训练难度会比较大;如果已经学习到较饱和的准确率或者当发现下层的误差变大时,那么接下来的学习目标就转变为恒等映射的学习,也就是使输入
x
x
x 近似于输出
H
(
x
)
H(x)
H(x),以保持在后面的层次中不会造成精度下降。
在残差网络结构中,通过“Shortcut Connections(捷径连接)”的方式,直接把输入
x
x
x 传到输出作为初始结果,输出结果为
H
(
x
)
=
F
(
x
)
+
x
H(x) = F(x) + x
H(x)=F(x)+x,当
F
(
x
)
=
0
F(x) = 0
F(x)=0 时,那么
H
(
x
)
=
x
H(x) = x
H(x)=x,也就是恒等映射。于是,ResNet 相当于将学习目标改变了,不再是学习一个完整的输出,而是目标值
H
(
X
)
H(X)
H(X) 和
x
x
x 的差值,也就是所谓的残差
F
(
x
)
:
=
H
(
x
)
−
x
F(x) := H(x) - x
F(x):=H(x)−x,因此,后面的训练目标就是要将残差结果逼近于 0,使得随着网络加深,准确率不下降。
这种残差跳跃式的结构,打破了传统的神经网络
n
−
1
n - 1
n−1 层的输出只能给
n
n
n 层作为输入的惯例,使某一层的输出可以直接跨过几层作为后面某一层的输入,其意义在于为叠加多层网络而使得整个学习模型的错误率不降反升的难题提供了新的方向。至此,神经网络的层数可以超越之前的约束,达到几十层、上百层甚至千层,为高级语义特征提取和分类提供了可行性。
虽然其他作者也尝试使用神经网络进行密码分析,但本文是已知的第一个由深度神经网络执行,通过强大、易于理解的传统分析工具比较密码分析的工作。同时,这也是第一篇将神经网络与强大的传统密码分析技术相结合的论文。
本文详细描述了最佳模型的机器学习流程、数据预处理和模型结构。
在该模型中,攻击者必须区分通过加密两个具有来自密文的已知明文差
Δ
\Delta
Δ 的数据块
P
0
{P_0}
P0、
P
1
{P_1}
P1 所获得的实际密文
C
=
C =
C= (
C
0
{C_0}
C0,
C
1
{C_1}
C1),其另外被逐位添加了随机掩蔽值
K
o
u
t
∈
{
0
,
1
}
b
{K_{out}} \in {\left\{ {0,1} \right\}^b}
Kout∈{0,1}b,其中
b
b
b 是原始数据的分组长度。
Speck 自发布以来获得了相当多的分析。Speck 的差分密码分析首先由 Abed、List、Lucks 和 Wenzel 进行了研究。他们为 Speck 系列密码的轮数减少版本构建了有效的差分路径,并展示了如何使用这些路径进行密钥恢复。对于 Speck32 / 64,9 轮路径中的第 3 轮被用于本文的输入差分。
Dinur 通过使用两轮猜测来改进 Abed、List、Lucks 和 Wenzel 的分析,确定加速密钥恢复攻击,并延长了可攻击的轮数。两轮猜测以及攻击的确定阶段将差分作为输入,然后输出两轮后的密码,并返回所有可能的最后一轮子密钥。在第 3 节中,本文使用了他们的两轮攻击构造了一个减少到 5 轮的 Speck 识别器,它完全利用了密文对分布的非均匀性,在这种情况下,已知的只有输入差,而不是密码的输入值。
Biryukov 和 Velichkov 提出了一个框架,用于自动搜索 Speck 的最佳单差分路径(Optimal Single Differential Trails)【1】,并进一步改进 Abed、List、Lucks 和 Wenzel 的差分路径。他们还表明了 Speck 不是 Markov 密码【2】。本文强化了后一个发现,即 Speck 上的神经网络识别器在预测精度方面优于所有的纯差分识别器。
注:
【1】差分路径(Differential Trails):假设有一个这样的函数:
f
(
x
)
=
p
3
(
p
2
(
p
1
(
x
)
)
)
{\rm{f(x) = }}{{\rm{p}}_{\rm{3}}}{\rm{(}}{{\rm{p}}_{\rm{2}}}{\rm{(}}{{\rm{p}}_{\rm{1}}}{\rm{(x)))}}
f(x)=p3(p2(p1(x)))
如果现在能够找到一对
Δ
0
\Delta 0
Δ0,
Δ
1
\Delta 1
Δ1,使得
p
1
(
x
⊕
Δ
0
)
=
p
1
(
x
⊕
Δ
1
)
{{\rm{p}}_{\rm{1}}}{\rm{(x}} \oplus \Delta 0) = {{\rm{p}}_{\rm{1}}}{\rm{(x}} \oplus \Delta 1)
p1(x⊕Δ0)=p1(x⊕Δ1) 的概率为
2
−
n
1
{{\rm{2}}^{ - {n_1}}}
2−n1,
Δ
2
\Delta 2
Δ2 使得
p
2
(
x
⊕
Δ
1
)
=
p
2
(
x
⊕
Δ
2
)
{{\rm{p}}_{\rm{2}}}{\rm{(x}} \oplus \Delta 1) = {{\rm{p}}_{\rm{2}}}{\rm{(x}} \oplus \Delta 2)
p2(x⊕Δ1)=p2(x⊕Δ2) 的概率为
2
−
n
2
{{\rm{2}}^{ - {n_2}}}
2−n2,以及
Δ
3
\Delta 3
Δ3,使得
p
3
(
x
⊕
Δ
2
)
=
p
3
(
x
⊕
Δ
3
)
{{\rm{p}}_{\rm{3}}}{\rm{(x}} \oplus \Delta 2) = {{\rm{p}}_{\rm{3}}}{\rm{(x}} \oplus \Delta 3)
p3(x⊕Δ2)=p3(x⊕Δ3) 的概率为
2
−
n
3
{{\rm{2}}^{ - {n_3}}}
2−n3。那么:
Δ
0
→
f
Δ
3
{\Delta _0}\mathop \to \limits^f {\Delta _3}
Δ0→fΔ3 是
f
f
f 的差分(如果假定独立,则概率至少为
2
−
n
1
n
2
n
3
{{\rm{2}}^{{\rm{ - }}{{\rm{n}}_{\rm{1}}}{{\rm{n}}_{\rm{2}}}{{\rm{n}}_{\rm{3}}}}}
2−n1n2n3);
Δ
0
→
p
1
Δ
1
→
p
2
Δ
2
→
p
3
Δ
3
{\Delta _0}\mathop \to \limits^{{p_1}} {\Delta _1}\mathop \to \limits^{{p_2}} {\Delta _2}\mathop \to \limits^{{p_3}} {\Delta _3}
Δ0→p1Δ1→p2Δ2→p3Δ3 是一个差分路径, 也称为差分特征,对于
f
f
f (如果假定独立,则概率为
2
−
n
1
n
2
n
3
{{\rm{2}}^{{\rm{ - }}{{\rm{n}}_{\rm{1}}}{{\rm{n}}_{\rm{2}}}{{\rm{n}}_{\rm{3}}}}}
2−n1n2n3)。
因此,差分路径不仅包含函数中的输入和输出差,而且还包含所有中间值(以及各自的概率)。也可以说差分是所有路径与相同输入和输出值的组合。
【2】Markov 密码:基于其在差分密码分析中的重要性,“马尔可夫密码”这一概念被引入到迭代密码中。如果一个迭代密码是马尔可夫密码,并且其各轮子密钥是独立的,则其每一轮输出差组成的序列构成了一条马尔可夫链。从 Biham 和 Shamir 的研究结果可以得出,DES 是一种马尔可夫密码。
差分攻击在选择明文攻击中最为有效,因为攻击者需要在特定的选择差分明文输入下查看密文的输出。在已知明文攻击中,针对轮数减少的 Speck 的最强大攻击来自于线性密码分析。
作为截断差分密码分析【1】的扩展,多重差分密码分析【2】首先由 Blondeau 和 Gerard 进行了研究。在假设可以正确计算相关差分转移概率的前提下,具有较小分组长度的多重差分框架利用了错误密钥和正确密钥的差分分布,由 Albrecht 和 Leander 开发,并在 KATAN32【3】分组密码上提供了新的密码分析结果,显著扩展了可证明的攻击轮数。
注:
【1】截断差分分析:截断差分分析是一个变形的差分密码分析方法。与经典差分密码分析方法考虑具体的差分分布不同,截断差分分析考虑的是差分在某个集合中取值时的差分分布情况,截断差分分析可以看作是利用多条差分传递链对密码算法进行攻击。这种分析方法对基于字节设计的分组密码比较有效。
【2】多重差分密码分析:与多重线性密码分析类似,多重差分密码分析是一种一般情况,即所考虑的差分集没有特殊的结构,即同时考虑几个不同的输入,并且相应的输出差可以因输入差而不同。
参考文献:C´eline Blondeau and Benoˆıt G´erard. Multiple Differential Cryptanalysis: Theory and Practice. In Fast Software Encryption, pages 35–54. Springer, 2011.
【3】KATAN32:KATAN 密码算法是以非线性反馈移位寄存器为基础的分组密码算法,最初发表在 CHES 2009 上。KATAN 系列分组密码算法分为三类:KATAN32,KATAN48 和 KATAN64。这三个算法使用相同的密钥生成算法,密钥长度均为 80 比特,加密轮数都是 254 轮,并且使用相同的非线性函数。在 KATAN 系列算法中,除了算法主体使用非线性反馈移位寄存器外,254 轮的轮计数器使用的是8级的线性反馈移位寄存器,而密钥生成算法是采用 80 级的线性反馈移位寄存器,将 80 比特密钥置入移存器,反馈多项式为 80 级的本原多项式,每轮 80 级移位寄存器移动 2 次,来获得每轮对应的两比特子密钥。
预计算攻击【1】通常不被视为是机器学习。Laskali,Meletious 和 Vrahatis 在经典差分攻击之后的四轮和六轮 DES 的子密钥恢复中,运用了进化计算方法,与未经优化的暴力搜索相比,取得了一些成功(在搜索树大小方面,而不一定就执行时间而言)。他们还探索了一些成功的机器学习案例(但与传统技术相比,没有任何优势),这些训练好的神经网络可以用于解决参数极少的传统公钥密码学问题。
注:
【1】预计算攻击(Precomputed Attacks):攻击者先构建字典,然后用选择性明文攻击的办法来获得相应的密文,检索字典找到匹配的密文,则攻击成功。
一些作者研究了直接使用机器学习来区分或以其它方式攻击未减少轮数的现代密码。从加密的角度来看,这显然是不可能的,除非操作模式或其它实现方法使其可行。这也是 Chou,Lin 和 Chen 得出的结论,他们按照这些方式进行了一些实验,并对文献进行了回顾。
Rivest 回顾了机器学习与密码学之间的各种联系,并提出了机器学习在密码分析应用中的一些可能的研究方向。
Greydanus 的研究表明,循环神经网络【1】可以通过黑箱学习【2】模拟受限版本的 Enigma。
注:
【1】循环神经网络:RNN是一种特殊的神经网络结构,它是根据“人的认知是基于过往的经验和记忆”这一观点提出的。它与 DNN,CNN 不同的是:它不仅考虑前一时刻的输入,而且赋予了网络对前面的内容的一种“记忆”功能。它之所以称为循环神经网络,即一个序列当前的输出与前面的输出也有关。具体的表现形式为网络会对前面的信息进行记忆,并应用于当前输出的计算中,即隐藏层之间的节点不再是无连接的,而是有连接的;并且隐藏层的输入不仅包括输入层的输出,还包括上一时刻隐藏层的输出。
【2】黑箱学习:黑箱算法并不需要解释能力,它力图发现输入输出的相关关系,其主要功用是预测,最终目的是验证,即一旦做出判断,就可以根据外界反应判断预测是否准确,但是出现错误之后,并不要求根据输入来追踪错误发生的原因。
纯数据驱动攻击【1】在 Paterson,Poettering 和 Schuldt 对于 RC4 的研究中取得了巨大的成功。他们从大量的 RC4 密钥流中学习了单字节和双字节偏差的贝叶斯模型,该模型可导出以相同明文进行数百万次顺序加密得出的数据。
注:
【1】数据驱动攻击:就是数据的改变从而驱动攻击的执行,最终引起结果的改变。说得直白些,就是数据参数化的应用。
对于重复迭代的简单分组构造(例如轮函数),差分路径是由差序列
Δ
0
,
Δ
1
,
…
…
,
Δ
n
Δ0,Δ1,……,Δn
Δ0,Δ1,……,Δn 所给出的一系列差分转移。当相同的概念应用于依赖密钥的函数族(例如分组密码)时,差分概率的密钥依赖性通常会被抑制,尽管这种依赖性可能会对安全评估产生影响(它们已存在于
A
R
X
ARX
ARX 明文中)。
Markov 密码是一种迭代的分组密码,其中如果毎一轮子密钥以均匀随机的方式选择,则差分转移概率独立于具体的明文值。通常会忽略初始或最终的无密钥置换对 Markov 属性评估的影响,因为修改这些初始或最终置换数据的细节超出了差分密码分析的范围。
差分密码分析是在给定具有已知差分分布的输入数据时,利用输出密文的非随机属性的密码攻击。在文献中正式讨论的最普遍的差分攻击形式是多重差分密码分析,它利用任意一组的差分转移信息,以最大化攻击的增益。
在本文中使用了两种攻击形式:仅使用观察到的密文所包含的差分信息以及使用输出密文对中包含的完整信息。在区分二者时,将它们分别称为纯差分攻击和一般差分攻击。
区分器是根据
n
n
n 个概率分布
D
i
{D_i}
Di,
i
=
1
,
.
.
.
.
,
n
i = 1,....,n
i=1,....,n 中的一个,以独立于有限事件空间 Ω 的采样数据作为输入,并为输入
d
d
d 输出一个猜测
i
i
i 的分类器。在每次实验中,从集合
{
1
,
2
,
.
.
.
,
n
}
\{1,2,...,n\}
{1,2,...,n} 中选择
i
i
i 的概率为
p
i
{p_i}
pi。
i
i
i 的选择方式与
D
i
{D_i}
Di 的分布均是已知的。
Speck 的简短描述:
Speck 是由 Beaulieu,Treatman-Clark,Shors,Weeks,Smith 和 Wingers 为 NSA 设计的迭代分组密码,旨在为物联网设备的软件建立高效的密码。Speck 具有 ARX 结构【1】,意味着它是作用于
k
k
k 位字的模加运算(
m
o
d
mod
mod
2
k
{2^k}
2k)、比特移位和按位相加的基本功能组合。在各种版本的 Speck 中,移位的常数值、加密轮数以及使用的分组和密钥长度各不相同。通常,Speck
n
/
m
n/m
n/m 表示
n
n
n 位分组长度和
m
m
m 位密钥长度的 Speck。
注:
【1】ARX结构:ARX结构是指由模加(Modular Addition)、循环移位(Rotation)、逐位异或(Bitwise Xor)三种运算构成的一种结构,因结构简单易于实现而受到关注。
Speck 的轮函数
F
F
F 由
k
k
k 比特子密钥
K
K
K 以及两个
k
k
k 比特字(
L
i
{L_i}
Li,
R
i
{R_i}
Ri)的密码状态组成,并产生下一轮状态(
L
i
+
1
{L_{i+1}}
Li+1,
R
i
+
1
{R_{i+1}}
Ri+1)如下:
其中
α
,
β
α,β
α,β 是不同 Speck 密码族成员的特有常数(对于 Speck32 / 64,
α
=
7
,
β
=
2
α = 7,β = 2
α=7,β=2;对于其它变体,
α
=
8
,
β
=
3
α = 8,β = 3
α=8,β=3)。
Speck 使用固定轮数,由明文输入产生密文输出(对于 Speck32 / 64 为 22 轮),每轮的子密钥由非线性派生函数通过主密钥生成,密钥派生也使用相同的轮函数作为分组的构建方法。轮函数的具体细节在主密钥的字数以及不同版本之间有一定的差异。
基本加密属性:
在 Speck 的轮函数中,唯一的非线性操作是计算
L
i
+
1
{L_{i+1}}
Li+1 时使用的模加运算,且唯一依赖于密钥的操作是子密钥加。子密钥加在模加之后进行,即密码操作在第一个子密钥加以前是完全可预测的。由此可推断出以下结论:
单轮 Speck 的差分和线性转移不依赖于密钥,而只依赖于作为输入的明文值。在选择明文攻击中,对手可以自由选择第一轮的输出差。在已知明文攻击中,可以由明文计算出第 1 轮输出的中间密文差。因此,实现第 1 轮密文差分的预测,概念上最简单的方法就是由两个明文
P
0
{P_0}
P0,
P
1
{P_1}
P1,计算出
F
(
0
,
P
0
)
⊕
F
(
0
,
P
1
)
F(0,{P_0}) \oplus F(0,{P_1})
F(0,P0)⊕F(0,P1)。
当给定输入和输出差时,完成两轮 Speck 差分路径的方法如下:
设
Δ
i
n
,
Δ
o
u
t
∈
F
2
n
{\Delta _{in}},{\Delta _{out}} \in F_2^n
Δin,Δout∈F2n ,其中
Δ
i
n
=
(
L
i
n
,
R
i
n
)
{\Delta _{in}} = ({L_{in}},{R_{in}})
Δin=(Lin,Rin),
Δ
o
u
t
=
(
L
o
u
t
,
R
o
u
t
)
{\Delta _{out}} = ({L_{out}},{R_{out}})
Δout=(Lout,Rout)。如果两轮 Speck 的差分转移
Δ
i
n
→
Δ
o
u
t
{\Delta _{in}} \to {\Delta _{out}}
Δin→Δout 是可能的,则相应的差分路径的第一轮必然是
(
X
⊕
(
R
i
n
<
<
β
)
,
X
)
(X \oplus ({R_{in}} < < \beta ),X)
(X⊕(Rin<<β),X),其中
X
:
=
(
R
o
u
t
,
L
o
u
t
)
>
>
β
X: = ({R_{out}},{L_{out}}) > > \beta
X:=(Rout,Lout)>>β。
与上述结论相结合,如果给出完整的明文对和密文差,即使对于三轮的 Speck 也可以直接得出所有的中间差。
Speck32 / 64 的多重差分攻击:
纯差分识别器:
多重差分攻击通过一个差分转移集合
S
S
S 来构建密码识别器,以用于表征其行为的加密函数
F
F
F。其基本思想是对于
S
S
S 中的每一个转移
Δ
i
→
δ
j
{\Delta _i} \to {\delta _j}
Δi→δj,关联一个概率
p
i
j
p_{ij}
pij 以及作为区分的另一个概率
p
~
i
j
{{\rm{\tilde p}}_{{\rm{ij}}}}
p~ij。给定实验观察数据
O
O
O,可以使用贝叶斯方法来确定该数据究竟是真实的还是来自于随机实验。
差分转移概率的计算:
所有的识别器都从差分路径的第 3 轮开始,即
Δ
{\Delta}
Δ
=
0
x
0040
/
0000
= 0x0040 / 0000
=0x0040/0000,并使用模
2
16
2^{16}
216 加来计算 Speck32 / 64 非线性分量的差分。中间相遇攻击【1】能够计算出五轮和六轮 Speck 差分分布表的任意条目。通过短搜索树【2】,可以获得所有可能的状态差分表
T
T
T 以及与三轮输入差相关的转移概率。给定要识别的密文对,枚举所有差分路径,产生中间状态并存储在
T
T
T 中。在计算转移图中各个路径的概率时,假设每一轮均从具有差值
δ
{\delta}
δ 的所有密文对中抽取出待进一步处理的中间密文对,其服从均匀分布且独立于先前的每一轮状态转移。这意味着在计算差分路径概率时,后续轮次的转移概率可以相乘。
注:
【1】中间相遇攻击:假设
E
N
C
ENC
ENC 是加密函数,
D
E
C
DEC
DEC 是解密函数,也就是
E
N
C
−
1
{ENC}^{-1}
ENC−1,而
k
1
k_1
k1,
k
2
k_2
k2 为两次加密用的密钥,则可以推导出:
当攻击者已知明文
P
P
P 与密文
C
C
C 时,攻击者可以穷举所有
k
1
k_1
k1 的组合,将产生出来的第一层密文
E
N
C
k
1
(
P
)
EN{C_{{k_1}}}(P)
ENCk1(P),用大量空间储存下来。再穷举所有
k
2
k_2
k2 的组合,将
E
N
C
k
2
(
C
)
EN{C_{{k_2}}}(C)
ENCk2(C) 的值与前面储存下来的结果比对,进而得出正确的
k
1
k_1
k1,
k
2
k_2
k2。这使得攻击者的计算量从
k
1
k_1
k1,
k
2
k_2
k2 各自的可能组合数相乘变成相加。这也是为什么 3DES 使用 3 个 56 bits 的密钥(168 bits),却只有 2 个密钥的强度(112 bits)。
【2】搜索树:搜索树支持许多动态集合操作,包括SEARCH(查找指定结点)、MINIMUM(最小关键字结点)、MAXMUM(最大关键字结点)、PREDECESSOR(结点的先驱)、SUCCESSOR(结点的后继)、INSERT(结点的插入)和DELETE(结点的删除)等。因此,使用一棵搜索树既可以作为一个字典又可以作为一个优先队列。
二叉搜索树上的基本操作所花费的时间与树的高度成正比。对于有
n
n
n 个结点的一棵完全二叉树来说,这些操作的最坏运行时间为
Θ
(
l
g
n
)
Θ(lgn)
Θ(lgn)。然而,如果这棵树是一条
n
n
n 个结点组成的线性链,那么同样的操作就要花费
Θ
(
n
)
Θ(n)
Θ(n) 的最坏运行时间。也可以通过随机构造一棵期望高度为
Θ
(
n
l
g
n
)
Θ(nlgn)
Θ(nlgn) 的二叉搜索树,这样一个动态集合的基本操作的平均运行时间是
Θ
(
l
g
n
)
Θ(lgn)
Θ(lgn)。
只有当研究的密码与 Markov 属性没有太大偏差时,此计算才是有效的。因此,本文通过观察
1
0
11
10^{11}
1011 个差分状态转移样本,根据经验估计差分分布表,并测试了五轮和六轮 Speck 的性能,从而验证了该模型的有效性。由此获得的识别器具有比 Markov 模型更低的精度,这表明模型误差是相对良性的。
本研究中使用的机器对于 7 轮的 Speck,使用完整 Markov 模型来精确计算差分概率是不现实的。因此,文章根据经验估计了 7 轮 Speck 的转移概率。作者首先对 200000 个真实密文对以及随机生成的密文对进行了区分,然后将初始化为零的计数器与样本的所有密文差相加,生成了 1000 亿个密文对样本,每当这个更大的样本中出现了对应的差值,就递增每个计数器。
分类:为了区分真实密文对及随机生成的样本,假设随机密文对差值服从非零密文块上的均匀分布。由于对实际分布中观察到的密文差分概率有很好的近似,因此可以使用标准贝叶斯方法,利用差分的非均匀性进行分类,完美地构造模型和双精度的算术误差。
结果:通过对随机生成的测试数据集的经验测试来测量区分器的性能。测试数据集由相同数量的随机和实际样本组成。在样本的生成中,使用新随机生成的密钥和明文对来计算每个样本。
差分识别器使用密文对的完整分布:
设置和动机:到目前为止,本文考虑的识别器均利用的是已知输入差(但未知输入明文对)生成的密文对,并根据密文差猜测观察对究竟是由减少轮数的 Speck 加密生成的还是随机选择的。显然,如果不仅考虑观察的密文差,还考虑到整体的观察数据可以改进这一点。然而,这是十分困难的,因为对于实际分布来说,计算完整的密文对分布是不可行的。因此,需要确定五轮 Speck 的差分识别器与先前区分器的输入差,并确定敌手在利用这些附加信息时,可能会获得多大的优势。
案例研究:选择密文攻击的识别器。在选择密文攻击的情况下,可以在输出的前一轮获取 Speck 的差分分布。作为第一个测试,本文进行了 5 轮 Speck 解密的简单实验。作者评估了 Speck32 / 64 的两个差分识别器的效率。他们测试了差分为
0
x
8000
/
8000
0x8000 / 8000
0x8000/8000 的 5 轮随机密文对。第一个(
C
C
1
CC1
CC1)仅通过与前面 5 轮 Speck 相同的方法计算差分分布,另一个(
C
C
2
CC2
CC2)首先重新加密在全零子密钥下第一轮接收的明文对,然后将得到的差值与恒定输入差值后四轮的差分分布进行比较。
五轮 Speck32 / 64 的差分识别器:本文还为
D
5
D5
D5 开发了一个完全的识别器。对于观察的密文对
C
:
=
C: =
C:=(
C
0
C_0
C0,
C
1
C_1
C1)和输入差
Δ
\Delta
Δ,在均匀随机选择输入明文和密钥、密码
E
E
E 的分组长度为
b
b
b、密钥长度为
k
k
k 的条件下,观察到(
C
0
C_0
C0,
C
1
C_1
C1)的概率
P
(
C
∣
r
e
a
l
)
P (C | real)
P(C∣real) 由下式给出:
其中,分子是将
C
C
C 解密为具有差
Δ
\Delta
Δ 的明文对的密钥数目
N
k
e
y
s
(
C
)
{N_{keys}}(C)
Nkeys(C)。另一方面,
P
(
C
∣
r
e
a
l
)
=
P (C | real) =
P(C∣real)=
1
/
(
2
2
b
−
2
b
)
1/({2^{2b}} - {2^b})
1/(22b−2b),因此再次使用贝叶斯定理,为了达到完全区分,需要确保
N
k
e
y
s
(
C
)
{N_{keys}}(C)
Nkeys(C)
>
>
>
2
b
+
k
/
(
2
2
b
−
2
b
)
≈
2
b
+
k
−
2
b
{2^{b + k}}/({2^{2b}} - {2^b}) \approx {2^{b + k - 2b}}
2b+k/(22b−2b)≈2b+k−2b。而对于 Speck32 / 64,需要检查
N
k
e
y
s
>
2
32
N_{keys} > 2^{32}
Nkeys>232。对于
D
5
D5
D5,可以枚举所有可能的第 3 轮差分状态,然后针对这些中间差值的每个两轮攻击,枚举在第 4 轮和第 5 轮中使用的子密钥
s
k
5
sk_5
sk5 和
s
k
4
sk_4
sk4。在获得候选轮次 3 的输出之后,由于第 1 轮的输出差是已知的(因为差分路径的第一个差分转移是确定的),再次使用两轮攻击恢复前两个子密钥。在找到解决方案或密钥空间已搜索完后停止,以先到者为准。虽然它的实现相当缓慢,但在 320 个小样本的测试中达到了约 95% 的准确度。作者还尝试了该识别器的简化版本,它仅在最后两轮进行密钥搜索,并使用差分表估计剩余两个子密钥的解决方案数,即使用近似值
N
k
e
y
s
≈
p
t
r
a
n
s
i
t
i
o
n
⋅
C
a
r
d
(
K
)
{{\rm{N}}_{{\rm{keys}}}} \approx {{\rm{p}}_{{\rm{transition}}}} \cdot {\rm{Card (K)}}
Nkeys≈ptransition⋅Card(K),其中
K
K
K 表示所讨论轮次的子密钥集,
p
t
r
a
n
s
i
t
i
o
n
p_{transition}
ptransition 是子路径的差分转移概率;对于数量为 10000 的样本,它实现了 91.3% 的准确度。
Speck32 / 64的神经网络识别器:
网络结构:
输入表示:一对 Speck32 / 64 的密文(
C
0
C_0
C0,
C
1
C_1
C1)可以写成四个 16 位字的序列(
w
0
w_0
w0,
w
1
w_1
w1,
w
2
w_2
w2,
w
3
w_3
w3),它反映了密码的面向字的结构。在该网络中,
w
i
w_i
wi 直接解释为
4
×
16
4 × 16
4×16 矩阵的行向量,输入层由 64 个单元组成,同样以
4
×
16
4 × 16
4×16 的阵列排列。
整体网络结构:最好的网络是两层卷积神经网络的残差塔(Residual Tower)【1】,前面是一个比特的分片卷积,后面跟着一个密集连接的预测头。深度残差网络首先被用于图像识别,并在许多应用中也取得了成功。本文使用了深度为 10 的残差塔与密集连接的预测头,其中有两个隐藏层和一个输出单元。
注:
【1】残差塔(Residual Tower):在神经网络中,可以通过叠加多个 “Tower” 的功能来近似函数。该过程将形成与给定函数等效的形状,其中有一些小的误差是近似的。因此,用于拟合的更多塔数是一种近似行为。因此,调整激活函数参数的目的就是创建这样的近似塔。
显然,塔的数量越多,近似效果越好,近似误差越小。所有这些 “Tower” 的功能都是相似的,只是它们在
x
x
x 轴上的高度和位置不同。
初始卷积:输入层以通道优先模式(Channels-First Mode)【1】连接到一个比特的分片,例如宽度为 1,具有 32 个输出通道的卷积。批量标准化(Batch Normalization)【2】应用于这些卷积的输出。最后,将非线性整流函数用于批量归一化输出,并将得到的
32
×
16
32 × 16
32×16 矩阵传递到主残差塔。
注:
【1】通道优先模式(Channels-First Mode):在深度学习中,不同的框架可能对应不同的影像表达,在数据处理时应做相应的转换。在表示一组彩色图片的问题上,Theano 和 Caffe 使用(样本数,通道数,行或称为高,列或称为宽)通道在前的方式,称为 channels_first;而 TensorFlow 使用(样本数,行或称为高,列或称为宽,通道数)通道在后的方式,称为 channels_last。
【2】批量标准化(Batch Normalization):因为深层神经网络在做非线性变换前的激活输入值(即
x
=
W
U
+
B
x = WU + B
x=WU+B,
U
U
U 是输入)随着网络深度加深或者在训练过程中,其分布逐渐发生偏移或者变动。之所以训练收敛慢,一般是整体分布逐渐往非线性函数的取值区间的上下限两端靠近(对于 Sigmoid 函数来说,这意味着输入值
W
U
+
B
WU + B
WU+B 是大的负值或正值),所以这导致反向传播时低层神经网络的梯度消失,这是训练深层神经网络收敛越来越慢的本质原因。而批量标准化就是通过一定的规范化手段,把每层神经网络任意神经元的输入分布强行拉回到均值为 0,方差为 1 的标准正态分布,就是把越来越偏的分布强制拉回到标准分布,使得激活输入值落在非线性函数对输入比较敏感的区域,输入的小变化就会导致损失函数较大的变化,也就是让梯度变大,避免梯度消失。而且梯度变大意味着学习的收敛速度快,也能大大加快训练速度。
卷积块:每个卷积块由两层 32 个滤波器组成。每层首先使用卷积,然后是批量归一化,最后是整流。在卷积块的末尾有一个残差连接(skip connection)【1】,然后将最终整流层的输出添加到卷积块的输入,并将结果传递给下一个块。
注:
【1】残差连接(Skip Connection):
上图是 Skip Block 的示意图。可以使用一个非线性变换函数来描述一个网络的输入输出,即输入为
x
x
x,输出为
F
(
x
)
F(x)
F(x),
F
F
F 通常包括了卷积、激活等操作。当强行将一个输入添加到函数的输出时,虽然仍然可以用
G
(
x
)
G(x)
G(x) 来描述输入输出的关系,但是这个
G
(
x
)
G(x)
G(x) 却可以明确地拆分为
F
(
x
)
F(x)
F(x) 和
x
x
x 的线性叠加。Skip Connection 的思想就是将输出表述为输入与输入的一个非线性变换的线性叠加。
由于深度学习依靠误差的链式反向传播来进行参数更新,假如有这样一个函数:
而
c
o
s
t
cost
cost 对
f
f
f 的导数为:
这是有隐患的,一旦其中某一个导数很小,多次连乘后梯度可能越来越小,也就是常说的梯度消散;对于深层网络,传到浅层几乎就没了。而使用了残差之后,就相当于给每一个导数加上了一个恒等项 1,此时就算原来的导数很小,误差仍然能够有效地反向传播,因此它可以改善梯度消散问题,使得深层网络的训练变得容易。
预测头:预测头由两个隐藏层和一个输出单元组成。第一层和第二层是具有 64 个单元的密集连接层。第一层之后是批量归一化层和整流层;第二个隐藏层不使用批量标准化,而只有 64 个 ReLU【1】单元的密集连接层。最后一层由使用 Sigmoid【2】 激活的单个输出单元组成。
注:
【1】ReLU:线性整流函数(Rectified Linear Unit,ReLU),又称修正线性单元, 是一种人工神经网络中常用的激活函数(Activation Function),通常指代以斜坡函数及其变种为代表的函数。比较常用的整流函数有斜坡函数
f
(
x
)
=
m
a
x
(
0
,
x
)
f(x) = max(0, x)
f(x)=max(0,x),以及带泄露整流函数(Leaky ReLU),其中为
x
x
x 为神经元(Neuron)的输入。线性整流被认为有一定的生物学原理,并且在实践中有着比其他常用激活函数(譬如逻辑函数)更好的效果。
【2】Sigmoid:Sigmoid 函数也叫 Logistic 函数,用于隐层神经元输出,取值范围为
(
0
,
1
)
(0,1)
(0,1)。它可以将一个实数映射到
(
0
,
1
)
(0,1)
(0,1)的区间,可以用来做二分类。在特征相差比较复杂或是相差不是特别大时效果较好。Sigmoid 的优点是平滑、易于求导;而缺点是计算量大,反向传播求误差梯度时,求导涉及除法;并且很容易就会出现梯度消失的情况,从而无法完成深层网络的训练。
Sigmoid 函数由下列公式定义:
其对
x
x
x 的导数可以用自身表示:
Sigmoid 函数的图形如
S
S
S 曲线:
基本原理:使用初始宽度为 1 的卷积层,可以简化按位加等简单比特切片函数的学习。初始卷积中的过滤器将数据扩展为残差塔所需的格式。输入信道的选择是由密码的面向字的结构所决定的。使用密集连接的预测头反映了这样一个事实:对于非常重要的轮数,输入数据不应该显示出强烈的空间对称性,因此,使用某些空间对称的池化层从数据中提取局部特征可能是徒劳的。虽然只尝试了几个设置,但是通过实验可以确定层的数量。同时,需要设置残差塔的深度,以便在卷积层的输入串上整合数据。然而,即使只有一个残差块也可以获得相当好的结果(明显优于纯差分识别器)。
实际
V
S
.
VS.
VS. 随机分类器的训练:
数据生成:使用
/
d
e
v
/
u
r
a
n
d
o
m
/ dev / urandom
/dev/urandom 生成训练和测试数据,以获得均匀分布且具有输入差
Δ
Δ
Δ
=
0
x
0040
/
0000
= 0x0040 / 0000
=0x0040/0000 以及二进制的实际 / 随机标记矢量
Y
i
Y_i
Yi 的密钥
K
i
K_i
Ki 和明文对
P
i
P_i
Pi。为了产生
k
k
k 轮的 Speck 训练或验证数据,如果设罝
Y
i
Y_i
Yi,则将明文对
P
i
P_i
Pi 加密
k
k
k 轮,否则用新生成的随机明文替换该对的第 2 个明文。
通过这种方式,能够生成由
1
0
7
10^7
107 个样本组成的数据集。预处理可以将获得的数据转换成网络所需的格式。数据的生成非常容易,在本文的实现中,生成大小为
1
0
7
10^7
107 的数据集只需要几秒钟。
训练:在大小为
1
0
7
10^7
107 的数据集上运行 200 个 epoch。除了使用 batch 大小为 5000 的
N
C
C
NCC
NCC 区分器,数据集均以 2048 的大小分批处理。最后的
1
0
6
10^6
106 个样本被保留,以用于验证。通过默认参数的 Adam 算法【1】,基于 L2 正则化【2】(使用正则化参数
c
=
1
0
−
5
c = 10^{-5}
c=10−5)对均方误差损失加上惩罚函数进行优化。利用循环学习率(Cyclic Learnrate)【3】,将第
i
i
i 个 epoch 的学习率
l
i
l_i
li 设置为
l
i
:
=
α
+
(
n
−
i
)
m
o
d
(
n
+
1
)
n
⋅
(
β
−
α
)
{l_i}: = \alpha + \frac{{(n - i)\bmod (n + 1)}}{n} \cdot (\beta - \alpha )
li:=α+n(n−i)mod(n+1)⋅(β−α),其中
α
=
1
0
−
4
,
β
=
2
⋅
1
0
−
3
,
n
=
9
α = 10^{-4},β = 2 \cdot 10^{-3},n = 9
α=10−4,β=2⋅10−3,n=9。将每个周期结束时获得的网络进行存储,并利用未在训练验证中使用的大小为
1
0
6
10^6
106 的测试集,评估验证损失的最佳网络。
注:
【1】Adam 算法:Adam 是一种可以替代传统随机梯度下降(SGD)过程的一阶优化算法,它能基于训练数据迭代地更新神经网络权重。
Adam 算法和传统的随机梯度下降不同。随机梯度下降保持单一的学习率(即
α
α
α)更新所有的权重,学习率在训练过程中并不会改变。而 Adam 通过计算梯度的一阶矩估计和二阶矩估计而为不同的参数设计独立的自适应性学习率。Adam 算法为两种随机梯度下降扩展算法的优点集合,即:
①适应性梯度算法(AdaGrad):为每一个参数保留一个学习率,以提升在稀疏梯度(即自然语言和计算机视觉问题)上的性能。
②均方根传播(RMSProp):基于权重梯度最近量级的均值,为每一个参数适应性地保留学习率。这意味着算法在非稳态和在线问题上有很有优秀的性能。
Adam 算法同时具有 AdaGrad 和 RMSProp 算法的优点。Adam 不仅如 RMSProp 那样,能够基于一阶矩均值计算适应性参数学习率,还充分利用了梯度的二阶矩均值(即有偏方差 / Uncentered Variance)。具体来说,算法计算了梯度的指数移动均值(Exponential Moving Average),超参数
β
1
{\beta _1}
β1 和
β
2
{\beta _2}
β2 控制了这些移动均值的衰减率。移动均值的初始值和
β
1
{\beta _1}
β1、
β
2
{\beta _2}
β2 值接近于 1(推荐值),因此矩估计的偏差接近于 0,该偏差通过先计算带偏差的估计而后计算偏差修正后的估计而得到提升。
【2】L2 正则化:机器学习中几乎都可以看到损失函数后面会添加一个额外项,常用的额外项一般有两种,称作 L1 正则化和 L2 正则化,或者 L1 范数和 L2 范数。
L1 正则化和 L2 正则化可以看做是损失函数的惩罚项。所谓“惩罚”是指对损失函数中的某些参数做一些限制。对于线性回归模型,使用 L1 正则化的模型建叫做 Lasso 回归,使用 L2 正则化的模型叫做 Ridge 回归(岭回归)。
L2 正则化是指权值向量中各个元素的平方和然后再求平方根,它可以防止模型过拟合(Overfitting)。
在二维平面下,L2 正则化的函数图形是个圆,与方形相比,它被磨去了棱角。因此相交等于零的机率小了许多,这就是 L2 正则化不具有稀疏性的原因。
【3】循环学习率(Cyclic Learnrate):是一种调节学习率的方法,在该方法中,设定一个学习率的上限和下限,学习率的值在上限和下限的区间里周期性地变化。而在计算上,循环学习率比改进的优化器更容易实现。
直观上看,随着训练次数的增加,应该保持学习率一直减小以便在某一时刻达到收敛。然而,事实恰与直觉相反,使用一个在给定区间里周期性变化的学习率可能更有用处。原因是周期性高的学习率能够使模型跳出在训练过程中遇到的局部最低点和鞍点。事实上,相比于局部最低点,鞍点更加阻碍收敛。如果鞍点正好发生在一个巧妙的平衡点,小的学习率通常不能产生足够大的梯度变化使其跳过该点(即使跳过,也需要花费很长时间)。这正是周期性高学习率的作用所在,它能够更快地跳过鞍点。
一个 cycle 定义为学习率从低到高,再从高到低走一轮所需的 iteration 数。而 stepsize 指的是 cycle 迭代步数的一半。cycle 不一定必须和 epoch 相同,但实践上通常将 cycle 和 epoch 对应于相同的 iteration。
在上图中,两条红线分别表示学习率的最小值(base_lr)和最大值(max_lr)。蓝色的线是学习率随着 iteration 改变的方式。蓝线上下一次表示一个 cycle,而 stepsize 则是其一半。
训练开销:单个 epoch 在 GTX 1080 Ti 显卡上训练 5000 条数据大约需要 150 秒。因此,完整的训练周期可以在不到一天的时间内完成。所有样本中,在开始训练的 15 分钟内就可以获得优于差分分布表的结果。
结果:
测试集的准确性:神经网络识别器与前一节的纯差分相比具有更高的精度。正如预期的那样,
C
C
2
CC2
CC2 和基于密钥搜索识别器的准确性是不匹配的。验证损失仅略低于训练结束时的训练损失,这表明只产生了轻度过拟合。
推理速度:由深度残差架构产生的网络仍然可以进行合理有效的评估。在使用 GTX 1080 Ti 显卡的单台机器上,每秒能够处理大约 200000 个密文对。通过简化的知识蒸馏(Knowledge Distillation)【1】,推理速度可以在损失很少精度的情况下,增加到大约每秒一百万个密文对。首先生成大小为 900 万的训练数据集,然后使用预训练的10块网络预测每个样本,并将结果用作单块学生网络(Student Network)【2】的训练目标。训练进行了 30 个 epoch,学习率在 20 代后由 0.001 降至 0. 0001。在 7 轮的情况下,识别器在质量上与原始的 10 块识别器相当;对于 6 轮的情况,在 100 万的测试集具有很小的精度损失;对于 5 轮的情况,在测试集上发现了更大幅但依旧微小的预测损失。
注:
【1】知识蒸馏(Knowledge Distillation):核心思想是通过迁移知识,从而通过训练好的大模型得到更加适合推理的小模型。它是迁移学习的一种,目的是将庞大网络学到的知识转移到小的网络模型上,即不改变网络复杂度的情况下,通过增加监督信息的丰富程度来提升性能。它的关键点一个是知识获取,另一个是知识转移。
常见思想:
①Softmax 层的输入比类别标签包含更多的监督信息,使用 Logistics 代替类别标签对小模型进行训练,将小模型训练转化为了回归问题。让小模型的输出尽量接近大模型的 Logits。
②Softmax 的输出层包含了每个类别的概率,包含了更多的信息,用超参数控制预测概率的平衡程度。最终损失函数由小模型的预测结果和大模型 Logistics 的交叉熵,以及小模型的预测结果和类别标签的交叉熵组成。通过权重调节两部分的重要程度,但因为与维度紧密相关,因此当类别较多时,模型难以收敛。与 Logits 相比,前一层的输出包含了更多噪声和无关信息,因此需要先取出无关维度,保持足够强的区分维度,维度间低相关。
【2】学生网络(Student Network):在知识蒸馏(暗知识提取)中,通过引入与教师网络(Teacher Network:复杂、但推理性能优越)相关的软目标(Soft-target)作为 Total Loss 的一部分,以诱导学生网络(Student Network:精简、低复杂度)的训练,实现知识迁移(Knowledge Transfer)。Teacher-Student 模型能够对大型网络进行瘦身,且不会失去太多的精度,将网络分布到用户端成为可能。浅层网络能够学习到深层网络学习到的函数,而且在一定情况下是以相同参数量实现的。步骤:先训练好一个表现良好的深层网络,接着用一个浅层网络去模拟这个深层网络。
通过密钥搜索改进识别器:本文测试了如何通过密钥搜索来改进识别器。首先生成一个大小为 100 万的测试集,以用于减少到 7 轮的 Speck 。对测试集中的密文对
c
c
c 的最后一轮密钥执行暴力搜索,并通过 6 轮神经网络识别器反馈部分解密的密文对
c
k
c_k
ck。神经网络识别器返回的分数
z
k
z_k
zk 被启发式地处理为
c
k
c_k
ck 从实际分布中的采样概率。令
z
k
′
:
=
z
k
/
(
1
−
z
k
)
{z_k}': = {z_k}/(1 - {z_k})
zk′:=zk/(1−zk),可以获得相应的似然比。对所有密钥求平均值,可以获得平均分数,并通过
z
:
=
z
a
v
/
(
1
+
z
a
v
)
z: = {z_{av}}/(1 + {z_{av}})
z:=zav/(1+zav) 得到密文对
c
c
c 的分数
z
z
z。如果
z
>
0.5
z > 0.5
z>0.5,则
c
c
c 被判定为真实样本,否则就为随机样本。这个程序能够略微提高预测的准确性,并在 62.7% 的测试样本中成功匹配。
将密钥搜索作为快速神经网络识别器的 Teacher:获得的 100 万的样本集可以进一步用作 7 轮 Speck 的单块识别器的训练目标。训练进行了 30 个 epoch,在第 20 个 epoch,单次学习率由 0.001 下降至 0.0001。在单独生成的集合中的测试表明,这是七轮 Speck 的最强神经网络识别器,具有 61.6% 的全局准确性。与最初的十块识别器相比,这种增益主要是由特异度(Specificity)【1】的增加所带来的,但代价是灵敏度的损失,即实际分布样本的更高拒绝率(Rejection Rate)【2】。
注:
【1】特异度(Specificity):特异度是实际为反例的样本中,预测为反例的占比,是对真实反例的预测覆盖面的一种度量。
【2】拒绝率(Rejection Rate):是指在测试匹配算法时,相同样本的匹配分数低于给定阈值,从而被认为是不同样本的比例,简单地说就是“把应该相互匹配成功的样本当成不能匹配的样本”的比例。
差异分布表的不一致性:对于五轮 Speck,生成一个大小为 100 万的测试集,并使用 Speck 的 Markov 模型为每个样本计算 Speck32 / 64的差分分布表及五轮单块神经网络识别器的输出。一半的测试样本使用实际分布生成,而另一半是随机抽取的。本文使用该数据集来研究神经网络预测器和差分分布表之间的不一致性。
通过对 48826 个样本的分析,可以得到两个预测因子之间的不一致样本,其中大多数来自于随机分布(约 57%)。本文的神经网络在 67% 的不一致样本中选择了正确的分类,这表明神经网络预测器能够产生比差分分布表更清晰的结果。
然而,对差分分布表的信息利用并不是完美的。例如,有 1549 个样本对应于不可能出现的的差分转移,其中有 2 个被神经网络错误地分类为来自实际分布,尽管在两种情况下,神经网络输出返回的置信水平都很低(分别为 56% 和 53%)。
另一方面,神经网络也能够成功地识别出在实际分布中本不会出现的输出对,例如在不一致集合中神经网络的最低分数是由
(
C
0
(C_0
(C0,
C
1
C_1
C1
)
:
=
(
0
x
c
65
d
2696
,
0
x
a
6
a
37
b
2
a
)
):=(0xc65d2696,0xa6a37b2a)
):=(0xc65d2696,0xa6a37b2a)得到的。根据马尔可夫模型,对应于输出差分
0
x
60
f
e
/
5
d
b
c
0x60fe / 5dbc
0x60fe/5dbc,5 轮转移
0
x
0040
/
0000
→
0
x
60
f
e
/
5
d
b
c
0x0040 / 0000 → 0x60fe / 5dbc
0x0040/0000→0x60fe/5dbc 具有约
2
−
26
2^{-26}
2−26 的概率,因此基于差分分布表的预测器认为,该输出对有 98% 的可能性来自于实际分布。在对该预测的
1
0
10
10^{10}
1010 次测试中,发现了 44 个良好的差分转移对,这一结果大大低于预期,但仍然与期望值在一个数量级内。然而,神经网络分类器返回的结果表明,(
C
0
C_0
C0,
C
1
C_1
C1)来自于实际分布的可能性几乎为零。通过将标签给出的基本事实与密钥搜索的结果进行比较,证明结果是正确的,后者表明该输出对是不可能由实际分布生成的。
密码学分布的小样本学习(Few-shot Learning)【1】:小样本学习是指人们(有时是机器)学会识别特定类别的对象,或在仅仅已知一些甚至一个样本时解决某些问题的能力。作者测试了本文的神经网络是否能够在已知另一个相关分布的情况下,成功执行密码分布的小样本学习。执行以下实验:首先训练具有一个残差块的新神经网络,以识别固定但随机选择输入差的三轮 Speck。训练的单个 epoch 由 2000 个下降步骤组成,batch 大小为 5000,训练时间大约为 1 分钟。然后选取网络的倒数第二层输出,将其表示为输入数据。对于主区分器,生成一些具有选择输入差分的六轮 Speck 的小样本输出(仅包含 1 ~ 50 个实际样本)。创建的每个样本集通过从随机分布中抽取的相同数量的样本进行补充。神经网络发送得到的样本集
S
S
S,以获得内部表示向量的对应集合
S
′
⊂
R
64
S' \subset {R^{64}}
S′⊂R64。使用岭回归(Ridge Regression)【2】(正则化参数
a
=
1
a = 1
a=1),从小样本的训练集创建六轮分布的线性预测器
L
:
R
64
→
R
L:R^{64} → R
L:R64→R,以最小化标签与
S
′
S'
S′ 上预测之间的平方误差。如果
L
(
X
)
>
0.5
L (X) > 0.5
L(X)>0.5,则将
x
∈
S
′
x ∈ S'
x∈S′ 分类为真实样本,否则为随机样本。在大小为 50000 的集合上测试该预测器的结果表明,即使使用个位数大小的样本,算法也很有效。
注:
【1】小样本学习(Few-shot Learning):模型只包含少量有 Label 的训练样本集
S
S
S,
S
S
S 中包括
N
N
N 个样本,
y
i
y_i
yi 代表各样本的 Label。因为测试样本集中的每个样本都有一个正确的类别,因此,对于新的待分类的测试样本
x
′
x'
x′,应该正确预测出其对应标签的是
y
′
y'
y′。机器学习目前都是类比人类的智能来做的,那么对应机器模型,Few-shot Learning 的核心任务就是识别新的类。例如:已经通过些许动物(狗除外)的样本训练出来了模型,并想让模型识别新的类-----狗。显然,这就是要把源知识(Source)迁移到包含狗的知识领域来(Target),这正是迁移学习的范畴。这时需要识别新的类------狗,比较简单的解决方案是把源模型当做预训练模型,修改全连接层,进行 Fine-tune。
【2】岭回归:岭回归是一种专用于共线性数据分析的有偏估计回归方法,实质上是一种改良的最小二乘估计法。它通过放弃最小二乘法的无偏性,以损失部分信息、降低精度为代价,获得回归系数更符合实际、更可靠的回归方法,对病态数据的拟合要强于最小二乘法。
对于有些矩阵,其中某个元素的一个很小的变动,会引起最后计算结果的误差很大,这种矩阵称为“病态矩阵”。有时不正确的计算方法也会使一个正常的矩阵在运算中表现出病态。对于高斯消去法来说,如果主元(即对角线上的元素)上的元素很小,在计算时就会表现出病态的特征。
回归分析中常用的最小二乘法是一种无偏估计。对于一个适定问题,X通常是列满秩的采用最小二乘法,定义损失函数为残差的平方,最小化损失函数
∥
X
θ
−
y
∥
2
{\left\| {X\theta - y} \right\|^2}
∥Xθ−y∥2。
上述优化问题可以采用梯度下降法进行求解,也可以采用如下公式进行直接求解:
当
X
X
X 不是列满秩时,或者某些列之间的线性相关性比较大时,
X
T
X
{X^T}X
XTX 的行列式接近于
0
0
0,即
X
T
X
{X^T}X
XTX 接近于奇异,上述问题变为一个不适定问题,此时,计算
(
X
T
X
)
−
1
{\left( {{X^T}X} \right)^{ - 1}}
(XTX)−1 的误差会很大,传统的最小二乘法缺乏稳定性与可靠性。
为了解决上述问题,需要将不适定问题转化为适定问题:为上述损失函数加上一个正则化项,变为:
其中,定义
Γ
=
α
I
\Gamma = \alpha I
Γ=αI,于是:
上式中,
I
I
I 是单位矩阵。
随着
α
\alpha
α 的增大,
θ
(
α
)
\theta (\alpha )
θ(α) 各元素
θ
(
α
)
i
\theta {(\alpha )_i}
θ(α)i 的绝对值均不断变小,它们相对于正确值
θ
i
\theta_i
θi 的偏差也越来越大。
α
\alpha
α 趋于无穷大时,
θ
(
α
)
\theta (\alpha )
θ(α) 趋于
0
0
0。其中,
θ
(
α
)
\theta (\alpha )
θ(α) 随
α
\alpha
α 的改变而变化的轨迹,被称为岭迹。在实际计算中,有许多
α
\alpha
α 值可选,做出一个岭迹图,这个图在取哪个值的时候变稳定了,就可以确定
α
\alpha
α 值。
岭回归是对最小二乘回归的一种补充,它损失了无偏性,来换取高的数值稳定性,从而得到较高的计算精度。
使用算法 2 训练的新的区分器非常有效。例如,在 1000 个样本的训练集上重新训练大约需要 1 毫秒。
在没有人类知识的情況下获得良好的输入差分:这种小样本学习能够快速地计算出,针对给定输入差和给定轮次 Speck 的截断差分识别器有效性的粗略下界。具体来说,给定三轮 Speck 的预训练网络和随机输入差
δ
δ
δ,可以快速训练另一个随机输入差
δ
′
δ'
δ′ 的识别器,并在一个小测试集上评估其准确性。从随机的
δ
′
δ'
δ′ 开始,使用算法 3 来优化
δ
′
δ'
δ′ 以提高识别器的测试集精度。对于测试的每个新的输入差,使用
α
=
0.01
α = 0.01
α=0.01,
t
=
2000
t = 2000
t=2000,以及大小为 1000 的测试和训练数据集,需要不到 2 分钟的计算时间来训练初始的三轮识别器,并且每次运行算法 3 大约需要 15 秒。主神经网络识别器的初始差通常在贪心优化器的几次随机重启中确定,并延长攻击轮数,然后可以通过迁移学习,以很高的增益区分至少六轮 Speck。
其它的通用优化算法(例如蒙特卡罗树搜索(Monte Carlo Tree Search)【1】的变体)可能会运行得更好。
注:
【1】蒙特卡罗树搜索(Monte Carlo Tree Search):当所要求解的问题是某种事件出现的概率,或者是某个随机变量的期望值时,它们可以通过某种“试验”的方法,得到这种事件出现的频率,或者这个随机变数的平均值,并用它们作为问题的解。这就是蒙特卡罗方法的基本思想。蒙特卡罗方法通过抓住事物运动的几何数量和几何特征,利用数学方法来加以模拟,即进行一种数字模拟实验。它是以一个概率模型为基础,按照这个模型所描绘的过程,通过模拟实验的结果,作为问题的近似解。可以把蒙特卡罗解题归结为三个主要步骤:构造或描述概率过程;实现从已知概率分布抽样;建立各种估计量。
通常蒙特卡罗树搜索通过构造符合一定规则的随机数,来解决数学上的各种问题。对于那些由于计算过于复杂而难以得到解析解或者根本没有解析解的问题,蒙特卡罗树搜索是一种有效的求出数值解的方法。一般蒙特卡罗树搜索在数学中最常见的应用就是蒙特卡罗积分。蒙特卡罗算法的采样越多,越近似最优解。
关于数据增强(Data Augmentation)【1】:在小样本学习中,很自然地会考虑利用对称性来改进程序。例如,已知密文对
C
0
C_0
C0,
C
1
C_1
C1 和
C
1
C_1
C1,
C
0
C_0
C0 出现在实际或随机分布中的概率相同。此外,如果在加密中使用的最后一轮子密钥交换为不同的子密钥,则很容易从
C
0
C_0
C0,
C
1
C_1
C1 计算所有密文对。但是,在本文的测试中,这些数据增强方法并没有提供帮助。原因是迁移学习中使用的辅助网络对于这些对称性大多是已知的,并以这种方式将随机输入映射到附近的内部表示之中。
注:
【1】数据增强(Data Augmentation):数据增强是扩充数据样本规模的一种有效方法。深度学习是基于大数据的一种方法,数据规模越大、质量越高,模型才能够有着更好的泛化能力。然而在实际采集数据时,往往很难覆盖全部场景,比如:对于光照条件,在采集图像数据时很难控制光线的比例,因此在训练模型的时候,就需要加入光照变化方面的数据增强。另一方面,数据的获取也需要大量的成本,如果能够自动化生成各种训练数据,就能更好地开源节流。数据增强可以分为两类,一类是离线增强,一类是在线增强。
离线增强:直接对数据集进行处理,数据的数目会变成增强因子乘以原数据集的数目,这种方法常用于小数据集。
在线增强:这种增强方法用于获得 Batch 数据之后,对这个 Batch 的数据进行增强,如旋转、平移、翻折等相应的变化。由于有些数据集不能接受线性级别的增长,因此这种方法常用于大数据集,许多机器学习框架已经支持了这种数据增强方式,并且可以使用 GPU 优化计算。
密钥恢复攻击:
为了展示神经网络识别器作为研究工具的实用性,文章构建了
N
C
7
NC7
NC7 和
N
C
6
NC6
NC6 识别器的部分密钥恢复攻击,与文献中已知的最佳攻击相比减少到 11 轮,特别是 Dinur 的攻击。此攻击的计算复杂度大约相当于
2
46
2^{46}
246 的 Speck,能够在查询
2
13
2^{13}
213 对选择明文对,并获得相应的密文后取得成功。Dinur 也提出了 12 到 14 轮的攻击,自然具有更大的计算和数据复杂度。
相比之下,如果在 CPU 上执行,11 轮攻击预计会成功,计算复杂度相当于
2
41
2^{41}
241 的 Speck 评估,它的数据复杂性略低于 Dinur 的 11 轮攻击。
基本的攻击思想:预先设置一个两轮的差分转移
δ
→
0
x
0040
/
0000
δ → 0x0040/ 0000
δ→0x0040/0000,将 7 轮识别器扩展到 9 轮识别器,该转移需要以
1
/
64
1/64
1/64 的概率传递。在一轮 Speck 之后,加密给定输入差
δ
δ
δ 的密文对
P
0
P_0
P0,
P
1
P_1
P1,扩展 9 轮识别器而无需额外的开销是很容易的,因为在第一次非线性操作之前,Speck 没有进行轮密钥加的计算。
来自这个区分器的信号将相当薄弱。因此,通过
k
k
k 个 中性位(Neutral Bits)【1】,由每个明文对创建初始两轮差分的
2
k
2^{k}
2k 个明文对结构来增强它。对于每个明文结构,在所有最终轮子密钥下解密得到的密文,并使用神经网络识别器对每个部分解密的密文结构进行排名。如果得到的分数超过阈值
c
1
c_1
c1,就尝试解密另一轮,并使用六轮神经网络识别器对得到的部分解密的密文进行分级。如果得分也超过了另一个阈值
c
2
c_2
c2,则返回密钥的猜测结果。
注:
【1】 中性位(Neutral Bits):设
M
M
M 和
M
′
M'
M′ 是一对对于某些轮数
≥
16
≥16
≥16 并符合
δ
r
\delta_r
δr 的消息。如果补充了
i
′
i'
i′ 位后的
M
M
M 和
M
′
M'
M′ 也符合
δ
r
\delta_r
δr,则消息的第
i
′
i'
i′ 位
(
i
∈
{
0
,
…
,
511
}
)
(i∈\{0,…,511\})
(i∈{0,…,511}) 对于
M
M
M 和
M
′
M'
M′ 分别是一个中性位;如果补充了
(
{
i
}
、
{
j
}
(\{i\}、\{j\}
({i}、{j} 或
{
i
,
j
}
)
\{i,j\})
{i,j}) 的任何子集后的
M
M
M 和
M
′
M'
M′ 也符合
δ
r
\delta_r
δr,则消息的第
i
′
i'
i′ 和
j
′
j'
j′ 位对于
M
M
M 和
M
′
M'
M′ 分别是一个中性位;对于一组比特
S
⊆
{
0
,
…
,
511
}
S⊆\{0,…,511\}
S⊆{0,…,511},如果补充了
S
S
S 的任何子集后的
M
M
M 和
M
′
M'
M′ 也符合
δ
r
\delta_r
δr,则集合
S
S
S 对于
M
M
M 和
M
′
M'
M′ 分别是中性的;对于消息位的子集
S
⊆
{
0
,
…
,
511
}
S⊆\{0,…,511\}
S⊆{0,…,511},如果
S
S
S 中的每一位都是中性的,并且
S
S
S 中的每对比特也是中性的,那么
S
S
S 对于
M
M
M 和
M
′
M'
M′ 是一个2-中性集。
——参考文献:Eli Biham and Rafi Chen. Near-collisions of sha-0. In Annual International Cryptology Conference, pages 290–305. Springer, 2004.
对部分解密进行排序:神经网络识别器为每个密文对
C
C
C 返回 0 到 1 之间的分数
z
z
z。该分数可以被视为在区分实际与随机的实验中,该密文对服从真实分布的概率。然后,可以通过
P
r
e
a
l
/
P
r
a
n
d
=
z
/
(
1
−
z
)
{P_{real}}/{P_{rand}} = z/(1 - z)
Preal/Prand=z/(1−z) 计算由实际和随机分布生成密文对
C
C
C 的概率
P
r
e
a
l
{P_{real}}
Preal 和
P
r
a
n
d
{P_{rand}}
Prand 之间的比率。为了计算分数,密文结构应全部来自随机或实际分布。采用这些似然比的双对数,并对结果求和,可以计算出最终的分数。
攻击参数:这个基本思想可以转化为对 11 轮 Speck 的实际密钥恢复攻击。初始差分
(
0
x
211
/
0
x
a
04
)
(0x211 / 0xa04)
(0x211/0xa04)和由中性位 14,15,20,21,22,23 组成的密码状态集合工作良好,尽管 14,15 和 23 位不是完全中立的。使用
c
1
=
15
c_1 = 15
c1=15,
c
2
=
100
c_2 = 100
c2=100,成功攻击的时间在 GTX 1080 Ti 显卡的机器上大约为 20 分钟,在现代单核 CPU 上大约为 12 个小时。在 100 次实验中,平均每处理
2
13.2
2^{13.2}
213.2 个密文对后输出 1 个猜测密钥。其中有 81 次成功恢复了真正的子密钥;最后一轮子密钥猜测正确 99 次。在剩下的一个情况中,倒数第二轮子密钥是正确的,而最后一轮子密钥仅有 1 比特错误。
优化:这种基本攻击可以通过各种方式进行加速。本文已实现了以下的增强功能:
①神经网络识别器可以通过部分正确的子密钥进行解密。这并不是通过对最后一个子密钥执行暴力搜索来实现的,而是通过猜测和确定攻击,尝试对初始密钥候选集排序,并保留最有希望的密钥,然后扩展一位,重复该过程直到剩余候选密钥的所有位都被确定。
②同样地,在预备步骤中,对于每个密文结构,仅使用一半密文执行最后一轮密钥的部分搜索,来对密文结构进行排序。这减少了数据使用并节省了时间,并且不需要通过加密的 oracle 进一步査询前半部分初始差分的密文。
③通过这些更改可以发现,密钥经常位于一个或两个真实子密钥的汉明距离上。围绕这个问题,使用六轮识别器对该验证搜索中的密钥猜测进行排序,并利用最佳密钥猜测的 2 个汉明权重进行短验证搜索。
使用密钥划分属性,概念上最简单的方法是使用算法 3 来优化密文结构返回的组合分数,作为最后一个子密钥的函数。作者已经对此进行了测试,实际上它确实运行良好,但并不是最有效的攻击。
改进的密钥恢复攻击的基本结构是算法 4,它将密文结构(即已经经过初始差分的一组密文)以及一组最终的候选子密钥作为输入,输出一组减小的密钥猜测集和结构分数。
在实现中,解密密文结构时需要另外改变每个候选密钥的最高有效位,这意味着将候选密钥
k
k
k 的某些位视为未定义,并在一个结构体中解密不同密文时使用这些位的不同设置。然而,从所有密钥获得的分数将会被融合到密钥
k
k
k 的分数中。确保结构中的某些密文通过正确或几乎正确的密钥解密(如果固定的密钥位是正确的),可以略微改善密钥的空间覆盖范围。
可以给出整个攻击的高级视图:对于每个密文结构,首先创建一组密钥猜测, 其覆盖最后一个子密钥的 10 个最低有效位的所有值。应用
q
=
1
/
2
q = 1 / 2
q=1/2 的
R
e
m
o
v
e
K
e
y
C
a
n
d
i
d
a
t
e
s
RemoveKeyCandidates
RemoveKeyCandidates,并将剩余的子密钥扩展一位,重复直到所有子密钥位都被确定。留下 512 个候选项,用于最后一个子密钥和相应的网络分数。丢弃所有得分小于截止参数
c
1
c_1
c1 的子候选项,并对于每个剩余的候选密钥执行解密操作。然后,为第二个子密钥创建一组候选值,覆盖最低 9 个有效位,并重复应用
R
e
m
o
v
e
K
e
y
C
a
n
d
i
d
a
t
e
s
RemoveKeyCandidates
RemoveKeyCandidates 扩展候选密钥。这次使用更具侵略性的修剪参数
q
=
1
/
3
q = 1 / 3
q=1/3,因为六轮识别器会产生非常强的信号。
如果在应用第二轮密钥后,找到一对得分高于第二个截止参数
c
2
c_2
c2 的候选子密钥,就输出一个密钥猜测,但在此之前需要处理当前密文结构的所有候选密钥。整个过程中,需要跟踪两个轮密钥的最佳候选值。每当找到新的最佳轮密钥对时,通过添加最佳猜测的 2 倍汉明距离内的所有密钥,来扩展最后一轮密钥的候选列表。
输出密钥猜测之前,在要恢复的两个轮密钥周围进行简短的验证搜索,其中汉明半径为 2。如果分数能够得到改进,则重复验证搜索。最终,将第六轮网络返回的具有最佳分数的密钥作为密钥值的最优解。
密文结构的预排序与生成最后一轮候选密钥列表的过程相同,但使用了修剪参数
q
=
1
/
3
q = 1 / 3
q=1/3 并且每个密文结构中仅使用一半数据。丟弃生成的候选密钥,密文结构按返回的最佳分数降序排序。
结果:实验使用了截止参数
c
1
=
5
c_1 = 5
c1=5 和
c
2
=
10
c_2 = 10
c2=10。给定一百个密文结构,平均大约 2 分钟输出一个密钥猜测(在 100 次实验中测得的平均值:在 GTX 1080 Ti 显卡上为 132 秒)。这个密钥并不总是正确的,从返回的分数中可以很容易地看出这一点。在同一系统的单核 CPU 上,相同条件下的平均运行时间大约为 2 个小时。当有更多数据可用时,效率会略有提高,因为预分类会产生更大的影响。利用 500 个密文结构的数据和激进的选择性设置,可以达到大约一分钟的平均处理时间。
100 个密文结构对应 12800 个选择的明文。在 100 次实验中,平均查询了
2
12.9
2^{12.9}
212.9 选择明文。如果最后一轮密钥猜测正确,并且第二轮密钥在汉明距离处最多只有一个真实密钥,就将猜测计为成功。在此条件下,100 次实验中有 63 次攻击成功;有 66 个样本的第一轮密钥恢复是成功的。在所有情况下,第二轮的密钥猜测均在真实密钥的 2 倍汉明距离之内。相比之下,Dinur 提出的攻击预计会以相同的数据复杂度在 55% 的实验中成功。当使用 100 个密文结构时,成功率和数据使用对应于
2
13.6
2^{13.6}
213.6 的选择明文数据。若在失败的情況下,还需要另外的 100 个明文结构的密文值。
计算复杂度:高度优化、完全 SIMD 并行化的 Speck32 / 64 可以以每秒
2
28
2^{28}
228 个密钥的速度执行暴力搜索。根据经验的攻击成功率进行调整,预计平均需要 3 个小时才能在系统的单个内核上执行密钥恢复算法,这产生了相当于
2
41
2^{41}
241 次 Speck 加密的攻击计算复杂度。假设最后一轮密钥已经被正确猜测,并且倒数第二轮密钥猜测最多有单个比特的误差,全部密钥恢复的额外工作最多相当于
2
36.1
2^{36.1}
236.1 次 Speck 加密。
在快速的 GPU 上,暴力密钥搜索可以被大幅加速。例如,GTX 1080 Ti 具有 3584 个 CUDA 内核,运行时钟速率为 1582 MHz。每轮 Speck 加密需要十个基本算术运算,包括密钥调度。由于 Speck32 / 64 以 16 位字运行,因此在每个周期可以利用数据级并行(Data Level Parallelism)【1】,对每个 CUDA 内核执行四个基本的 16 位整数运算。这表明 GTX 1080 Ti 每秒可以执行
2
37.5
2^{37.5}
237.5 次 Speck 加密,每次攻击持续 3 分钟,复杂度相当于
2
45
2^{45}
245 次的 Speck 加密。
注:
【1】数据级并行(Data Level Parallelism):数据级并行是指处理器能够同时处理多条数据,属于 SIMD 模型,即单指令流多数据流模型。数据级并行依赖于并行处理机。并行处理机的特点是重复设置许多同样的处理单元,按照一定的方式相互连接,在统一控制部件的作用下,各自对分配来的数据并行地完成同一指令规定的操作。控制部件实际上是一台高性能单处理机,它执行控制指令和只适用于串行处理的操作指令,而把适用于并行处理的指令传送给所用的处理单元,但仅有那些处于“活动”状态的处理单元才并行地对各自的数据进行操作。为了实现快速有效的数据处理,数据应在各处理单元之间合理分配与存储,使各处理单元主要对自身存储器内的数据进行运算。
如果将 GPU 与同一平台上的暴力密钥搜索进行比较,那么 GPU 比 CPU 上运行的攻击具有明显更高的复杂度。与文献中其它完全利用现代 CPU 或 GPU 的攻击相比,它们可能都低估了攻击的计算复杂度优势。例如,Dinur 的攻击似乎不能有效地使用数据级并行或 GPU 的执行模型,而这对于暴力密钥捜索和本文的攻击都是显而易见的。
权衡:在数据使用、捜索选择性和搜索截止标准之间存在着各种权衡。它们对攻击复杂度有着实际的影响。例如,如果数据使用率略高,可以构建一个大约一半运行时间的攻击。然而,从根本上改进搜索可能比调整参数具有更大的作用,此留待进一步研究。
实际的差分实验:
Speck32 / 64:
动机:在上一节中已经看到,最好的神经网络识别器在减少到五轮和六轮的 Speck32 / 64 上比基于完整的差分表效果更好。有两个主要原因可以解释这一结果:
①用于计算 Speck 的差分概率的 Markov 模型是错误的,并且神经网络识别器能更好地利用差分信息,因为它不受 Speck 差分转移模型的误差影响。
②神经网络识别器利用的密文对分布特征对于纯差分识别器是透明的。
在本节中,为了支持第二个假设,引入一个差分加密识别任务,其中原文的差分分布完全已知,且攻击者除了随机猜测外没有更好的方法。作者还简要报告了一个实验,它以一种普通的方式训练神经网络来解决这个问题。
实验设置:首先,从
D
5
D5
D5,
D
6
D6
D6 和
D
7
D7
D7 的实际分布中抽取
1
0
6
10^6
106 个样本。然后,将这些样本中的一半以下列方式随机化:对于随机化的输出密文对
C
=
(
C
0
,
C
1
)
∈
F
2
2
b
C = (C_0,C_1)∈ F_2^{2b}
C=(C0,C1)∈F22b,从
d
e
v
/
u
r
a
n
d
o
m
dev / urandom
dev/urandom 随机均匀生成一个盲值(Blinding Value)
K
∈
F
2
b
K ∈ F_2^{b}
K∈F2b。将该值逐位添加到两个密文,以产生随机密文
C
~
=
(
C
0
⊕
K
,
C
1
⊕
K
)
\tilde C = ({C_0} \oplus K,{C_1} \oplus K)
C~=(C0⊕K,C1⊕K)。
将得到的
1
0
6
10^6
106 个随机或非随机密文对进行预处理,并将结果传递给适当的预训练神经网络,进行五轮,六轮或七轮的训练,以便将其分类为随机或实际样本。
作为参考,修改了前文的五轮搜索识别器,以在实际的差分情境中工作。在这种设置中,似乎不存在所需输入差分的解密密钥的精确解,因为随机和实际的样本通常具有非常多的解决方案。因此,首先计算
N
k
e
y
s
N_{keys}
Nkeys 的两个近似值:
其中
D
P
(
Δ
C
)
DP(ΔC)
DP(ΔC)是由 Speck 的 Markov 模型给出的密文对
C
C
C 的输出差分概率。其次,计算:
其中
D
m
i
d
D_{mid}
Dmid 是可能的 3 轮差分集合,
P
(
δ
)
P({\delta})
P(δ)表示在给定路径的固定输入差的情况下,该第 3 轮差分的概率,
N
δ
(
C
)
N_{\delta}(C)
Nδ(C)表示将观察到的密文对
C
C
C 解密为第 3 轮差的最后两个子密钥的解的数量。
如果
A
r
e
a
l
>
A
r
a
n
d
A_{real} > A_{rand}
Areal>Arand,则将
C
C
C 记为真实值,否则将其标记为随机值。
基本原理:本实验中,随机样本和实际样本的差分分布明显相同。另一方面,在随机样本中,除了给出的两个密文块的差之外,关于密文的其它信息被完全隐藏,因为随机采样的结果均匀分布在每个可能差的超平面(Hyperplane)【1】上。
注:
【1】超平面(Hyperplane):超平面是
n
n
n 维欧氏空间中,余维度等于 1 的线性子空间,也就是必须是
(
n
−
1
)
(n-1)
(n−1) 维度。这是平面中的直线、空间中的平面之推广(
n
n
n 大于 3 才被称为“超”平面),是纯粹的数学概念,不是现实的物理概念。因为是子空间,所以超平面一定经过原点。
设
F
F
F 为域(考虑
F
=
R
F=R
F=R)。
n
n
n 维空间
F
n
F^n
Fn 中的超平面是由方程:
定义的子集,其中
a
1
,
…
,
a
n
∈
F
{a_1}, \ldots ,{a_n} \in F
a1,…,an∈F 是不全为零的常数。
在线性代数的脉络下,
F
F
F- 矢量空间
V
V
V 中的超平面是指形如:
{
v
∈
V
:
f
(
v
)
=
0
}
\left\{ {v \in V:f\left( v \right) = 0} \right\}
{v∈V:f(v)=0} 的子空间,其中
f
:
V
→
F
f:V \to F
f:V→F 是任一非零的线性映射。在射影几何中,同样可定义射影空间
P
n
P^n
Pn 中的超平面。在齐次坐标
(
x
0
:
⋯
:
x
n
)
\left( {{x_0}: \cdots :{x_n}} \right)
(x0:⋯:xn) 下,超平面可由以下方程定义:
其中
a
0
,
…
,
a
n
{a_0}, \ldots ,{a_n}
a0,…,an 是不全为零的常数。
超平面
H
H
H 是从
n
n
n 维空间到
n
−
1
n-1
n−1 维空间的一个映射子空间,它由一个
n
n
n 维向量和一个实数定义。设
d
d
d 是
n
n
n 维欧式空间
R
R
R 中的一个非零向量,
a
a
a 是实数,则
R
R
R 中满足条件
d
X
=
a
dX=a
dX=a 的点
X
X
X 所组成的集合称为
R
R
R 中的一张超平面。
结果:最好的 5、6 和 7 轮网络可以完成实际的差分任务,而不是没有明确训练的随机猜测。在五轮的情况下尝试了实际差分的训练,并大大扩展了这一优势。然而,可以预见的是,密钥搜索确实具有明显优越的区分能力。
这些测试表明,密文对并不是均匀分布在各自的差异等价类中的。实际上,使用神经网络识别器作为搜索工具,很容易找到具有相对高似然差的密文对,它们出现在减少轮数的 Speck 的密文对分布中的概率很小。另一方面,考虑输出对
(
0
x
58
e
0
b
c
4
,
0
x
85
a
4
f
f
6
c
)
(0x58e0bc4,0x85a4ff6c)
(0x58e0bc4,0x85a4ff6c)和
(
0
x
a
a
12
b
7
f
2
,
0
x
2
a
38435
a
)
(0xaa12b7f2,0x2a38435a)
(0xaa12b7f2,0x2a38435a)。两者都具有差分
0
x
802
a
/
f
4
a
8
0x802a / f4a8
0x802a/f4a8,对于五轮 Speck ,转移
0
x
0040
/
0000
→
0
x
802
a
/
f
4
a
8
0x0040 / 0000 → 0x802a / f4a8
0x0040/0000→0x802a/f4a8 的可能性相当高(根据匹配的完整 Markov 模型,大约为
2
−
15.3
2^{-15.3}
2−15.3)。然而,根据计算,前一个密文对以低得多的可能性解密到该转移的初始差分,大约为
2
−
32
2^{-32}
2−32。
加法的实际差分:
动机:即使在五轮 Speck32 / 64 的情况下,也很难完全利用实际差分实验中密文对分布的不均匀性。因此,可以简要地看一下更简单的情况,即加法的实际差分。
设置:假设给出了一个加法的微分方程:
其中已知
a
,
b
,
c
∈
F
2
n
a,b,c ∈ F_2^n
a,b,c∈F2n。进一步假设对手另外给出
z
:
=
x
田
y
z: = x 田 y
z:=x田y 或掩盖版本
z
:
=
(
x
田
y
)
⊕
K
z: =(x 田 y)⊕ K
z:=(x田y)⊕K ,其中每个样本的
K
K
K 是随机选择的。攻击者必须区分它们是被掩盖(随机的)或不是(真实的)。对于问题的产生,从中随机均匀地选择
a
,
b
,
x
,
y
,
K
a,b,x,y,K
a,b,x,y,K,并设
z
:
=
x
田
y
z: = x 田 y
z:=x田y 和
c
:
=
(
x
田
y
)
(
(
x
⊕
a
)
田
(
y
⊕
b
)
)
c:=(x 田 y)((x⊕a) 田 (y⊕b))
c:=(x田y)((x⊕a)田(y⊕b)),因此问题的结果总是至少有一个解。
精确的解决方案:观察盲值分布中元组
(
a
,
b
,
c
,
z
)
(a,b,c,z)
(a,b,c,z)的概率可以通过文献中加法微分方程的方法计算。为了计算概率
p
r
e
a
l
p_{real}
preal,作者设计了一个有限状态机
S
(
a
,
b
,
c
,
z
)
S(a,b,c,z)
S(a,b,c,z),其具有
64
n
+
1
64n +1
64n+1 个状态,从最低到最高有效位,通过切片方式遍历所提出的解
x
,
y
,
z
,
x
′
=
(
x
⊕
a
)
,
y
′
=
(
y
⊕
b
)
,
z
′
=
(
z
⊕
c
)
x,y,z,x' =(x⊕a),y' =(y⊕b),z' =(z⊕c)
x,y,z,x′=(x⊕a),y′=(y⊕b),z′=(z⊕c),并检査得出的解是否正确,否则进入一个特殊的非接受状态。然后,通过乘以每个时间步的转移矩阵来计算终止状态的数量。为了处理
n
n
n 比特长的串,需要最多
64
64
64 个转移矩阵和
n
−
1
n - 1
n−1 次大小为
64
×
64
64×64
64×64 的矩阵乘法。然后可以从乘以
2
−
6
n
2^{-6n}
2−6n 的解的数量获得
p
r
e
a
l
p_{real}
preal。当且仅当
p
r
e
a
l
>
p
r
a
n
d
p_{real} > p_{rand}
preal>prand 时,给定数据最终被归类为真实值。
神经网络:本文还训练了一个神经网络来解决相同的问题。输入数据为自然方式表示的 4 位向量序列
(
a
,
b
,
c
,
z
)
(a,b,c,z)
(a,b,c,z)。神经网络由 16 个 LSTM(长短期记忆网络 LSTM,Long Short-Term Memory)【1】单元的递归层(Recurrent Layer)【2】组成,其具有整流器输出激活,随后是使用
S
S
S 形激活的单个单元的密集输出层,使用 Adam 优化器和如先前针对 Speck 识别器的相同循环学习率。在长度为 16 位的
1
0
6
10^6
106 个样本的数据集上对 100 个 epoch 进行二元交叉熵损失(Binary Crossentropy Loss)【3】的 1000 次训练,训练集的最后
1
0
3
10^3
103 个样本用于验证测试被保留,通过损失验证的最佳网络被保留用于进一步研究。最后,在对应于问题大小(DEA问题(数据包络分析方法 Data Envelopment Analysis,DEA)【4】的比特长度)
n
=
16
n = 16
n=16 和
n
=
128
n = 128
n=128 的两个 100000 的测试集上评估该解决方案。这里没有使用正则化,因为过度似合似乎并不是问题。
注:
【1】LSTM:长短期记忆网络(LSTM,Long Short-Term Memory)是一种时间循环神经网络,是为了解决一般的循环神经网络存在的长期依赖问题而专门设计出来的,所有的 RNN 都具有一种重复神经网络模块的链式形式。在标准 RNN 中,这个重复的结构模块只有一个非常简单的结构,例如一个 tanh 层。作为非线性模型,LSTM 可作为复杂的非线性单元,用于构造更大型的深度神经网络。
LSTM 是一种含有 LSTM 区块(Blocks)的类神经网络,LSTM 区块可以被描述为智能网络单元,因为它可以记忆不定时间长度的数值。区块中有一个 Gate,它能够决定 Input 是否重要到能被记住,以及能不能被输出 Output。
在上图的四个
S
S
S 函数单元中,最左边的函数可能成为区块的 Input,而右边三个会由 Gate 决定 Input 是否能传入区块;第二个为 Input Gate,如果这里的产出近似于零,这里的值将不会进入下一层;第三个是 Forget Gate,当它的产生值近似于零时,将忘记区块中的记忆值;最右边的 Input 为 Output Gate,它可以决定在区块记忆中的 Input 是否能够输出。
【2】递归层(Recurrent Layer):递归神经网络是在时间结构上存在共享特性的神经网络变体,其关键在于网络中存在递归层。每一层的作用是将数据从一个空间变换到另一个空间下。可以视为特征抓取方式,也可以视为分类器。二者没有明显界限并彼此包含。以层的概念理解网络的好处在于,神经网络往往并不会仅用到一种处理手段,而往往是前馈、递归、卷积混合使用。
递归网络的特点:
①时序长短可变:只要知道上一时刻的隐藏状态与当前时刻的输入,就可以计算当前时刻的隐藏状态。并且由于计算所用到的权值在任意时刻都是共享的,因此递归网络可以处理任意长度的时间序列。
②顾及时间依赖:若当前时刻是第 5 帧的时序信号,那计算当前的隐藏状态就需要当前的输入和第 4 帧的隐藏状态,而计算第 4 帧又需要第 3 帧的隐藏状态,这样不断逆推到初始时刻为止,这意味着常规递归网络对过去所有状态都存在依赖关系。
③未来信息依赖:前馈网络是通过并接未来时刻的向量,来引入未来信息对当前内容判断的限制。但常规的递归网络只对过去状态存在依赖关系,所以递归网络的一个扩展就是双向(Bidirectional)递归网络,即两个不同方向的递归层叠加。
【3】二元交叉熵:在机器学习中,需要评估 Label 和 Predicts 之间的差距,使用 KL 散度刚刚好,由于 KL 散度中的前一部分不变,故在优化过程中,只需要关注交叉熵就可以了。所以一般在机器学习中直接用用交叉熵做 Loss 来评估模型。
交叉熵作为损失函数的好处是,在使用 Sigmoid 函数进行梯度下降时,能避免均方误差损失函数学习速率降低的问题,因为学习速率可以被输出误差所控制。
二元交叉熵损失(Logistic 损失)定义如下:
其中:
【4】数据包络分析方法:利用线性规划的方法,对具有可比性的同类型单位进行有效性评价的一种数量分析方法。以效率的概念作为加总模式,效率等于总产出除以总投入,并以效率最大化为目标。它解决了不同量纲的效率分析问题。同类决策单元的相同效率,其计算出的效率值反映了一个生产单元的决策能力,即为有效决策单元,并且可以进一步分析每个决策单元非 DEA 有效的原因及改进方向。
DEA 与其他多属性决策分析模式的不同之处在于,DEA 无须预设属性的相同权重。每个方案的效率衡量都是采取对该方案最有利的权重组合。无参数的生产函数分析法不预先属性的权重,而是借由实际投入产出的资料形成包络面,推测出生产边界。
结果:机器学习和手动设计的整体性能相当,后者在 128 位问题上略微优于前者,而两种解决方案的位大小是相似的。
结论:
作者在本文中测试了神经网络是否可用于实现统计测试,该统计测试有效地利用通过减少轮数以充分削弱的对称原文的差分性,以允许在低数据量的情况下执行攻击。在本文的设置中,这种方法运行得相当好:识别器的分类精度优于原文的差分表,并且使用更少的内存,尽管它的推理速度低于预计算的差分表所需的简单内存查找。关于轮数减少 Speck 的差分分布,可以通过黑箱方法从几百万个样本中提取出来。
在使用单个快速显卡时,将网络训练到超出差分分布表的精度水平,所需的时间大约为几分钟。网络在开始训练时没有加密超出密码知识的字结构,因此本文的方法相当通用。迁移学习能力表明,使用本文的网络,从事先前加密知识的输入最少,也可以从头开始找到良好的输入差。识别器具有各种新颖的特性,最显著的是能够区分同一差分类别中的密文对。
在这项研究的背景下,对于 Speck32 / 64 这种分组长度较小,轻量级的原语,它确实很有效。然而,对于传统攻击的优化和机器学习的应用都是如此。
鉴于目前的工作只是一个初步的案例研究,如果结果能够得到改善,也是十分正常的。进一步的研究方向表明,如果发现一种通用的方法可以使模型获得更多关于密码的先验知识,或使研究人员能够更容易地从训练模型中提取知识,那将是有趣的。
在本文给出的体系结构和设置中,网络性能也有望得到小幅改进。
在特定情况下,也可以看到以预计算的形式提供网络密码知识的效果。作者沿着这些线索进行了一些测试,例如为预测头提供差分表的分类结果,作为附加输入,但只起到了微小的作用。
机器学习方法不会取代传统的密码分析。但是,本文的结果表明,神经网络可以学会在密码学家的水平上进行密码分析,并且ML方法可以成为密码分析者工具箱的有用补充。希望密码学中使用的其它通用工具,例如 SAT 求解器【1】或 Groebner 基方法【2】也能提供类似的帮助。机器学习不能解决加密问题,但有用地补充与支持了传统的专用方法,来研究对称密码的安全问题。
注:
【1】SAT 求解器:SAT 可满足问题是第一个被证明的NP问题(就是能在多项式时间验证答案正确与否的问题)。
P 问题:在多项式时间内能够求解。
NP 问题:在多项式时间里能够验证是否有解。
SAT:判断一个以合取范式形式给出的逻辑命题公式是否存在一个真值指派,使得公式为真。
SAT 求解就是找出满足 CNF 或 SNF 范式的一组变量赋值。而 SAT 求解器就是可以完成 SAT 求解的程序。目前有很多著名的 SAT 求解器,如:GRASP、Chaff、Zchaff、BerkMin 和 MiniSat 等等。
【2】Groebner 基方法:Groebner 基理论最早是由 Buchberger 在 1965 年提出。Groebner 基理论主要用于代数中的约化问题,非线性代数方程组的求解、理想描述及成员判定等问题。它的本质是从多变元多项式环中任意理想的一组生成元出发,刻画和计算出一组具有“好”性质的生成元,得到的这些生成元可以进一步研究理想的结构以及某些理想运算。它在数学的各个领域,特别是李代数、计算代数和半群理论等方面都有广泛的应用。
设
M
M
M 是
R
m
R_m
Rm 的一个非空左子模,
G
=
{
g
1
,
…
,
g
t
}
G = \{ g_1,…,g_t\}
G={g1,…,gt}是由
M
M
M 中的非零元素组成的一个集合。称
G
G
G 是
M
M
M 的 Groebner 基,如果下面等式成立:
其中