(
k
1
)
2
n_1,n_2,n,k,n_3 = \frac{nk(k+1)}{2}
n1,n2,n,k,n3=2nk(k+1) 是合适的整数,
F
(
x
0
,
⋯
,
x
n
1
n
2
n
3
−
1
)
=
L
n
1
⊕
Q
n
2
/
2
⊕
⨁
i
=
1
n
T
k
F(x_0,\cdots,x_{n_1+n_2+n_3-1}) = L_{n_1} \oplus Q_{n_2/2} \oplus \bigoplus_{i=1}^{n} T_k
F(x0,⋯,xn1+n2+n3−1)=Ln1⊕Qn2/2⊕i=1⨁nTk
注意到函数直和的各个子函数的变量都是相互独立的,且函数求值结果是通过 XOR 组合的,因此这个滤波器
F
F
F 的乘法深度很低。
对于随机置换的生成,可以使用 Knuth / Fisher–Yates shuffle Algorithm。如果它接入一个 true random generator,那么它生成的随机置换是等概率的。
from random import randint
def randomize (arr, n):
for i in range(n-1,0,-1): # From n downto 1
j = randint(0,i+1) # Pick a random index from 0 to i
arr[i],arr[j] = arr[j],arr[i] # Swap arr[i] with the element at random index
return arr
RtF Framework & HERA
[CHK+21] 注意到真实世界的数据主要是浮点数,但是 CKKS 和 SE 并不兼容
- CKKS 支持定点复数的带噪算术,SE 解密则需要精确的模运算。
- 如果把 SE 强行迁移到复数域上,由于 SE 本质上就是将消息
m
i
m_i
mi 经过某个带密钥的多项式求值为密文
c
i
c_i
ci,但是对于正确的密钥
k
k
k 总会有
∥
E
k
(
m
i
)
−
c
i
∥
2
=
0
|E_k(m_i)-c_i|_2 = 0
∥Ek(mi)−ci∥2=0,**这是以
k
k
k 为根的复数域多项式**。利用牛顿迭代法或者梯度下降法,容易求出近似的根。
他们提出了 RtF (Real-to-Finite-field) framework,组合使用 BFV 以及 CKKS,并设计了一个 BGV/BFV 友好的 SE 方案,称为 HERA。
RtF Framework
假设 BFV 的明文模数是
t
t
t,[CHK+21] 的思路是:将实数
m
∈
R
m \in \mathbb R
m∈R 缩放为
Z
t
\mathbb Z_t
Zt 中元素,然后使用某个
Z
t
\mathbb Z_t
Zt 上的 SE 加密它。于是可以使用 BFV 高效地解密 SE 密文,然后使用 CKKS 自举算法实现密文的切换。[CHK+21] 在 BFV 的 slot 上计算密钥流,在 BFV 的 coeff 上解密出消息,最后转换到 CKKS 的 slot 上计算函数。
框架为:
这里要求 BFV 和 CKKS 共享:分圆环维度
N
N
N、模数链
{
q
i
}
i
{q_i}_i
{qi}i、公私钥
(
p
k
,
s
k
)
(pk,sk)
(pk,sk)。假设 SE 密钥是
k
∈
Z
t
n
k \in \mathbb Z_t^n
k∈Ztn,我们要求
n
∣
l
n \mid l
n∣l,这里的
l
∣
N
l \mid N
l∣N 是 BFV 的明文槽个数,对应的 CKKS 也是子环
Y
=
X
N
/
l
Y=X^{N/l}
Y=XN/l 上的稀疏自举(明文槽个数为
l
/
2
l/2
l/2)。[CHK+21] 定义了密钥
k
k
k(列矢)的重复编码,
C
o
n
c
a
t
(
k
)
=
(
k
∥
k
∥
⋯
∥
k
)
∈
Z
t
n
×
B
Concat(k) = (k|k|\cdots|k) \in \mathbb Z_t^{n \times B}
Concat(k)=(k∥k∥⋯∥k)∈Ztn×B
并提出了两种 BFV 打包方式:
- column-wise packing,设置
B
=
l
/
n
B=l/n
B=l/n,把这个矩阵按列展开为
Z
t
l
\mathbb Z_t^l
Ztl 列矢,加密到单个 BFV 密文中。如果要计算
A
⋅
k
A \cdot k
A⋅k,其中
A
∈
Z
t
n
×
n
A \in \mathbb Z_t^{n \times n}
A∈Ztn×n,首先令
A
′
=
I
l
/
n
⊗
A
A’=I_{l/n} \otimes A
A′=Il/n⊗A,然后使用 BSBG 对角线方法(或者 Pegasus 的瓷砖算法),同时计算
l
/
n
l/n
l/n 个副本
A
⋅
k
A \cdot k
A⋅k,这需要 Rotate 操作。
- row-wise packing,设置
B
=
l
B = l
B=l,把这个矩阵的每个
Z
t
l
\mathbb Z_t^l
Ztl 行矢分别加密到
n
n
n 个 BFV 密文中。如果要计算
A
⋅
k
A \cdot k
A⋅k,其中
A
∈
Z
t
n
×
n
A \in \mathbb Z_t^{n \times n}
A∈Ztn×n,那么就简单计算
n
n
n 个密文的乘加(并行
l
l
l 个副本),不需要 Rotate 操作。
它们被用于 SE 在 HE 中的同态解密。[CHK+21] 采用任意的
Z
t
\mathbb Z_t
Zt 上流密码,算法为:
Client 将消息分组为
m
i
∈
R
n
m_i \in \mathbb R^n
mi∈Rn,编码到
Z
t
n
\mathbb Z_t^n
Ztn 上使用 SE 分别加密。对应的 Keystream 是根据
k
∈
Z
t
n
k \in \mathbb Z_t^n
k∈Ztn 以及
n
c
i
∈
{
0
,
1
}
λ
nc_i \in {0,1}^\lambda
nci∈{0,1}λ 生成的。Client 除了发送
k
k
k 的 HE 密文以及
m
i
m_i
mi 的 SE 密文外,还需要发送分别使用的 Nonce 给 Server 去同态重构密钥流。
HERA
[CHK+21] 设计了一种 FHE-friendly 流密码,叫做 HERA,它的自然运算是
Z
t
\mathbb Z_t
Zt 上的算术运算,且它的设计目标是乘法深度尽可能低(但是乘法复杂度会较高)。SE 的基本设计框架是:线性运算(扩散)、非线性运算(S-box,抵御求逆)、轮密钥加(带密钥的变换),如此重复若干轮。
[MJS+16] 使用了 randomized linear layers 以及很简单的非线性布尔函数,如果简单地将 FILP 迁移到
Z
t
\mathbb Z_t
Zt 上,由于 BFV 中的(常数)矩阵乘法的计算开销需要大量的 KS 操作,导致线性层的复杂度甚至比简单非线性层更高。为了减小线性层的开销,[CHK+21] 则是使用了 randomized key schedule(随机化的轮密钥编排)以及固定且稀疏的线性层,非线性运算使用了简单的立方函数,最终构造了 AES-like 的流密码(似乎就是 CTR 模式的分组密码?只是不需要求逆)
HERA 的构造如下,
对于密钥编排,HERA 使用 nonce 和 XOF 来生成随机串
r
c
=
(
r
c
0
,
r
c
1
,
⋯
,
r
c
r
)
∈
(
Z
t
16
)
r
1
rc=(rc_0,rc_1,\cdots,rc_r) \in (\mathbb Z_t{16}){r+1}
rc=(rc0,rc1,⋯,rcr)∈(Zt16)r+1,定义如下的轮密钥加,其中的
,
⋅
+, \cdot
+,⋅ 都是 component-wise 运算,
A
R
K
[
k
,
n
c
,
i
]
(
x
)
=
x
k
⋅
r
c
i
ARKk,nc,i = x + k \cdot rc_i
ARKk,nc,i=x+k⋅rci
对于线性层,HERA 使用 MDS matrix(Maximum Distance Separable)分别执行列混淆以及行混淆。MDS matrix 具有最大的分支数
n
1
n+1
n+1(branch number),因此具有很好的扩散性。
[CHK+21] 设置 HERA 的状态是
Z
t
4
×
4
\mathbb Z_t^{4 \times 4}
Zt4×4(排列 16 个数),于是直接使用了 AES 中的 MDS 矩阵(从
G
F
(
2
8
)
GF(2^8)
GF(28) 迁移到
Z
t
\mathbb Z_t
Zt),
对于非线性层,HERA 使用简单的立方函数
x
3
x^3
x3 作为 S-box,定义
C
u
b
e
(
x
)
=
(
x
0
3
,
x
1
3
,
⋯
,
x
15
3
)
Cube(x) = (x_0^3, x_13,\cdots,x_{15}3)
Cube(x)=(x03,x13,⋯,x153)
需要满足
gcd
(
3
,
t
−
1
)
=
1
\gcd(3,t-1)=1
gcd(3,t−1)=1,使得
x
3
x^3
x3 在
Z
t
∗
\mathbb Z_t^*
Zt∗ 上可逆,从而 S-box 是个双射。
对于加密模式,HERA 采用了 inner-counter mode,对于任意的
k
0
k>0
k>0,定义计数器
c
t
r
=
0
,
1
,
⋯
,
k
−
1
ctr = 0,1,\cdots,k-1
ctr=0,1,⋯,k−1,计算的密钥流是:
z
[
c
t
r
]
=
H
E
R
A
[
k
,
n
c
∥
c
t
r
]
(
i
c
)
z[ctr] = HERAk, nc|ctr
z[ctr]=HERAk,nc∥ctr
固定的常数向量
i
c
=
(
1
,
2
,
⋯
,
16
)
∈
Z
t
16
ic=(1,2,\cdots,16) \in \mathbb Z_t^{16}
ic=(1,2,⋯,16)∈Zt16,并要求
t
≥
17
t \ge 17
t≥17 是素数。
经过多种的现有攻击的分析,[CHK+21] 给出了一些实例化的参数集。为了实现
80
80
80 比特安全强度,迭代轮数为
r
=
4
r=4
r=4;为了实现
128
128
128 比特安全强度,迭代轮数为
r
=
5
r=5
r=5。
Noisy Symmetric Ciphers & Rubato
[HKL+22] 观察到 SE 和 HE 基于不同的安全原理,
- conventional SE 需要时间的检验,使用了关于 key 高次的多项式求逆
- LWE-based SE 基于困难问题和安全归约,使用 noise 抵御代数攻击
他们提出了两者的权衡,构造了新的 Rubato,它使用一个 low-degree keyed function
E
k
:
Z
q
n
→
Z
q
l
E_k: \mathbb Z_q^n \to \mathbb Z_q^l
Ek:Zqn→Zql,并假设形如
(
a
,
E
k
(
a
)
e
)
∈
Z
q
n
×
Z
q
l
(a, E_k(a)+e) \in \mathbb Z_q^n \times \mathbb Z_q^l
(a,Ek(a)+e)∈Zqn×Zql 的样本是计算均匀的,其中
a
a
a 由 XOF 生成,
e
e
e 是高斯噪声。为了分析它的安全性,需要同时使用 symmetric cryptanalysis 以及 LWE cryptanalysis(感觉 SE 的设计好随便啊)。这里的
q
q
q 是 RtF 框架中 BFV 的明文模数,而非密文模数。
Rubato 延续了 HERA 的设计结构(随机化密钥编排 + 固定的 MSD 矩阵),但不再使用 Cube 非线性层,而是使用了 [DGH+23] 所建议的另一种 Feistel-Like S-Box。由于这个 Feistel 求逆是简单的(次数很低,无法抵御 MITM 代数攻击),因此他们还采取了 [DGG+21] 的截断技术(直接丢弃部分信息,则求逆必须枚举)。
它直接采用了 HERA 的随机化密钥编排
A
R
K
[
k
,
n
c
,
i
]
(
x
)
=
x
k
⋅
r
c
i
ARKk,nc,i=x+k\cdot rc_i
ARKk,nc,i=x+k⋅rci,并推广了状态
x
∈
Z
q
n
x \in \mathbb Z_q^n
x∈Zqn 的大小为
n
=
v
2
n=v^2
n=v2(这里
q
q
q 是 HE 密文模数,而在 HERA 中使用的是
Z
t
16
\mathbb Z_t^{16}
Zt16 明文模数),使用 **v
v
v 阶 MSD 矩阵**去执行状态的混淆。为了计算效率,一般会寻找短的稀疏的 MSD 矩阵。Rubato 给出了
v
=
4
,
6
,
8
v=4,6,8
v=4,6,8 的选取建议,
对于非线性层,Rubato 使用了 Feistel Network via a Quadratic Function,定义为:
F
e
i
s
t
e
l
(
x
)
=
(
x
1
,
x
2
x
1
2
,
⋯
,
x
n
x
n
−
1
2
)
Feistel(x) = (x_1,x_2+x_1^2,\cdots, x_n+x_{n-1}^2)
Feistel(x)=(x1,x2+x12,⋯,xn+xn−12)
它是双射,且次数仅为
2
2
2,这比 Cube 的次数更低,并且混合了相邻的状态分量。这个 Feistel 的求逆很容易,为了抵御 MITM 代数攻击,执行完 AES-like 轮函数之后,还要执行截断函数
T
r
n
,
l
(
x
)
=
(
x
1
,
⋯
,
x
l
)
Tr_{n,l}(x) = (x_1,\cdots,x_l)
Trn,l(x)=(x1,⋯,xl) 以抵御求逆(并且密码设计中永远不执行求逆运算)。
在输出密钥流之前,采样离散高斯噪声
e
1
,
⋯
,
e
l
←
D
α
q
e_1,\cdots,e_l \gets \mathcal D_{\alpha q}
e1,⋯,el←Dαq,定义运算:
A
G
N
(
x
)
=
(
x
1
e
1
,
⋯
,
x
l
e
l
)
∈
Z
q
l
AGN(x) = (x_1+e_1,\cdots, x_l+e_l) \in \mathbb Z_q^l
AGN(x)=(x1+e1,⋯,xl+el)∈Zql
也就是说,Rubato 产生的密钥流是带噪的,它只能用于 RtF Framework 中(虽然是在 BFV 上解密,但最终是在 CKKS 上的近似运算),而不能用到精确的 FHE 上面。
Rubato 也采取了 inner-counter mode,密钥流是
z
[
c
t
r
]
=
R
u
b
a
t
o
[
k
.
n
c
∥
c
t
r
]
(
i
c
)
z[ctr] = Rubatok. nc|ctr
z[ctr]=Rubatok.nc∥ctr,其中
i
c
=
(
1
,
2
,
⋯
,
n
)
∈
Z
q
n
最后
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数网络安全工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年网络安全全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上网络安全知识点!真正的体系化!
如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
2
x
1
2
,
⋯
,
x
n
x
n
−
1
2
)
Feistel(x) = (x_1,x_2+x_1^2,\cdots, x_n+x_{n-1}^2)
Feistel(x)=(x1,x2+x12,⋯,xn+xn−12)
它是双射,且次数仅为
2
2
2,这比 Cube 的次数更低,并且混合了相邻的状态分量。这个 Feistel 的求逆很容易,为了抵御 MITM 代数攻击,执行完 AES-like 轮函数之后,还要执行截断函数
T
r
n
,
l
(
x
)
=
(
x
1
,
⋯
,
x
l
)
Tr_{n,l}(x) = (x_1,\cdots,x_l)
Trn,l(x)=(x1,⋯,xl) 以抵御求逆(并且密码设计中永远不执行求逆运算)。
在输出密钥流之前,采样离散高斯噪声
e
1
,
⋯
,
e
l
←
D
α
q
e_1,\cdots,e_l \gets \mathcal D_{\alpha q}
e1,⋯,el←Dαq,定义运算:
A
G
N
(
x
)
=
(
x
1
e
1
,
⋯
,
x
l
e
l
)
∈
Z
q
l
AGN(x) = (x_1+e_1,\cdots, x_l+e_l) \in \mathbb Z_q^l
AGN(x)=(x1+e1,⋯,xl+el)∈Zql
也就是说,Rubato 产生的密钥流是带噪的,它只能用于 RtF Framework 中(虽然是在 BFV 上解密,但最终是在 CKKS 上的近似运算),而不能用到精确的 FHE 上面。
Rubato 也采取了 inner-counter mode,密钥流是
z
[
c
t
r
]
=
R
u
b
a
t
o
[
k
.
n
c
∥
c
t
r
]
(
i
c
)
z[ctr] = Rubatok. nc|ctr
z[ctr]=Rubatok.nc∥ctr,其中
i
c
=
(
1
,
2
,
⋯
,
n
)
∈
Z
q
n
最后
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数网络安全工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年网络安全全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
[外链图片转存中…(img-oXxeP57G-1715490283188)]
[外链图片转存中…(img-KUCMlhWp-1715490283188)]
[外链图片转存中…(img-a2JFrUWG-1715490283189)]
[外链图片转存中…(img-xFmjBDoz-1715490283189)]
[外链图片转存中…(img-be0ZGsrU-1715490283189)]
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上网络安全知识点!真正的体系化!
如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!