格密码初学笔记

@格密码学习笔记 从初学到脱发

在学习格之前,也需要一些数论基础知识(还没更新到)

首先,我们为什么需要使用(学习)格密码?

格密码一般密码
可证明安全并非都可证明
安全基于最糟糕问题安全基于平均情况的困难
困难性基于格困难问题困难性基于整数分解,离散对数等
(暂时)不会被量子算法所破解已存在有效算法
计算开销少模指数,离散对数等计算开销大

注:

  1. 并非所有的现代密码都属于严格可证明安全
  2. 例如RSA等基于整数分解的问题,我们都知道n=pq是大素数就行,但是p,q的选择是一个很复杂的问题,因为其中一些素数组合对分解而言存在问题,这也是为什么我们会看到有些文中出现了安全素数这一概念,而随着数学家的深入研究,安全素数也并非绝对安全。可能我们所选取的整数分解中存在10%的漏洞,所以我们所采用的安全规约实际上是规约到平均难度上的。而格密码采用的是基于最糟糕情况的困难,也就是说,破解了一个问题,就能破解整个系统。这对于密码设计来说,我们能够更清楚的了解系统的安全性。
  3. 格困难问题研究时间向较于整数分解等出现时间短,其破解有限算法并不多。

格的基础知识

定义1: 格(Lattice) 给定 n n n个线性无关向量 b 1 , b 2 , … , b n ∈ R m b_1,b_2,\dots, b_n\in \mathbb{R}^m b1,b2,,bnRm,由该组向量产生的格被定义为,

L ( 1 , b 2 , … , b n ) = { ∑ x i b i ∣ x i ∈ Z } \mathcal{L}(_1,b_2,\dots, b_n)=\{\sum x_ib_i|x_i\in\mathbb{Z}\} L(1,b2,,bn)={xibixiZ}

我们通常将向量组 b 1 , b 2 , … , b n b_1,b_2,\dots, b_n b1,b2,,bn称为格的一组基,空间维数m为格的维,基向量个数n称为格的秩,同一个格可以有多组不同的基,但基的维数相同。当m=n时格是满秩的,一般只讨论满秩的格。

定义2: 格空间(Span) 格 L ( B ) \mathcal{L}(B) L(B)中基向量的所有线性组合(linear combinations)所形成的集合,就叫做这组基向量所构成的空间(SPAN),
s p a n ( L ( B ) ) = s p a n ( B ) = { B y ∣ y ∈ R n } . span(\mathcal{L}(B))=span(B)= \{ By|y\in\mathbb{R}^n \}. span(L(B))=span(B)={ByyRn}.
定义3: 格基础区域(Fundamental Parallelepiped).对于任意格基 B B B,定义
P ( B ) = { B x ∣ x ∈ R n , ∀ i : 0 ≤ x i < 1 } \mathcal{P}(B)=\{Bx|x\in\mathbb{R}^n,\forall i:0\le x_i \lt 1\} P(B)={BxxRn,i:0xi<1}

注意:由向量生成的基础区域不应该包含除原点外的任何顶点

引理1: Λ \Lambda Λ为秩为 n n n的格,设 b 1 , b 2 , … , b n ∈ Λ b_1,b_2,\dots, b_n\in \Lambda b1,b2,,bnΛ n n n个线性无关的格向量。其中, b 1 , b 2 , … , b n b_1,b_2,\dots, b_n b1,b2,,bn表示为 Λ \Lambda Λ的基,当且仅当 P ( b 1 , b 2 , … , b n ) ⋂ Λ = 0 \mathcal{P}(b_1,b_2,\dots, b_n) \bigcap \Lambda=0 P(b1,b2,,bn)Λ=0.

  • Λ \Lambda Λ是所有整数线性组合的集合。
  • P ( b 1 , b 2 , … , b n ) \mathcal{P}(b_1,b_2,\dots, b_n) P(b1,b2,,bn)被定义为 b 1 , b 2 , … , b n b_1,b_2,\dots, b_n b1,b2,,bn线性组合的集合,其系数取值在 [ 0 , 1 ) [0,1) [0,1)中。

所以,这两个集合的交集是{0}。

定义4: 幺模矩阵(unimodular matrix). 假设矩阵 U ∈ Z n × n U\in \mathbb{Z}^{n\times n} UZn×n,且 ∣ U ∣ = ± 1 |U|=\pm1 U=±1,则称 U U U为幺模矩阵。例如矩阵
( 1 1 1 0 ) \begin{pmatrix} 1 &1 \\1&0 \end{pmatrix} (1110)

引理2 如果 U U U是幺模矩阵,则 U − 1 U^{-1} U1也是幺模矩阵。

引理3 若两个格基 B 1 , B 2 ∈ R n × n B_1,B_2 \in \mathbb{R}^{n \times n} B1,B2Rn×n 等价,当且仅当 B 2 = B 1 U B_2=B_1U B2=B1U,其中 U U U表示某个特定幺模矩阵。

这一步我们可以换个思路来理解,将幺模矩阵理解为一种的初等行变换的形式,而这样的变换不会改变行列式的特征值。
因此 我们可以得到:

引理4 两个格基 b i , b j b_i,b_j bi,bj等价时,当且仅当一个可以通过以下操作得到另一个格基:

  1. b i ← b i + k b j b_i \leftarrow b_i+kb_j bibi+kbj,其中 k ∈ Z k\in\mathbb{Z} kZ
  2. b i    ⟺    b j b_i \iff b_j bibj
  3. b i ← − b j b_i \leftarrow -b_j bibj

定义5 行列式(Determinant). 设 Λ = L ( B ) \Lambda=\mathcal{L}(B) Λ=L(B)为秩 n n n的格。定义 Λ \Lambda Λ的行列式为 d e t ( Λ ) det(\Lambda) det(Λ),作为 P ( B ) \mathcal{P}(B) P(B) n n n维度体积。 d e t ( Λ ) : = d e t ( B T B ) det(\Lambda):=\sqrt{det(B^TB)} det(Λ):=det(BTB) 。在 Λ \Lambda Λ是满格的情况下, B B B是方阵,则有 d e t ( Λ ) = ∣ d e t ( B ) ∣ det(\Lambda)=|det(B)| det(Λ)=det(B)

行列式代表了多面体的体积,也代表了格点的密度。

定义6 连续极小 (Successive Minima),令 λ 1 ( L ) \lambda_1(\mathcal{L}) λ1(L)表示为格 L \mathcal{L} L中( ℓ 2 \ell_2 2)长度的最短的非零向量集合。

定义7: 施密特正交化(Schmidt orthogonalization)是求欧氏空间正交基的一种方法。从欧氏空间任意线性无关的向量组α1,α2,……,αm出发,求得正交向量组β1,β2,……,βm,使由α1,α2,……,αm与向量组β1,β2,……,βm等价,再将正交向量组中每个向量经过单位化,就得到一个标准正交向量组,这种方法称为施密特正交化。
在这里插入图片描述

这种方法输出了一个正交向量的集合。且经过施密特正交基可以生成一个基本区域(fundamental region

引理1: ( v 1 , … , v n ) (v_1,\dots,v_n) (v1,,vn)所组成的格的行列式为 ∏ ∣ ∣ v i ~ ∣ ∣ \prod||\tilde{v_i}|| ∣∣vi~∣∣.
引理2: λ 1 \lambda_1 λ1 的下界为 m i n ∣ ∣ v i ~ ∣ ∣ min ||\tilde{v_i}|| min∣∣vi~∣∣

Blichfeld’s Theorem: 对于任意一个格 L \mathcal{L} L和体积大于 d e t ( L ) det(\mathcal{L}) det(L)集合 S S S,存在 z 1 , z 2 ∈ S , z 1 ≠ z 2 z_1,z_2 \in S,z_1 \ne z_2 z1,z2S,z1=z2 z 1 − z 2 ∈ L z_1-z_2 \in \mathcal{L} z1z2L
在这里插入图片描述
这个比较好理解,若图中袋鼠的体积大于基本区域,那么我们按照格向量平移后,他会存在与相邻两个图像的交点,这两个交点的差便是我们的平移向量。

Minkowsi’s Theorem: 对任意的格 L \mathcal{L} L和关于原点对称的凸集合 S S S,且 S S S的体积大于 2 n d e t ( L ) 2^ndet(\mathcal{L}) 2ndet(L) S S S中一定存在一个格点。
在这里插入图片描述
我们先将这个多边形缩小 2 n 2^n 2n倍(每个维度缩小2倍,即仍然满足小多边形 S ′ S' S的体积大于 d e t ( L ) det(\mathcal{L}) det(L)),我们从Blichfeld’s Theorem可得 S ′ S' S中一定存在 z 1 − z 2 z_1-z_2 z1z2为格向量,当我们把 z 1 z_1 z1 z 2 z_2 z2放大2倍后,可知 2 z 1 , 2 z 2 2z_1,2z_2 2z1,2z2在大集合 S S S里面,取 2 z 1 − 2 z 2 2z_1-2z_2 2z12z2向量的平均值一定也在 S S S中,所以红点一定是格点。

推论: 对任意的格 L \mathcal{L} L λ 1 ( L ) ≤ n ⋅ d e t ( L ) 1 n \lambda_1(\mathcal{L}) \le \sqrt{n}\cdot det(\mathcal{L})^{\frac{1}{n}} λ1(L)n det(L)n1

从上面可以看出格的定义和向量空间类似,但通过基生成向量时要求整数系数。这一点使得格在几何上由离散且呈周期性结构的点构成,这大概也是“格”这个名字的由来。具备直观感受的格的维度是2或者3,即可对应生活中可感知的几何空间,但在密码学中为了达到足够安全性,格的维度一般在1000左右。

格上困难问题

最短向量问题 SVP

最短向量问题即,给定格的一个基,在格中找到一个非零向量,其长度在所有非零格向量上最短。

这里的长度我们用欧几里德范数表示,也可以称作 ℓ 2 \ell_2 2范数,定义为 ∥ x ∥ 2 = ∑ x i 2 \|x\|_2 = \sqrt {\sum x_i^2} x2=xi2 。通常,我们会直接用 ∥ x ∥ \|x\| x表示 ℓ 2 \ell_2 2范数。但是,有一些情况,我们也会使用到其他的范数,如 ℓ 1 \ell_1 1范数( ∥ x ∥ 1 = ∑ ∣ x i ∣ \|x\|_1 = \sum |x_i| x1=xi)和 ℓ ∞ \ell_\infin 范数( ∥ x ∥ ∞ = m a x { ∣ x i ∣ } \|x\|_\infin = max\{ |x_i|\} x=max{xi})。

  • 最短向量问题(Shortest Vector Problem,SVP): 给定格基 B ∈ Z m × n B\in\mathbb{Z}^{m \times n} BZm×n ,找一个非零向量 v v v,满足 ∀ u ∈ L ( B ) \forall u\in \mathcal{L(B)} uL(B),都有 ∥ v ∥ ≤ ∥ u ∥ \|v\|\le\|u\| vu
  • γ − \gamma- γ近似最短问题(SVP- γ \gamma γ): 给定格基 B ∈ Z m × n B\in\mathbb{Z}^{m \times n} BZm×n ,找一个非零向量 v v v,满足 ∀ u ∈ L ( B ) \forall u\in \mathcal{L(B)} uL(B),都有 ∥ v ∥ ≤ γ ∥ u ∥ \|v\|\le\gamma\|u\| vγu
  • G a p S V P γ GapSVP_\gamma GapSVPγ:给定格基后,判定 λ 1 \lambda_1 λ1是否小于1或大于 γ \gamma γ
  • S I V P γ SIVP_\gamma SIVPγ(最短独立向量问题):给定矩阵 B B B,找出 n n n L ( B ) \mathcal{L}(B) L(B)中长度小于等于 γ λ n ( L ( B ) ) \gamma\lambda_n(\mathcal{L}(B)) γλn(L(B))线性无关的向量
  • 逐次最小长度问题(Successive Minima Problem,SMP)

以上这些概念,都源于刚说的空间内放置球体的问题。确定球的最大格堆积密度(堆积半径下体积/容积)等价于求格的最短向量(SVP)长度,确定球的最小格覆盖密度(覆盖密度下体积/容积)则等价于求到格点的最近距离(CVP)。

最近向量问题 CVP

给定一个格基和一个目标向量,找到离目标点最近的格点。

  • C V P γ CVP_\gamma CVPγ:给定格 B B B和点 v v v,找出里点 v v v最近的一个格点,且距离小于系数 γ \gamma γ
  • Decisional CVP:假设格基 B ∈ Z m × n B\in\mathbb{Z}^{m\times n} BZm×n,目标向量为 t ∈ Z m t\in\mathbb{Z}^m tZm,有理数 r ∈ Q r\in\mathbb{Q} rQ,判断 d i s t ( t , L ( B ) ) dist(t,\mathcal{L}(B)) dist(t,L(B))是否正确。
  • Optimization CVP:给定一个格基 B ∈ Z m × n B\in\mathbb{Z}^{m \times n} BZm×n和目标向量 t ∈ Z m t \in \mathbb{Z}^{m} tZm,找到 d i s t ( t , L ( B ) ) dist(t,\mathcal{L}(B)) dist(t,L(B))
  • Search CVP:给定格基 B ∈ Z m × n B \in \mathbb{Z}^{m \times n} BZm×n和目标向量 t ∈ Z m t \in \mathbb{Z}^{m} tZm,使得 ∣ ∣ B x − t ∣ ∣ ||Bx-t|| ∣∣Bxt∣∣最小。

注:对于任意近似影子 γ \gamma γ而言,SVP问题不比CVP问题难。也就是说,如果你能够解决CVP问题,那么你也能在近似因子等于10的条件下解决SVP问题。

BDD困难问题

BDD(Bounded Distance Decoding):给出一个点 v v v已经是与格点很近( l e n g t h < λ 1 ( L ( B ) length<\lambda_1(\mathcal{L}(B) length<λ1(L(B)/2)的点,找出最近的格点(这个格点只有一个解)

LWE困难问题

照着知乎大佬Steven Yue的博客定义:LWE的search版本定义如下:
LWE(learning With Error):
我也不知道这篇我看懂没得,我就在里面再消化。
若我们已知一个矩阵 A x = b Ax=b Ax=b,我们可以利用高斯消元的过程,很快的进行求解对吧。那如果我们加入噪音呢?即给出 b ^ = A x + e \hat{b}=Ax+e b^=Ax+e。其中 e e e暂时理解为普通噪音,那么是否能够通过 b ^ \hat{b} b^和矩阵 A A A求得未知向量 x x x。因为噪音的缘故,再利用高斯消元法可能导致最终的结果相差甚远,所以我们能做的也就只有通过暴力破解,不断的代入我们猜测的 x ^ \hat{x} x^然后减去 b ^ \hat{b} b^ A x + e − A x ^ Ax+e-A\hat{x} Ax+eAx^)看得到的值是否足够小。

ps.如果我们把这里的 A A A看做格基, b ^ \hat{b} b^看做目标向量,而 e e e是一个极小值,求格点 x x x。给定格基和目标向量,求距离目标最近的格点。还是有点像CVP问题哈。

当然,上面是Search版本。作为公钥密码而言,一般会利用Decisional版本。Search和Decisional版本的区别是什么呢?个人理解而言,search版本我们是search
x x x这一个值,即求解。而Decisional版本类似密文不可区分性?也就是说,给定了一个LWE实例 A s + e As+e As+e,我们区分这个是随机产生的还是由矩阵 A A A产生的。

经典算法

Regev算法

  • K e y G e n ( 1 λ ) KeyGen(1^\lambda) KeyGen(1λ):通过安全参数 λ \lambda λ确定 n n n,然后依次算出 m , q , B m,q,B m,q,B(因为 m , q , B m,q,B m,q,B的生成通常关于一个 P o l y ( n ) Poly(n) Poly(n))。然后随机算去LWE问题所需的举证 A ← Z q m × n , s ← Z q n , e ← x B m A \leftarrow \mathbb{Z}_q^{m\times n},s \leftarrow \mathbb{Z}_q^{n},e \leftarrow x_B^{m} AZqm×n,sZqn,exBm,并计算误差乘积 b = A s + e b=As+e b=As+e。此外,这里的 B B B必须满足 m B < q / 4 mB<q/4 mB<q/4。最后,程序输出私钥 s k = s sk=s sk=s,公钥 p k = ( A , B ) pk=(A,B) pk=(A,B)
  • E n c ( p k , x ∈ { 0 , 1 } ) Enc(pk,x\in\{0,1\}) Enc(pk,x{0,1}):注意到,Regev算法只针对了一个比特位。首先,我们随机选取一个nonce向量 r ← Z 2 m r \leftarrow \mathbb{Z}_2^{m} rZ2m(即由0-1比特构成的m*1的向量),然后计算出密文的第一部分 c 0 ← r T A c_0 \leftarrow r^TA c0rTA。随后计算出密文第二部分 c 1 ← r T b + ⌊ q / 2 ⌋ x c_1 \leftarrow r^Tb+\lfloor q/2 \rfloor x c1rTb+q/2x。最后输出密文 c = ( c 0 , c 1 ) c=(c_0,c_1) c=(c0,c1)
  • D e c ( s k , c ) Dec(sk,c) Dec(sk,c):在解密阶段,我们只需要计算 x ^ = c 1 − c 0 s = r T e + ⌊ q / 2 ⌋ ⋅ x \hat{x} = c_1-c_0s=r^Te+\lfloor q/2 \rfloor \cdot x x^=c1c0s=rTe+q/2x。由于 r r r的取值是由0-1比特构成的m*1的向量,而 e e e的取值范围是 x B m x_B^{m} xBm。所以 r T e < m B < q / 4 r^Te<mB<q/4 rTe<mB<q/4。当 ∣ x ^ ∣ < q / 4 |\hat{x}|<q/4 x^<q/4时, x = 0 x=0 x=0,反之, x = 1 x=1 x=1;

则此处的安全证明可以归结到 A s + e As+e As+e v v v不可区分的DLWE困难问题上。

GSW加密

GSW 方案整体思想:近似特征向量技术

我们回顾一下线性代数中特征向量与特征值特性:
C C C n n n阶方阵,如果存在数 μ \mu μ非零 n n n维向量 x x x,使得 C x = μ x Cx=\mu x Cx=μx,则称 μ \mu μ A A A的一个特征值。非零 n n n维向量 x x x称为矩阵 C C C的属于特征值 m m m的特征向量。

若我们将 C C C看做密文, x x x看做私钥, μ \mu μ看做明文。实际上,上述的等式还满足乘法同态和加法同态,这就可以当做一个完美的全同态的方式。但是,这完全脱离了加密,因为 μ \mu μ完全可以通过在 C C C上使用高斯消元的方法获得。

与Regev加密相同,我们在该加密中添加入噪声。形成以下形式: C x = μ x + e   m o d   q Cx=\mu x+e\,mod\,q Cx=μx+emodq

我们再来测试其同态特性:
加法同态:
( C 1 + C 2 ) x = C 1 x + C 2 x = ( μ 1 + μ 2 ) x + e 1 + e 2 (C_1 +C_2)x = C_1x+C_2x=(\mu_1+\mu_2)x+e_1+e_2 (C1+C2)x=C1x+C2x=(μ1+μ2)x+e1+e2
这里虽然出现了 e 1 + e 2 e_1+e_2 e1+e2,但是因为噪音很小 可以忽略掉。
乘法同态:
C 1 C 2 ⋅ x = C 1 ( C 2 ⋅ x ) = C 1 ( μ 2 x + e ) = μ 1 μ 2 x + μ 2 e 1 + C 1 e 2 C_1C_2\cdot x=C_1(C_2\cdot x)=C_1(\mu_2x+e)=\mu_1\mu_2x+\mu_2e_1+C_1e_2 C1C2x=C1(C2x)=C1(μ2x+e)=μ1μ2x+μ2e1+C1e2
但是这里的乘法就出现问题了。
因为 μ 2 ∈ Z q \mu_2 \in Z_q μ2Zq,而 C C C的大小可能会在计算过程中变得很大。所以作者提出了一种 Flatten ciphertext技术。
其本质就是将密文的“体量” 在乘法进行扩张,降低噪音对单bit的影响。 这句话是我的个人理解,合不合理还需要大佬论证。 ^~^

在介绍方案前,我们先定义一些符号与函数

  • a ∈ Z q k a \in Z^k_q aZqk
  • l = ⌊ l o g 2 q ⌋ + 1 l=\lfloor log_2q\rfloor+1 l=log2q+1
  • N = k ⋅ l N=k\cdot l N=kl
    函数:
  • B i t D e c o m p ( a ) = ( a 1 , 0 , … , a 1 , l − 1 , … , a k , 0 , … , a k , l − 1 ) BitDecomp(a)=(a_{1,0},\dots,a_{1,l-1},\dots,a_{k,0},\dots,a_{k,l-1}) BitDecomp(a)=(a1,0,,a1,l1,,ak,0,,ak,l1),其中 a i , j a_{i,j} ai,j a i a_i ai二进制的低位开始的第 j j j位。
  • B i t D e c o m p − 1 ( b ) = ( ∑ j 2 j b 1 , j   m o d   q , … , ∑ j 2 j b k , j   m o d   q ) BitDecomp^{-1}(b)=(\sum_j2^jb_{1,j}\,mod\,q,\dots,\sum_j2^jb_{k,j}\,mod\,q) BitDecomp1(b)=(j2jb1,jmodq,,j2jbk,jmodq),实际上是将 B i t D e c o m p BitDecomp BitDecomp的扩张的二进制缩回正常的10进制。
  • F l a t t e n ( b ) = B i t D e c o m p ( B i t D e c o m p − 1 ( b ) ) Flatten(b)=BitDecomp(BitDecomp^{-1}(b)) Flatten(b)=BitDecomp(BitDecomp1(b)) 这里是精髓部分,因为二进制向量每个bit位在进行操作后会被放大,我们将其恢复成十进制在重新转换成扩张的二进制。说白了就是你的操作虽然是在二进制向量下的,但是因为向量不会自己进位,所以需要有这一步骤。
  • P o w e r s o f 2 ( s ) = ( s 1 , 2 s 1 , … , 2 l − 1 , … , s k , 2 s k , … , 2 l − 1 s k )   m o d   q Powersof2(s)=(s_1,2s_1,\dots,2^{l-1},\dots,s_k,2s_k,\dots,2^{l-1}s_k)\,mod\,q Powersof2(s)=(s1,2s1,,2l1,,sk,2sk,,2l1sk)modq,这里的函数其实就是对应函数 B i t D e c o m p BitDecomp BitDecomp保证其乘法操作在10进制下的正确性。

对上面函数左用比较模糊?看看下面:

  • 对于 ∀ a , s ∈ Z q k \forall a , s ∈ Z_q^k a,sZqk​,有
    B i t D e c o m p ( a ) ⋅ P o w e r s o f 2 ( s ) = ( a ⋅ s ) BitDecomp(a)\cdot Powersof2(s) =(a\cdot s) BitDecomp(a)Powersof2(s)=(as)
  • 对于 $\forall a ∈ Z_q^N 以及 以及 以及 s ∈ Z_q^k$​,有
    a ⋅ P o w e r s o f 2 ( s ) = B i t D e c o m p − 1 ( a ) ⋅ s a \cdot Powersof2(s) = BitDecomp^{-1}(a) \cdot s aPowersof2(s)=BitDecomp1(a)s

那我们就开始方案部分:

  • S e t u p ( 1 n , 1 L ) : Setup(1^n,1^L): Setup(1n,1L): 选择一个模数 q q q,其中 ∣ q ∣ = κ ( λ , L ) |q|=\kappa(\lambda,L) q=κ(λ,L)比特,格基的维度 n = n ( λ , L ) n=n(\lambda,L) n=n(λ,L),以及适用于针对已知攻击至少达到 2 λ 2^{\lambda} 2λ的LWE噪音分布 χ = χ ( λ , L ) \chi=\chi(\lambda,L) χ=χ(λ,L),此外,选择参数 m = m ( λ , L ) = O ( n l o g q ) m=m(\lambda,L)=O(nlogq) m=m(λ,L)=O(nlogq)。公共参数 p a r a m s = ( n , q , χ , m ) params=(n,q,\chi,m) params=(n,q,χ,m),令 l = ⌊ l o g q ⌋ + 1 l=\lfloor log q\rfloor+1 l=logq+1 N = ( n + 1 ) ⋅ l N=(n+1)\cdot l N=(n+1)l
  • S K G e n ( p a r a m s ) : SKGen(params): SKGen(params): t ⃗ ← Z q n \vec{t} \leftarrow Z^n_q t Zqn。输出 s k = s ⃗ ← ( 1 , − t 1 , ← , − t n ) ∈ Z q n + 1 sk=\vec{s}\leftarrow(1,-t_1,\leftarrow,-t_n)\in Z^{n+1}_q sk=s (1,t1,,tn)Zqn+1,令 v ⃗ = P o w e r s o f 2 ( s ⃗ ) \vec{v}=Powersof2(\vec{s}) v =Powersof2(s )
  • P K G e n ( p a r a m s , s k ) : PKGen(params,sk): PKGen(params,sk):均匀的生成一个矩阵 B ← Z q m × n B\leftarrow Z^{m\times n}_q BZqm×n和一个噪音向量 e ⃗ ← χ m \vec{e}\leftarrow \chi^{m} e χm。令 b ⃗ = B ⋅ t ⃗ + e ⃗ \vec{b}=B\cdot \vec{t}+\vec{e} b =Bt +e 。令公钥 p k = A = [ b ⃗ ∣ B ] pk=A=[\vec{b}|B] pk=A=[b B](注意:Av=e)
  • E n c ( p a r a m s , p k , μ ) : Enc(params,pk,\mu): Enc(params,pk,μ): 这里的消息 μ ∈ Z q \mu\in Z_q μZq,并均匀生成一个矩阵 R ∈ { 0 , 1 } N × m R\in\{0,1\}^{N \times m} R{0,1}N×m,并输出C: C = F l a t t e n ( μ ⋅ I N + B i t D e c o m p ( R ⋅ A ) ) ∈ Z q N × N C=Flatten(\mu\cdot I_N+BitDecomp(R \cdot A))\in Z^{N \times N}_q C=Flatten(μIN+BitDecomp(RA))ZqN×N
  • D e c ( ( p a r a m s , s k , C ) : Dec((params, sk, C): Dec((params,sk,C):计算 x i ← < C i , v ⃗ > x_i \leftarrow <C_i,\vec{v}> xi←<Ci,v >。输出 μ ′ = ⌊ x i / v i ⌉ \mu'=\lfloor x_i/v_i \rceil μ=xi/vi

BFV加密方案

预备知识

多项式环

在数论基础知识中简单介绍了环的概念,这里我们应用的是多项式环的概念。首先,我们先回顾环的概念。
环: 设R是一个非空集合,在 R R R上定义了加法和乘法两种代数运算,分别记为“+”和“·”。如果 R R R具有如下性质:

  1. R R R对于加法是一个交换群。
    a. R R R关于加法封闭,即任意元素 a , b ∈ R a,b \in R a,bR,有 a ⋅ b ∈ R a \cdot b \in R abR
    b. R R R关于加法结合律成立。即对于 R R R中任意元素 a + ( b + c ) = ( a + b ) + c a+(b+c)=(a+b)+c a+(b+c)=(a+b)+c
    c. R R R存在单位元。即 R R R中存在一个元素 e e e R R R中任意元素 a a a满足 a + e = a a+e=a a+e=a
    d. R R R中存在逆元。对 R R R中任意元素 a a a, R R R存中都存在一个元素 b b b使得 a + b = e a+ b =e a+b=e
    f. R R R关于加法满足交换律, a + b = b + a a+b=b+a a+b=b+a
  2. R R R对于乘法封闭。
  3. 乘法满足结合律。即对于即对于 R R R中任意元素 a ⋅ ( b ⋅ c ) = ( a ⋅ b ) ⋅ c a\cdot(b\cdot c)=(a\cdot b)\cdot c a(bc)=(ab)c
  4. 分配律成立,即对于 R R R中任意元素 有 a ⋅ ( b + c ) = a ⋅ b + a ⋅ c a\cdot(b+c)=a\cdot b+a\cdot c a(b+c)=ab+ac
    则称 ( R , + , ⋅ ) (R,+,\cdot) (R,+,)为一个环。

我们再来对比多项式环:

多项式环: R R R是一个有单位元 1 1 1的交换环, x x x R R R上的一个未定元, a 0 , a 1 , … , a n ∈ R a_0,a_1,\dots,a_n \in R a0,a1,,anR, 则称 f ( x ) = a 0 + a 1 x + ⋯ + a n x n f(x)=a_0+a_1x+\dots+a_nx^n f(x)=a0+a1x++anxn是环 R R R x x x的一个多项式。其中, a i x i a_ix^i aixi被称为 f ( x ) f(x) f(x) i i i次项, a i a_i ai被称为 i i i次项系数,若 a n ≠ 0 a_n\neq0 an=0,则称 f ( x ) f(x) f(x)的次数为 n n n,记作 d e g ( f ( x ) ) = n deg(f(x))=n deg(f(x))=n.

感谢以下大佬的学习笔记 让我能看懂理解与消化,有疑惑的地方也可以看以下大佬的笔记
跳转链接: 小北极星笔记. 知乎-六三. 刘巍然-学酥的夏令营视频 Steven Yue学习笔记

  • 3
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值