白盒环境下基于LPN问题的攻击
是对论文LPN-based attack in the white-box setting的阅读即理解,建议配合论文原文阅读。
基础知识
需要提前掌握对白盒密码的一些基础知识。例如trace是什么,窗口,选择函数,猜测密钥等等……
LPN问题
LPN(Learing Parties with Noise)
解一个带有噪声的在
F
2
F_2
F2上的线性方程组:
A
x
⃗
+
e
⃗
=
[
a
1
,
1
⋯
a
1
,
k
⋮
⋮
⋮
a
T
,
1
⋯
a
T
,
k
]
[
x
1
⋮
x
k
]
+
[
e
1
⋮
e
T
]
=
[
b
1
⋮
b
T
]
\left.A\vec{x}+\vec{e}=\left[\begin{array}{ccc}a_{1,1}&\cdots&a_{1,k}\\\vdots&\vdots&\vdots\\a_{T,1}&\cdots&a_{T,k}\end{array}\right.\right]\begin{bmatrix}x_1\\\vdots\\x_k\end{bmatrix}+\begin{bmatrix}e_1\\\vdots\\e_T\end{bmatrix}=\begin{bmatrix}b_1\\\vdots\\b_T\end{bmatrix}
Ax+e=
a1,1⋮aT,1⋯⋮⋯a1,k⋮aT,k
x1⋮xk
+
e1⋮eT
=
b1⋮bT
噪声e以一个恒定的噪声率
τ
\tau
τ等于1。
SEL掩码方案
定义SEL掩码方案:
P
ℓ
,
d
=
x
1
+
⋯
+
x
ℓ
+
x
ℓ
+
1
x
ℓ
+
2
⋯
x
ℓ
+
d
∈
F
2
[
x
1
,
⋯
,
x
ℓ
+
d
]
P_{\ell,d}=x_1+\cdots+x_\ell+x_{\ell+1}x_{\ell+2}\cdots x_{\ell+d}\in\mathbb{F}_2[x_1,\cdots,x_{\ell+d}]
Pℓ,d=x1+⋯+xℓ+xℓ+1xℓ+2⋯xℓ+d∈F2[x1,⋯,xℓ+d]
l
l
l是掩码方案的线性部分,
d
d
d是掩码方案的非线性部分。
举个例子:
P
2
,
3
(
x
1
,
x
2
,
x
3
,
x
4
,
x
5
)
=
x
1
⊕
x
2
⊕
x
3
x
4
x
5
P_{2,3}(x_{1},x_{2},x_{3},x_{4},x_{5})=x_{1}\oplus x_{2}\oplus x_{3}x_{4}x_{5}
P2,3(x1,x2,x3,x4,x5)=x1⊕x2⊕x3x4x5
没有特殊说明的话,下文的“掩码方案”都是指不同
l
,
d
l,d
l,d的SEL掩码方案
防伪洗牌(dummy shuffling)
在[BU21]中提出的白盒环境下的防护手段之一。可以简单理解为:设置t个dummy slot和一个slot,dummy slot中运行随机函数,返回随机值,slot中运行真实的函数。
几种攻击方案
DCA(Differential Computation Analysis),针对白盒密码实现的一种较为高效的攻击手段。
HODCA(High-Order Differential Computation Analysis),针对线性掩码的攻击手段,遍历窗口内结点的异或(XOR)组合,把DCA攻击提升到高阶。
LDA(Linear Decoding Analysis),通过解线性方程组(其实就是窗口内结点的线性组合),可以把敏感变量解出来。
HDDA(Higher Degree Decoding Analysis),通过遍历窗口内结点的与(AND)组合,可以提高LDA攻击的次数。
把白盒问题抽象成LPN问题
掩码方案下
定义噪声率(noise rate)
τ
=
P
(
⨁
m
∈
M
m
(
x
)
=
1
)
\tau=\mathbb{P}(\bigoplus_{m\in\mathcal{M}}m(x)=1)
τ=P(⨁m∈Mm(x)=1)。
M
\mathcal{M}
M是掩码方案中次数大于1的项的集合。
举个例子就比较好理解:
如果一个掩码方案是这样的:
P
(
x
1
,
x
2
,
x
3
,
x
4
,
x
5
,
x
6
)
=
x
1
⊕
x
2
x
3
⊕
x
4
x
5
x
6
P(x_1,x_2,x_3,x_4,x_5,x_6)=x_1\oplus x_2x_3\oplus x_4x_5x_6
P(x1,x2,x3,x4,x5,x6)=x1⊕x2x3⊕x4x5x6,
那么这个掩码方案的噪声率为:
τ
=
P
(
x
2
x
3
⊕
x
4
x
5
x
6
=
1
)
=
P
(
x
2
x
3
=
1
)
P
(
x
4
x
5
x
6
=
0
)
+
P
(
x
2
x
3
=
0
)
P
(
x
4
x
5
x
6
=
1
)
=
5
/
16
\begin{aligned}\tau & =\mathbb{P}(x_2x_3\oplus x_4x_5x_6=1)\\ & =\mathbb{P}(x_2x_3=1)\mathbb{P}(x_4x_5x_6=0)+\mathbb{P}(x_2x_3=0)\mathbb{P}(x_4x_5x_6=1)=5/16\end{aligned}
τ=P(x2x3⊕x4x5x6=1)=P(x2x3=1)P(x4x5x6=0)+P(x2x3=0)P(x4x5x6=1)=5/16
定义了噪声率之后,就可以按照相关的算法来解LPN问题了。
dummy shuffling下
在[BU21]中提出的Dummy Shuffling,假设使用t个dummy slot,和一个true slot,即一共t+1个槽(slot)。在随机的状况下,噪声率为
τ
=
t
t
+
1
⋅
1
2
\tau=\frac{t}{t+1}\cdot\frac{1}{2}
τ=t+1t⋅21;在论文中提到的一种中间函数,可以让噪声率下降到
1
4
\frac{1}{4}
41,也就是
τ
=
t
t
+
1
⋅
1
4
\tau=\frac{t}{t+1}\cdot\frac{1}{4}
τ=t+1t⋅41.
所以在dummy shuffling的情况下,噪声率有一个区间范围,即
[
t
t
+
1
⋅
1
4
,
t
t
+
1
⋅
1
2
]
\left[\frac{t}{t+1}\cdot\frac{1}{4},\frac{t}{t+1}\cdot\frac{1}{2}\right]
[t+1t⋅41,t+1t⋅21]
同样,定义了噪声率之后,就可以按照相关的算法来解LPN问题了。
需要做出的改进以及优化
确定使用池化高斯算法了,但是需要对该算法进行一定的优化,以适配白盒环境。
具体的池化高斯算法可以参考论文内容
其中τ表示噪声率; W \mathcal{W} W代表LPN问题的维度,实际应用中也就是窗口的大小; α , β \alpha,\beta α,β分别是第一类错误和第二类错误。
避免异或节点(XOR nodes)
在采集的trace中,如果存在异或的节点,(比如在窗口中存在n1,n2,n3三个节点的值,并存在n1=n2+n3的关系)说明这些节点不是我们需要的,故需要把这些节点排除掉,就可以用较小的时间成本来构建可逆矩阵 M s M_s Ms。
添加停止条件
在实际编程过程中,需要添加停止条件,即添加找到可逆矩阵
M
s
M_s
Ms的尝试次数
A
\mathcal{A}
A。
设置找到可逆矩阵
M
s
M_s
Ms的概率为
p
n
f
m
p_{nfm}
pnfm,那么
p
n
f
m
=
1
−
(
1
−
(
1
−
τ
)
W
)
A
p_{\mathrm{nfm}}=1-(1-(1-\tau)^{\mathcal W})^{\mathcal A}
pnfm=1−(1−(1−τ)W)A,由此可以解得
A
=
ln
(
1
−
p
n
f
m
)
ln
(
1
−
(
1
−
τ
)
W
)
≈
−
ln
(
1
−
p
n
f
m
)
(
1
−
τ
)
W
\mathcal{A}=\frac{\ln(1-p_{\mathrm{nfm}})}{\ln(1-(1-\tau)^{\mathcal{W}})}\approx\frac{-\ln(1-p_{\mathrm{nfm}})}{(1-\tau)^{\mathcal{W}}}
A=ln(1−(1−τ)W)ln(1−pnfm)≈(1−τ)W−ln(1−pnfm)。
在论文提供的源码中,设置
p
n
f
m
=
0.999
p_{nfm}=0.999
pnfm=0.999,由此来计算
A
\mathcal{A}
A。
处理假阳性问题(false-positive)
算法中的
β
\beta
β是接受错误方案的概率,也就是第二类错误。但是在白盒环境下的应用,需要遍历密钥空间
K
\mathcal{K}
K,所以相应的
β
\beta
β也需要做出相应的调整。
β
=
1
K
∗
β
\beta=\frac{1}{\mathcal{K}}*\beta
β=K1∗β
用调整后的第二类错误概率带入算法进行运算。
所需的trace数量
PooledGauss算法中,需要W个方程进行运算,m个方程对运算结果进行验证。
所以在实际应用中需要的trace数量
T
=
m
+
W
T=m+\mathcal{W}
T=m+W。用
W
\mathcal{W}
W个trace来构建可逆矩阵并求解,用剩下的
T
−
W
T-\mathcal{W}
T−W个trace来对解进行验证。
优化算法
抽象来说,就是把向量的计算转化成矩阵的运算。矩阵运算可以用优化算法来做,能够使用时间复杂度较小的算法来计算。
具体来说:
拓展到整个密钥空间
K
\mathcal{K}
K上的话,就是:
整理一下变成矩阵的形式,把结果赋给矩阵E(这里的E不是单位矩阵)。
利用这个优化,就可以把矩阵计算的时间复杂度从O(n3)降低到O(n2.7)左右。
应用池化高斯算法(PooledGauss)解决白盒的LPN问题
结合PooledGauss算法和白盒密码的概况,提出了一种新的攻击手段WBLPN,具体算法如下:
由此可见,WBLPN对PooledGauss算法进行了一定的改进,以适配白盒环境。该算法的时间复杂度计算较为简单,不做说明。
与其他攻击方式的对比
与HDDA的对比
WBLPN依赖于噪声率的大小,而噪声率的大小依赖于掩码方案的高次项,即非线性项;HDDA需要遍历窗口内节点的高次组合的AND操作,以得到高次项掩码相与的值;故WBLPN和HDDA都依赖于掩码方案的非线性项,可以直接做对比。
τ = 1 2 \tau=\frac{1}{2} τ=21的时候,LPN问题几乎不能解,所以时间复杂度较高; τ = 1 4 \tau=\frac{1}{4} τ=41的时候,WBLPN的效率就比HDDA要好,但是由于噪声率较高,其实效果也不好。从 τ = 1 8 \tau=\frac{1}{8} τ=81开始,WBLPN就表现得比较好。
与HODCA的对比
但是HODCA依赖于掩码方案的线性部分,WBLPN依赖于非线性部分,所以不能按照同样的掩码次数或者阶数来作对比。所以论文直接把HODCA不同阶数的花费时间和WBLPN中掩码不同次数放在一张图里进行对比了。
若试图找到一种掩码方案使得两种攻击方案都不太好的话,从图中可以较为直观的看到:阶数和次数都为3的掩码方案,时间成本都不是特别好。即 P 3 , 3 P_{3,3} P3,3的掩码方案。
其他内容
抵抗WBLPN
上面提到的dummy shuffling方案,可以抽象为噪声率在 [ t t + 1 ⋅ 1 4 , t t + 1 ⋅ 1 2 ] \left[\frac{t}{t+1}\cdot\frac{1}{4},\frac{t}{t+1}\cdot\frac{1}{2}\right] [t+1t⋅41,t+1t⋅21]。但t趋向于无穷大时,噪声率在 [ 1 4 , 1 2 ] \left[\frac{1}{4},\frac{1}{2}\right] [41,21],通过实验可知,WBLPN在这个噪声率下的效率极低。故dummy shuffling是抵抗WBLPN的一周较为有效的手段,只需要增加dummy slot的个数即可。
想要抵抗WBLPN,主要思想就是提高掩码方案的噪声率(dummy shuffling也是这种思想)。所以有两种较为通用的方式提高噪声率:
先线性再非线性
先非线性再线性
这两种方式都可以通过提高掩码方案的噪声率来达到抵抗WBLPN的效果。
高阶WBLPN(HO-WBLPN)
然后针对有不同次数的掩码方案,提出了高阶的攻击方案。从WBLPN派生出HO-WBLPN的过程,跟从LDA派生出HDDA的效果一样,需要遍历窗口内的所有列的组合,把这些组合做AND操作,以在窗口中产生高次项的值。具体派生过程不再叙述。
重新定义了
O
\mathcal{O}
O阶的WBLPN的噪声率:
τ
O
=
P
x
∈
F
2
n
(
⨁
m
∈
M
O
m
(
x
)
=
1
)
\tau_{\mathcal{O}}=\mathbb{P}_{x\in\mathbb{F}_{2}^{n}}(\bigoplus_{m\in\mathcal{M}_{\mathcal{O}}}m(x)=1)
τO=Px∈F2n(⨁m∈MOm(x)=1)。类似的,
M
O
\mathcal{M}_{\mathcal{O}}
MO是高于
O
\mathcal{O}
O阶的掩码方案中的项数的集合,这些项异或起来等于1的概率,就是
O
\mathcal{O}
O阶WBLPN的噪声率。
具体算法如下:
把遍历其实用了一个trade-off,扩大窗口来降低时间复杂度。
HO-WBLPN的时间复杂度也不细说,仅仅是把时间复杂度中的O(
W
\mathcal{W}
W)换成O(
W
O
\mathcal{W}^{\mathcal{O}}
WO)即可。
总结
本篇论文把白盒密码抽象成了LPN问题,进而套用解LPN问题的方法,提出了一种新的攻击白盒密码实现的手段,在某些情况下比DCA和LDA的高阶形式效果要好。
参考论文
[SEL21]https://tches.iacr.org/index.php/TCHES/article/view/8788
[BU21]https://www.iacr.org/cryptodb/data/paper.php?pubkey=30823