当前位置: 首页 > article >正文

全同态加密基于多项式环计算的图解

全同态加密方案提供了一种惊人的能力 —— 能够在不知道数据具体内容的情况下对数据进行计算。这使得你可以在保持潜在敏感源数据私密的同时,得出问题的答案。

  

这篇文章的整体结构包括多项式环相关的数学介绍,基于多项式环的加密和解密是如何工作的,同态加法和乘法如何实现的。

原文来源:https://humanata.com/blog/illustrated_primer/#homomorphic-operations,现在已经无法访问。

前言        

        这些全同态加密方案【BFV、BGV、CKKS】都是基于一个称为Ring learning with errors(RLWE)的困难计算问题。

        本质上,这些方案中的数据在加密时(密文)和未加密时(明文)都用多项式表示。如: 4x^2 + 2x + 1

        与我们常学的多项式有一些不同,首先系数都是整数,余数是相对于某个整数 t 的余数(对 t 取模)。假设 t=24 ,那么一个24小时的时钟,21加6小时得到3小时。所有多项式的系数都是这样处理的。

        另外,我们可以将数字的取值范围设为-11到12,以便方便地对数字求反。请注意,这只是一个方便因素—— −1 的余数和23的余数(除以24)没有区别。

        第二个,也是比较棘手的,这些多项式的不同之处是使用余数的想法不仅适用于多项式的系数,也适用于多项式本身。

        我们定义了一个特殊的多项式,称为多项式模,并且只考虑多项式被该多项式模除后的余数。在BFV方案中,这个多项式模的具体形式是 x^d+1 ,其中 d=2^n 。对于一些 ,为了说明问题,我们取 n =4 ,因此多项式为 x^d+1

        因为我们考虑的是关于 x^d+1 的余项,所以我们只需要考虑幂次为 x^0x^{15}的多项式。任何较大的幂都会被多项式模除掉。这也可以通过考虑x^{16} \equiv -1\ (mod\ x^{16}+1)来理解,这意味着x^{16}可以用 −1 代替,以将 x 的较大幂次减少到0到15的范围内。

        我们考虑的所有多项式都是这种形式: 

        其中16个系数 a_i 可以从0到 t−1 。可以用一个由系数组成的环面来说明这一点,如下所示:

        在这个图中,每个环,代表多项式中出现的 的一个幂的24个系数的可能值。绿色的点表示系数0的位置。这为我们提供了一种很好的方式来可视化多项式,这将有助于我们在下面考虑加密和解密步骤的工作原理。

        BFV加密方案涉及大量的多项式乘法运算。当我们将x的两个幂相乘时,例如 2x^{14}x^4 ,我们将它们的指数相加——得到2x^{18} 。有人可能会假设,要找到关于多项式模的多项式余数,可能只需要将指数从 0 旋转到 x^{16},得到 2x^2 ,就像上面所示的整数系数一样。这就是多项式模为 x^d 时的情况。然而,我们的多项式模是 x^d+1 。如上所述,额外的 +1 因子引入了符号变化,这有助于进一步打乱乘法的结果。

        如上所述,将2x^{14} 乘以x^4x^d+1 ,取这一项(由上图的红点表示),围绕环向前旋转4次,通过0点调整系数的值,得到 22x^{2} (或 -2x^{2},如果考虑数值从-12到11而不是0到23)。

首先,2x^{14} 乘以x^4,根据幂运算法则,指数相加,得到 2x^{18}

在模 x^{16}+1 的情况下, x^{18}可写成 x^{16}\cdot x^{2}。又因为 x^d+1 ,所以x^{16}x^d+1 为 -1。

那么x^{18}=x^{16}\cdot x^{2}x^d+1 就变为-1\cdot x^{2}=-x^{2}。而前面的系数2乘以-1得到-2。

如果我们考虑数字从0到23,那么-2等价于22(在模24的情况下),所以结果是22x^{2}。如果我们考虑数字从 -12 到 11,那么结果是-2x^{2}

        这种形式的多项式具有非常丰富的结构和许多优良的性质。它们是分圆多项式的子集。严格来说,将它们中的一个用作多项式模并不是必需的,但这样做可以提供许多便利和加速。

基于多项式环的加解密

        我们已经介绍了用于BFV方案的多项式环的一些性质,现在我们可以讨论其加密和解密的工作原理。首先,我们需要讨论如何生成私钥和公钥,然后讨论如何使用它们进行加密和解密。

公钥和私钥

        加密接收明文,并使用由私钥派生的公钥将其转换为密文,这种从明文到密文的转换只有当你知道私钥的情况下才容易逆转,即从密文还原回明文。

        更具体地说,明文是环上的多项式,其具有多项式模 x^d+1,其中d = 2^n,以及系数模 t。明文加密后为密文,其是由两个环上的、具有相同多项式模的多项式构成的,但系数模为 q,通常 q 远大于 t

        例如,多项式模为 x^{4096} + 1,这意味着明文和密文中的多项式都有 d = 4096 个系数。明文多项式的系数需要模 t = 290764801,密文多项式的系数需要模 q = 9214347247561474048 或更大。

        出于演示目的,我们将使用小得多的数字,但希望这些数字能更好地说明方案的各个步骤中发生了什么。在第一部分中,为了使事情更加直观,我们将使用 d=16, t=7, q=874。注意,这些参数是不安全的!

  • 对于私钥或密钥,我们用 s 表示,它是我们随机生成的一个系数为-1、0或1的多项式。例如:

  • 对于公钥的 pk_1 部分,我们用 a 表示,它是我们从密文空间中随机生成一个多项式,其系数模为q。例如:

  • 误差多项式(噪音),我们用 e 表示,系数很小,来自离散高斯分布。这个多项式在这里使用一次,然后丢弃。例如:

        然后,公钥被定义为一对多项式pk = (pk_0, \ pk_1) = ([-as+e]_q,\ a),其中,多项式运算是求多项式模和系数模 q 的运算。

对于上面给出的示例,公钥的第一个多项式被构造为:

        其中第一个乘法取多项式 a,它的系数来自于对 q 取模的整个范围,然后乘以系数为-1、0或1的 s。由于模上多项式模的多项式的乘法具有“旋转和反射”性质,有效地混合和打乱了 a 的所有系数,并进一步增加了小的噪音。多项式 a 有效地掩盖了公钥中的私钥。

        从公钥破解加密方案基本上需要从 ([-as+e]_q, \ a) 对中计算出 s。唯一的因素是该方案中包含了噪音——如果 e 为零,则很容易从公钥中计算出  s。当 e 足够大,但又不太大时,这是一个难题。

        本文的示例中,私钥可以通过暴力攻击恢复——−尝试每个可能的  s (只有3 ^ 16 = 43046721组合)然后计算 as + e 来寻找出一个接近公钥的第一项的答案。对于真正的参数,这种暴力攻击的方法是完全不可行的。3 ^ 4096 是一个很大的数字,但有更聪明的方法,然后定义给定的一组参数的安全性。

加密

        加密过程看起来有点像公钥生成过程。加密需要一个明文,它是一个系数为模 t 的多项式 ,并将其转换为一对系数为模 q 的多项式。为了说明这一点,我们将加密一个只有两个非零系数的非常简单的多项式消息: m=3+4x^8\equiv 3-3x^8

        加密还需要三个小的多项式。两个误差多项式来自于与公钥误差多项式相同的离散高斯分布,分别为 e_1, e_2,另一个多项式我们称之为 u,它的系数为-1、0或1,就像私钥一样。

        这些多项式只在加密过程中使用,然后丢弃。

        密文由两个多项式表示,计算为: ct=([pk_0u+e_1+qm/t]_q,[pk_1u+e_2]_q)

        请注意消息中的值是在mod t的范围内,而在我们的示例中,它们被缩放为q/t (即128),使它们覆盖mod q的范围。这是消息被插入到密文时的唯一更改。这些值通过添加到第一项来掩盖,第一项的值是在mod q的范围内,与随机的噪音没有区别。u的随机性改变了每次加密中使用的掩码,从而确保相同的明文在每次加密时产生不同的密文。

Note:同态加法和乘法之所以可行,是因为消息仅以缩放的形式存在于密文中。其他项的作用是隐藏消息,并且在只有知道秘密密钥才能移除这些项的情况下,它们在隐藏消息方面被证明是有效的。

        使用上面给出的多项式显式计算密文的第一个元素:

        在密文的第一项中展开公钥,我们看到: ct_0=[e_1+e \cdot u - a\cdot u\cdot s+q \cdot m/t]_q。在这个表达式中,前两项是“小”的,与误差项成比例,后两项是“大”的。第一个大项有效地隐藏了第二个项,也就是明文多项式消息。

        密文的第二个元素是这样计算的:

        在密文的第二个元素中展开公钥,我们可以看到 ct_1=[a \cdot u+e_2]_q 。这展示了解密是如何工作的—如果我们知道 s,我们可以计算 ct_1 \cdot s=[a \cdot u \cdot s+e_2 \cdot s]_q,这可以用来删除密文第一个元素中的非消息大项。

        综上所述,密文可以用公钥、私钥、掩码、噪声和消息表示为:

解密

        如上所述,解密相对简单。首先,我们计算 [ct_0+ct_1 \cdot s]_q ,这将完全从消息中删除掩码。这给了我们一个扩展为 [q\cdot m/t+e_1+e\cdot u+e_2\cdot s]_q 的多项式,即缩放后的信息加上一些噪声项。因此,只要噪声项不是太大,我们就可以恢复消息。

        从图中可以看出,除了两个非零系数( x^8x^0 )外,明文的所有系数都小于q/t=128 。如果我们将这个多项式缩放回对 t 取模的范围,那么我们有:

        四舍五入这些系数恢复我们的消息 m=3-3x^8

        我们通过将近似系数四舍五入后缩放到最接近的整数对应值来获得我们的消息:

绿色-噪音、粉色-近似解

        把这些放在一起,我们通过计算来解密密文:{m}'=[ \left \lfloor q[ct_0+ct_1 \cdot s]_q \right \rceil]_t\left \lfloor \right \rceil 表示舍入到最接近的整数。

        如果系数中噪声太大,那么它们最终会更接近一个与正确整数不同的整数,然后解密将(悄无声息地)失败并产生错误的结果。在上面的例子中,最大的误差是 23/128 ,所以仍然有一些空间允许产生更多的噪音,并且能够正确的解密。可以通过使 q/t比值变大或变小来调整噪声空间净含量。

同态操作

        人们对这类密码体制如此感兴趣的一个主要原因是,它们允许同态加法和乘法(来自希腊语 homo - same,表示"相同" 和 morphe - shape,表示"形态")。这意味着您可以在数字仍然加密的情况下进行加法和乘法运算,而不必先解密。这是一个令人惊叹的功能,有望在数据保护和安全方面构建一个新的黄金标准。

同态加法

        最简单的情况是两个加密数字的相加。假设我们已经用相同的公钥加密了两个多项式 m_1m_2 :

a=([pk_0u_1+e_1+qm_1/t]_q,[pk_1u_1+e_2]_q), \\ b=([pk_0u_2+e_3+qm_2/t]_q,[pk_1u_2+e_4]_q)

        注意,我们需要使用两个不同的小多项式 u_1 和 u_2 ,以及4个小噪声多项式 e_1, e_2, e_3, e_4 来做到这一点。如果我们只是添加相应的密文元素,我们得到一个新的密文:

a+b= \\ ([pk_0(u_1+u_2)+(e_1+e_3)+q(m_1+m_2)/t]_q, [pk_1(u_1+u_2)+(e_2+e_4)]_q)

        由于消息仅存在于具有缩放的密文中,因此加法的结果与加密 m_1+m_2 的形式相同,只是增加了新的噪音:

c=([pk_0(u_3)+(e_5)+q(m_1+m_2)/t]_q,[pk_1(u_3)+(e_6)]_q)

        大致的解密(舍入之前)将为: [q(m_1+m_2)/t+e_5+eu_3+e_6s]_q。这意味着只要新的噪声项不太大,消息 m_1+m_2 就能正确解密。其中噪声有三种类型:

e_5 = e_1 + e_3 \\ eu_3 = e(u_1+u_2) \\ e_6s = (e_2+e_4)s

        我们担心的是,当这些项变得足够大,以至于噪音多项式中的一个系数大于 q/(2t) 时,解密就会失败,因为解密过程结束时的四舍五入操作会四舍五入到错误的数字。

        如果我们只考虑第一项,那么我们就把来自离散高斯分布的多项式中的系数相加。这意味着在某些情况下,我们会把一个负系数加到一个正系数上,结果会更接近于零。在其他情况下,系数会有相同的符号,所以结果会更大。我们可以做很多的同态加法,看看噪音是如何随着加法的数量增加而增加的,这是很有指导意义的。系数的分布如下图所示,其中我们添加了1、5和30个噪音多项式(随机地进行了数百次试验)。

        当我们添加了30个噪音多项式时,某些系数有可能会大于64,即超过了q/t的一半,所以解密不会产生正确的结果。

        另外两项表示不同的情况 —— 第二项是一个噪音多项式乘以一些“小的多项式”(系数为-1、0或1)的总和。这种乘法会产生更大的噪音。一个噪音多项式和一个小的多项式的乘积的系数大约将是随机正负号的噪音多项式系数的2/3rds的总和。这意味着这个噪音与多项式的最高次的平方根 \sqrt n 一致。

        对这一项绘制与上面相同的分布可以看出,它比第一项大得多,而且即使对于我们示例中的参数,也存在错误解密的危险,即使只是添加了几个参数。

        第三项是类似的 —— 一组噪音多项式之和,乘以一个“小的多项式”。它的噪音分布是这样的: 

        结合起来,我们可以画出这三项的最大系数的增长,作为已经发生的加法数量的函数。这是一个须状图,给出了这些最大值的可变性。(注意噪音的均值接近于零,这是最大系数的幅值分布) 

        这表明,对于我们所选择的参数,由两个以上加法产生的密文,解码错误的概率很高,而且两次加法失败的概率也很高。这是因为有时最大错误大于64,当q/t = 128时,会导致不正确的解密,就像这里一样。为了给这样的操作提供更多的空间,我们需要使用更大的q/t比值,这可以应对通常由所执行的操作数量引入的噪音量。

        不幸的是,由密文的同态乘法引入的噪音量又要大得多。

同态乘法

        我们首先回顾下公钥和密文形式:pk = (pk_0,\ pk_1) =([-as+e]_q,\ a)ct=([pk_0u+e_1+qm/t]_q,[pk_1u+e_2]_q)。以及解密初级形态为 [ct_0+ct_1 \cdot s]_q

        同态乘法在程序上很简单,但是比加法复杂得多。如上所述,消息以 qm_1/t 的比例出现在密文的第一个元素中。因此,将两个密文的第一个元素相乘,再乘以t/q,就会得到一个带有 qm_1m_2/t 的项——如果我们仍然能够除去掩码项,这个项就可以恢复。

        因此,要理解同态乘法的机制,关键在于了解如何从密文的乘积中去掉掩码项。要做到这一点,我们的想法是把密文看作是私钥 s 的幂次方的一个简单多项式。这是这篇文章中使用多项式的第三种不同的方法,虽然它有点令人困惑,但是它是理解同态乘法如何工作的关键。

        我们可以写出解密过程的第一部分,使密文的每个元素都是 s 的多项式的系数:[ct_0 + ct_1s^1]_q

        请记住, ct和 s 本身就是多项式,所以这个方程是一个多项式乘以一个多项式 (s^0)加上一个多项式乘以另一个多项式(s^1),然后所有这些都取多项式模 x^d+1和系数模 q

        现在,我们在上面看到解密产生了一个与掩码项 au无关的量:[ct_0 + ct_1s^1]_q \rightarrow \frac{q}{t}m + noise

        好了,现在考虑两个密文 a 和 b,它们被定义为两个消息 m_1 和 m_2 的加密,它们可以被解密:

[a_0 + a_1s^1]_q \rightarrow \frac{q}{t}m_1 + n_1 \\\ [b_0 + b_1s^1]_q \rightarrow \frac{q}{t}m_2 + n_2

        其中 n_1 和 n_2 表示密文中的噪声。

        如果我们取它们的乘积,我们有: [a_0 + a_1s^1]_q[b_0 + b_1s^1]_q \rightarrow (\frac{q}{t}m_1 + n_1)( \frac{q}{t}m_2 + n_2)

右边的表达式与计算 a 和 b 所用的掩码无关,所以左边也必须与它们无关。如果我们把左边展开成 s 的形式(为了方便起见,再乘以 t/q )就得到了: mult(a,b)= c_0 + c_1s + c_2s^2,其中 c_0 = [\frac{t}{q}a_0b_0 ]_qc_1 = [\frac{t}{q}(a_1b_0+a_0b_1) ]_qc_2 = [\frac{t}{q}a_1b_1]_q

        这样做意味着我们可以计算出一个新的密文的组成部分,它比原来的密文多一个元素,并且可以正确地使用密钥 s 的幂次方进行解密。

        解密的形式展开如下: [ \left \lfloor t/q[ct_0s^0+ct_1s^1+ct_2s^2]_q\right \rceil]_t

        这只是增加了一个项,该项是一个多项式乘以另一个多项式的平方。这里需要处理大量的细节追踪工作,但这只是学校水平的代数运算(当然,不包括模数部分!)。这是一种解密步骤的推广,它允许我们解密同态乘法的结果。

        要了解这一切是如何显式地工作的,请考虑 a 和 b 在加密过程中的展开式:

a=([pk_0u_1+e_{11}+qm_1/t]_q,[pk_1u_1+e_{12}]_q), \\ b=([pk_0u_2+e_{21}+qm_2/t]_q,[pk_1u_2+e_{22}]_q)

        如果我们展开乘法的定义,同时对结果进行部分解密(即解密到除以 q/t 和整数之前),那么得到的表达式就很复杂。但是,由于每个密文的组件都是在解密过程中被构造成能够删除掩码项( au_i )的,所以这个展开的结果完全不依赖于来自公钥的掩码项!!!

得到的表达式如下:

ct_0s^0+ct_1s^1+ct_2s^2 \\ = \frac{q}{t}m_1m_2 + e_{22}m_1s+e_{12}m_2s+em_2u_1+em_1u_2+e_{21}m_1+e_{11}m_2 \\ + \frac{t}{q}e^2u_1u_2 + \frac{t}{q}e_{12}e_{22}s^2 + \frac{t}{q}e_{22}esu_1 + \frac{t}{q}e_{12}esu_2 \\ \frac{t}{q}e_{12}e_{21}s + \frac{t}{q}e_{11}e_{22}s + \frac{t}{q}e_{21}eu_1 + \frac{t}{q}e_{11}eu_2 + \frac{t}{q}e_{11}e_{21}

        这里有很多项,但是现在我们已经去掉了掩码,问题是,噪音(除了第一个)与 q/(2t) 的“噪音预算”相比有多大?

        为了感受这一点,我们模拟了大量加密的随机信息的乘法, d = 16, t = 7, q = 7168 = 1024 \times t。各类型噪音的系数大小分布如下图所示。请注意,总的噪音需要大于 q/(2t) = 512 才能导致解密错误。在这些项中,涉及噪音多项式的项、消息和私钥, e_{22}m_1s + e_{12}m_2s 是最大的贡献者。

        上图显示,对于这些参数,最大的贡献来自于包含噪音多项式乘以消息多项式和私钥的项。这种噪音的最大系数约为300。这里有两项,其他的项更小。把所有的噪音合并成一个,就得到了乘法结果的总噪音。这些系数的分布如下图所示: 

重线性化

        上面概述的乘法策略允许我们进行多次乘法,但代价是每次乘法都将密文的大小增加一个多项式。密文在大小上增长可能是一个问题。事实证明,有一些方法可以将密文的大小还原为两个多项式,但代价是增加噪声。这就是所谓的 Relinearisation(重线性化),因为你要去掉 s 多项式中的二次项和更高的项。

        另一项使这种加密方案切实可行的重要技术是将多个消息打包到一个明文中(单指令多数据(SIMD)),通过并行化提高吞吐量。

结论

        粗略地说,加密是将消息隐藏在一个环上的多项式中,并添加一些噪音。每个密文都包含足够的信息,可以在给定私钥的情况下除去自己的掩码。因为密文只涉及到消息的缩放,所以仍然可以对它们执行加法和乘法,并使用一些巧妙的结构来在之后移除掩码。该方案的安全性来自于在不知道私钥的情况下,在噪声存在的情况下很难去除掩码。这个问题的难度具有一些优秀的安全性能,例如没有已知的量子算法来攻击这些系统。


http://www.kler.cn/a/381424.html

相关文章:

  • GD32H7XX软件触发中断
  • ZDH权限-扩展支持数据权限
  • 【Java知识】java进阶-一个好用的java应用分析工具arthas
  • DFS求解迷宫最长移动路线
  • 【react使用AES对称加密的实现】
  • 浏览器中的事件循环
  • 基于Leaflet的自助标绘源码解析-其它对象解析
  • 文件上传漏洞修复措施
  • 论文 | PROMPTAGATOR : FEW-SHOT DENSE RETRIEVAL FROM 8 EXAMPLES
  • 酒店民宿小程序,探索行业数字化管理发展
  • 文章解读与仿真程序复现思路——电网技术EI\CSCD\北大核心《融合引调水工程的抽水蓄能电站与光伏联合运行短期优化调度模型 》
  • 单臂路由技术,eNSP实验讲解
  • 搭建你的私人云盘:使用File Browser与cpolar实现公网传输文件
  • 《XGBoost算法的原理推导》12-1加法模型表达式 公式解析
  • 推荐一款功能强大的视频修复软件:Apeaksoft Video Fixer
  • 小乌龟—Git
  • Excel批量转换不规范数据的教程
  • Visual Studio2022版本的下载与安装
  • 深度学习经典模型之Alexnet
  • HTTP慢速攻击原理及解决办法
  • Mac删除软件,步骤超简单!
  • 15分钟学 Go 第 38 天:数据库基础
  • Ghidra无头模式(自动化批处理执行重复性任务)
  • Set,Map课后练习
  • 【Leecode】Leecode刷题之路第42天之接雨水
  • Docker Remote API TLS 认证_docker远程接口未授权访问漏洞怎么解决