Hybrid Homomorphic Encryption:SE + HE

(

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⨁n​Tk​
注意到函数直和的各个子函数的变量都是相互独立的,且函数求值结果是通过 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年网络安全全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。

img

img

img

img

img

既有适合小白学习的零基础资料,也有适合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%以上网络安全知识点!真正的体系化!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值