首先简要介绍一下什么是全同态加密:同态加密是上世纪80年代提出来的一种密码学技术:对经过同态加密的数据进行处理得到一个输出,将这一输出进行解密,其结果与用同一方法处理未加密的原始数据得到的输出结果是一样的。
传统加密大致有密钥生成、加密、解密三个关键步骤:
同态加密相比传统加密最核心的部分在于它的 评估操作(Evaluation) 使得对加密的密文进的运算相当于对对应的明文进行了运算。
如果这个函数 f 是加法,则称这个同态加密是加同态,如果这个函数 f 是乘法,则称这个同态加密是乘同态。加同态和乘同态都是半同态。如果一个算法能够同时满足加法同态和乘法同态,那么我们称之为全同态算法。2009年Gentry首次提出了基于理想格的全同态加密算法,称之为[Gentry09]或[Ge09]。
全同态加密允许在不知道数据(加密)的情况下对数据进行计算,这使得用户可以将自己需要计算的数据同态加密后加密发送给云,云能够在同态加密的数据上进行计算,随后将结果(密文)返回给用户,用户解密得到计算结果。
全同态算法在2013年左右大致分为两个大类,一类为 BGV方案,另一类为 GSW方案,而TFHE属于类GSW分支,并且是FHEW方案的一个改进,TFHE方案是目前最快的全同态加密方案。
众所周知,全同态加密是有噪声(error)的。假设有一布尔电路如下图:
在明文状态下评估该布尔电路,没有任何问题:
然而,在若要在全同态加密的密文状态下评估该布尔电路(这里给你一个神奇的透视镜,让你能够看到加密密文里面加密的明文,越清晰说明噪声越小,越模糊说明噪声越大),不但评估时间变得十分漫长,噪声也随着经过的门电路的数量增加而增长,如果经过过多的门电路,则很可能导致最终的解密错误(解密后无法分辨0和1)。
想要解决同态加密中的噪声问题,目前有如下两种途径:
LHE 和 Bootstrapping 两种方案各有优缺点:
层次全同态(LHE) | 层次全同态(LHE) | 自举(Bootstrapping) | 自举(Bootstrapping) |
---|---|---|---|
优点 | 缺点 | 优点 | 缺点 |
在深度(depth)小的电路上很快 | 在很深的电路中不现实 | 深度没有限制 | 非常非常非常慢 |
不能实现不事先知道电路深度的电路 | 密钥很大 |
TFHE在 LHE 方案和 Bootstrapping 方案中都实现了一定的改进,接下来详细介绍TFHE。
TFHE全称为:Fully Homomorphic Encryption over the Torus。FHE代表全同态加密,而T代表环面(Torus)。因此,想了解TFHE,在了解什么是FHE后,还要了解什么是环面。
环面大概长下面这张图的样子,像一个甜甜圈(by Ilaria Chillotti):
实数环面 The real torus T = R / Z = R m o d 1 {\color{blue}\mathbb T}=\mathbb R / {\color{red}\mathbb Z} = \mathbb R \quad mod\quad1 T=R/Z=Rmod1
我们把一个实数环面记为( T , + , ⋅ ) {\color{blue}\mathbb T},{\color{blue}+},\sdot) T,+,⋅)的形式 ( ⋅ : Z × T → T (\sdot:{\color{red}\mathbb Z}\times {\color{blue}\mathbb T}\rightarrow{\color{blue}\mathbb T} (⋅:Z×T→T a valid external product)。括号中的 T {\color{blue}\mathbb T} T表示数据是环面里面的结构, + {\color{blue}+} +和 ⋅ \sdot ⋅两种运算(或者说两种映射)。其中 + {\color{blue}+} +(加法)类似我们平时用的加法, ⋅ \sdot ⋅(数乘)是一个从 Z {\color{red}\mathbb Z} Z和 T {\color{blue}\mathbb T} T到 T {\color{blue}\mathbb T} T的映射(外积),这里的 Z {\color{red}\mathbb Z} Z表示整数集。
下面我用蓝色表示环面 T {\color{blue}\mathbb T} T里面的元素,用红色表示整数域 Z {\color{red}\mathbb Z} Z里面的元素。
实数环面有三条性质:
我们可以把实数的环面扩展到n维向量或矩阵空间:( T n , + , ⋅ {\color{blue}\mathbb T^n},{\color{blue}+},\sdot Tn,+,⋅),它同样拥有 Z-module 结构。
我们还可以定义多项式环面:( T N [ X ] , + , ⋅ {\color{blue}\mathbb T_N[X]},{\color{blue}+},\sdot TN[X],+,⋅),它有 R {\color{red}\mathfrak R} R-module 的结构(其中 R = Z [ X ] / ( X N + 1 ) , T N [ X ] = T [ X ] m o d ( X N + 1 ) {\color{red}\mathfrak R}=\mathbb Z [X]/(X^N+1),{\color{blue}\mathbb T_N[X]}={\color{blue}\mathbb T[X]}\quad mod \quad (X^N+1) R=Z[X]/(XN+1),TN[X]=T[X]mod(XN+1))。下面用红色表示 R {\color{red}\mathfrak R} R中元素:
加密步骤:
这虽然是LWE困难问题,却没有LWE中的 mod q q q 操作(实数环中 mod 1)。
TLWE密文具有同态性质,在密文上进行线性组合,其对应明文也会做相应的线性组合,噪声也随之增加。换句话说,我们对TLWE上的元素做一个线性组合,那它们的 a a a和 b b b也会有相应的线性关系,如果我们把它解密, φ \varphi φ也会有同样的关系。因为我们添加的噪声是高斯噪声,我们对 φ \varphi φ求平均得到消息 μ \mu μ,也会满足这个关系。这是环面上自带的加同态的性质,对于全同态加密的设计来说是一个很好的性质。
除TLWE密文外,TFHE方案中还有两种密文:TRLWE密文与TGSW密文。将TLWE拓展到多项式环面,可得TRLWE密文,将GSW方案拓展至环面,可得TGSW密文。接下来给出TFHE三种密文格式的定义:
给一个直观的感受:
下面给出三种密文的明文、密文和密钥的形式,以及可以进行的运算:
名称 | 明文 | 密文 | 线性组合 | product | 密钥 |
---|---|---|---|---|---|
TLWE | T \mathbb T T | T n + 1 \mathbb T^{n+1} Tn+1 | √ \surd √ | × \times × | B n \mathbb B^n Bn |
TRLWE | T N [ X ] \mathbb T_N[X] TN[X] | T N [ X ] 2 \mathbb T_N[X]^2 TN[X]2 | √ \surd √ | × \times × | B N [ X ] \mathbb B_N[X] BN[X] |
TRGSW | Z [ X ] / ( X n + 1 ) \mathbb Z[X]/(X^n+1) Z[X]/(Xn+1) | T N [ X ] 2 l × 2 \mathbb T_N[X]^{2l\times 2} TN[X]2l×2 | √ \surd √ | √ \surd √ | B N [ X ] \mathbb B_N[X] BN[X] |
我们发现TLWE密文和TRLWE密文只能进行线性组合,不能进行Product(积)的操作,即只能做加法不能做乘法。TFHE的研究者在定义了TLWE密文和TRLWE密文后,觉得好像离全同态加密还差一点,于是他们从GSW方案中找到了灵感。GSW方案中有一个ring product(内积)的操作:
输入是两个TGSW samples, Z [ X ] \mathbb Z[X] Z[X]是整数多项式,输出是一个TGSW sample,解密后得到两个消息的乘积,噪声小于等于 ‖ μ A ‖ η B + O ( η A ) ‖\mu_A‖\eta_B+O(\eta_A ) ‖μA‖ηB+O(ηA)。这里观察到,尽管运算是对称的,但是它产生的噪声是不对称的。TFHE的研究者基于这个特性研究出了TFHE:把其中一个输入换成TLWE类型,然后输出也变成了TLWE类型,计算变成了点乘(外积)。
噪声本来就不对称,现在更不对称了(更小了)。然后便可以用分解的方法,把原来TGSW的每行拆开,在并行计算,将原来的叉乘(内积)都变成了点乘(外积),得到一个很大的提速。
下面给出内积和外积的具体表达式以及直观的感受:
这一部分使用层次TFHE实现一个确定型自动机的评估。使用上面所说的同态外积构造门:
设TGSW密文的消息空间为 { 0 , 1 } ∈ Z [ X ] \{0,1\}\in \mathbb Z[X] {0,1}∈Z[X],TLWE密文的消息空间为 { 0 , 1 / 2 } ∈ T [ X ] \{0,1/2\}\in \mathbb T[X] {0,1/2}∈T[X],这样噪声中的 ∣ ∣ μ A ∣ ∣ 1 ||\mu_A||_1 ∣∣μA∣∣1就没有了(为1)。
接下来为TFHE选择门电路,这里给出四种图灵完备的门电路组合:
在LHE里面通常选择Xor这一组,FHEW选择了与非门,而(level)TFHE选择的是Mux电路,因为它可以几乎没有消耗的做二进制选择(噪声呈线性增长)。
Mux门电路的选择逻辑很简单,如果c为0则输出b,如果c为1则输出a:
C M u x ( c , a , b ) = b + c ⊡ ( a − b ) CMux(c,a,b)=b+c\boxdot(a-b) CMux(c,a,b)=b+c⊡(a−b)
在(level)TFHE的Mux门电路中有不同的线:图中深红色的线成为控制线(Control line),传输TGSW密文,蓝色的先称为数据线(data line),传输TLWE密文。
随后,我们便可以使用Mux门电路构造和评估任意的 查找表/布尔函数(噪声随电路深度的增加线性增长):
进而可以评估(输入长度已知并固定的)任意确定型(有穷)自动机:
为实现任意深度电路的同态评估,需要为TFHE引入自举(bootstrapping)操作。
自Gentry于2009年提出自举以来,自举从同态解密(Gentry09),到重加密,到压缩解密函数,再到密钥交换&模交换(FHEW&TFHE使用)。在Gentry09的自举(前面有写)中,自举是一个单独的函数,仅用于减小噪声;而在TFHE中,自举可以改变消息内容。接下来介绍TFHE中的自举门(gate bootstrapping)。
我们现在有一个二进制的消息空间,消息只有false和true。设false是 − 1 / 8 ( − 1 / 8 = 7 / 8 ) -1/8(-1/8=7/8) −1/8(−1/8=7/8),噪声小于 1 / 16 1/16 1/16,设true是$1/8true( 1 / 8 ) 1/8) 1/8),噪声也小于 1 / 16 1/16 1/16。现在再给你一副神奇的眼镜,让你能够看到LWE加密下的明文。
然后我们把两个环面相加。它们的值可能是真或假。如果他们都是假,那会得到 3 / 4 3/4 3/4(红色),如果他们一真一假,会得0(黄色),如果他们都是真,得到 1 / 4 1/4 1/4(绿色)。:
在能够看到明文的条件下,如何进行自举的与非操作呢?非常简单,我们把这个环面画一条线,落在线的左边就输出true,落在右边就输出false:
难点在于我们如何在密文(摘掉你的神奇眼镜)下进行操作。TFHE给出了这样的答案:
最困难的部分在第2步。将环面旋转 p p p个位置有两种情况:
在 p p p已知的情况下,旋转操作为 ( X p ⋅ c ) (X^p \cdot c) (Xp⋅c)。
在 p p p未知的情况下,旋转操作为 ( T G S W ( X p ) ⊡ c ) (TGSW(X^p) \boxdot c) (TGSW(Xp)⊡c)。
那么,如何在未知s(私钥)的情况下,旋转 − φ s ( a , b ) = − b + ∑ i = 1 n a i s i -\varphi_{\color{red}s}(a,b)=-b+\sum_{i=1}^{n} {a_is_i} −φs(a,b)=−b+∑i=1naisi个位置呢?
完成这两部就能够完成这个旋转的任务。正确性和安全性本文不作证明。
总结自举算法:
Input:
Output:
Algorithm:
主要参考论文:
本文仅供个人学习使用