2012年BIU密码学冬令营-03-Learning With Errors-第2部分

2012年BIU密码学冬令营-03-Learning With Errors-第2部分

演讲视频简介

我们继续带来2012年BIU密码学冬令营Lecture 03的第二部分。在这一部分中,Chris Peikert介绍了应用Learning With Errors假设构造可证明安全伪随机函数(Pseudorandom Function)的方法。伪随机函数是密码学中非常重要的基础工具。一直以来,大多数高效伪随机函数构造都是启发性构造,目标是抵御已知的全部攻击,而不是从理论上证明成功攻击伪随机函数意味着解决某个困难问题。而Chris Peikert的构造是可证明安全的,此工作也被密码学顶级会议EUROCRYPT 2012收录,论文名称为《Pseudorandom Functions and Lattices》。顺带一提,我检索这篇论文的题目时发现,Chris Peikert竟然在EUROCRYPT 2012上连中3篇论文,果然是大牛啊。

在校对这个讲座的字幕时,我也发现之前对讲座内容的很多理解是有问题的。这个讲座介绍了伪随机函数的很多基本概念和基本构造方法。对伪随机函数理论和构造感兴趣的知友们可以把讲座中提及的论文,尤其是“上古时代”的论文拿出来读一读,这会为自己对伪随机函数带来新的理解。

演讲视频信息

演讲视频字幕

这是今天的最后一个讲座了,我们尽量讲的简单一些。可能大家已经开始遨游在格和LWE的海洋中了,有关格和LWE的内容就这些。接下来的几天,我们将看到LWE的很多应用,其中绝大多数应用都与加密,或者说公钥加密相关。加密也是格在密码学中最重要的应用场景。所以我想今天在最后一个讲座上,讲讲LWE在密码学中的其他应用。

这个工作是最近才发表的,来自于欧密会,是我的学生Abhishek Banerjee和Alon Rosen完成的,内容是伪随机函数。伪随机函数是对称密码学原语,但是我们要用公钥密码学假设的力量实现有趣的伪随机函数。

我们先从伪随机函数的定义开始讲起。伪随机函数是这样一个对象,绝大多数人都接受Goldreich、Goldwasser和Micali在84年给出的定义。幻灯片的是他们给出的定义。你有一个函数族,这些函数以私钥s作为输入,我们称之为种子,函数将k比特长数值映射到值域D上。我们今天不太需要关心D的范围,但我们要用到PRF中k的比特长度,这在构造中起到了重要的作用,我们把k作为输入。所有在这一函数族中的函数都是确定性函数。一旦你固定了种子值,每个输入都会对应一个唯一的输出。

我们要求PRF函数族中的函数要满足下述安全定义。假定你有一个高效的攻击者,在两个世界之一内进行攻击。在世界1中,我们从函数族中随机选择一个特定的函数F。我们得到F,选择一个随机的种子,把F的种子设置为s,称此函数为 F_s 。现在我们允许攻击者适应性地问询 x_1x_2x_3 ,以此类推,函数F用一系列输出值回复这些问询。这是世界1中发生的事情。在世界2中,攻击者进行同样的操作,进行问询,得到回答,但世界2中的函数是真正完全随机的函数U。所以对于任意不同的输入 x_i ,函数都会均匀随机地选择一个输出值,返回给攻击者。当然,如果你进行了相同的问询,得到的结果也是一样的。除了这一情况外,不同的问询会给出独立、均匀随机的输出值。这类函数被称作随机函数。这是函数族中特殊的一类函数,只需要很短的种子。我们要求攻击者无法区分这两个世界。从攻击者的角度看,攻击者在世界1和世界2中的概率基本上是一样的。对于定义,大家有什么问题吗?

这个内容是研究生密码学基础课中的内容。这是一个非常简单的密码学原语,定义很简单,但它在对称密码学中起到了非常重要的作用。你可以用它来构造高效的密码学方案。如果你有一个PRF,你可以非常高效地将其转换为一个加密算法、对称加密算法、认证算法、用来识别敌我的身份认证算法,来保证外部攻击者无法通过认证进入系统。基本上可以认为PRF是对称密码学中的核心原语之一。

我们怎么构造它呢?如何得到PRF呢?我们可以用启发式思想设计并构造PRF,可以从工程角度考察并阻止对PRF的攻击手段来设计新的PRF,比如AES算法。这种设计方法的好处在于,得到的PRF运行效率非常高。这些PRF的安全性在于,它可以抵挡所有已知的密码学攻击,可以抵挡线性攻击、差分攻击等等攻击方法。密码分析学已经发展出很多攻击技术,我们希望这些PRF可以抵御全部这些攻击。

当然,我们要求的安全性定义很强。PRF的安全性要求非常明确,很难仅凭观测PRF的设计方法,就判断PRF是否满足安全性要求。我们期望得到的,是一个可用归约方法证明安全性的PRF。也就是说,所设计PRF的安全性可以基于某个具体的困难问题。这是我们的研究方向,得到一个不是主观设计的,或者说很容易分析其安全性的PRF。

1984年,GGMW论文定义了PRF的安全性,并还给出了第一个方案构造。他们所构造的方案是可证明安全的。方案非常简单,方案基于任意伪随机数生成器。如果你拥有一个伪随机数生成器,且输出值的长度是输入长度的2倍,我们就可以这样来定义一个PRF了。你选择一个种子,长度是k比特。我们在种子上递归调用伪随机数生成器。接下来,根据输入比特 x_i 选择输出的左半部分或右半部分。把输出再放入伪随机数生成器,再取结果的左半部分或者右半部分,如此循环,你就得到了一个非常棒的伪随机函数。这个构造的缺点是,算法是根据输入比特串而按顺序执行的,你需要迭代地调用k次PRG。所以你需要放进去k次种子s,然后取输出结果的一半。这会使得电路的深度特别深,而且没办法并行执行。

另一系列工作是Naor、Reingold和Rosen完成的。他们告诉我们如何解决顺序执行的这一障碍。他们定义了一个新的对象,叫做合成器,他们还基于数论给出了两个构造,安全性分别基于大整数分解和判定Diffie-Hellman问题。他们的目的是给出一个PRF方案,这个方案可以并行执行,电路深度很浅。这个方案的确非常高效,大家可以看到,算法的执行复杂度取决于方案类型。 NC^2 类型的电路深度是log平方级, NC^1 类型的电路深度是log级, TC^0 类型的电路深度是常数级。不过要用到特殊的门,即无界门或门限门。但从理论上,我们可以借助这一强力的门电路,构造一个常数电路深度的PRF。如果真能构造一个常数电路深度的PRF,那简直太棒了。这就是NR和NRR构造的伟大之处。

当然,这些依然有一些缺点。首先,虽然电路深度很浅,但电路本身很复杂。虽然电路深度很浅,但电路要设计的很宽,而且需要很多预处理过程。因此基本上可以断定,在实际中没法实现浅深度的电路。虽然设计很灵活,但实际在浅深度条件下,我们没法实现这样一个PRF。第二个缺点是,迄今为止还没有一个可抵御量子攻击的PRF。所有这些PRF的构造,都可以被量子计算机破解,我们得考虑到量子计算机可能在未来的某个时刻就被设计出来了。

我们需要克服这几个缺点,这是我们对PRF的期望,而希望来自于格。正如今天早上所讲的,格允许高度并行化,可以实现高效的计算流程,所有格密码学都有这个性质。那PRF呢?为什么不试试?应该可以用格来构造PRF,因为格所涉及的操作都非常简单,而且高度并行化。但是如果你仔细想想的话,现实可能比较悲观。唯一可以利用格构造的PRF的方法是使用GGM构造,也就是顺序执行的那个构造,需要调用k次伪随机数生成器。即使你能用格构造一个可以高度并行化处理的伪随机数生成器,最好的结果也只是把它插入到GGM的构造中。这样得到的算法就变得很慢,无法并行化处理,因为GGM的特性就是迭代调用,这是其中一个困境。现实比这要更悲观,因为可能我们根本没办法基于格构造伪随机数生成器,这有点令人惊讶。从原理上说,我们应该能构造出来。但实际问题是,为了得到伪随机性,你需要生成这些有偏的错误值。也就是说,当使用LWE的时候,你想证明所构造的方案是伪随机的,无法与真随机进行区分,你需要生成这些满足高斯分布的噪声项。对于伪随机数生成器,你需要用噪声项作为种子,需要把 \{0,1\} 的随机种子转换为满足高斯分布的整数比特,这就不太妙了。问题来了,如何利用随机输入的种子生成这些错误项?这好像确实挺麻烦的。所以现实问题是,很难构造一个PRF。至少如果用格的话,很难构造一个PRF。

那么接下来的几分钟我要讲什么呢?简单来说,我要讲解来自欧密会的一个研究成果。这个工作的内容是,构造一个浅深度,且比较简单的电路,用小电路来实现PRF函数族,且其安全性依赖于LWE,或者依赖于Ring-LWE。我们还没定义Ring-LWE,我们会在周二的时候了解Ring-LWE的定义,我们今天要用的全部都是LWE。如果用Ring-LWE的话,其执行效率可能没有看上去那么高。这就是我们要做的工作。特别地,我们会看到两种构造方法。其中一个是Naor-Reingold在1995年提出的构造方法,我们将给出一个基于合成器的PRF。我会讲一讲如何构造一个合成器。这样,通过直接使用Naor-Reingold在1995年提出的构造,就能得到一个log平方级深度的PRF电路了。在最后10分钟,我们会讲的更深入一些。我们来直接构造一个PRF,不使用合成器。我们得到的是一个类似Naor-Reingold-Rosen论文中给出的TC^0构造。他们的构造是基于大整数分解和判定Diffie-Hellman问题的。

这是我们接下来1个小时的讲解内容。这里面涉及到的主要技术是PRF的定义,以及我前面讲解的LWE的去随机化技术。这是一种去除有偏错误问题的技术。这个技术可以去掉讨厌的有偏错误问题,从而得到一个确定的错误值,这样我们就不用随机数来生成错误值了。当然,听起来有点互相矛盾,后面大家就明白我的意思了。对于我们的讲座内容,大家有什么疑问吗?

很好,我们首先来讲讲Naor-Reingold给出的合成器定义。这个工具特别棒,不过可能大多数人并不知道合成器。我认为大家都应该学习一下,这个工具非常棒。这就是Naor-Reingold定义的合成器。它是一个函数S,输入是D中的两个元素,输出是D中的一个元素。下面是它满足的性质。选择一个你喜欢的,多项式大小为上界的值m。对于任意m和安全常数,都是应该是以多项式大小为上界的,下面是要满足的条件。如果我选择2m个值,分别为 a_1,\ldots,a_m ,以及 b_1,\ldots,b_m ,我从定义域里面均匀随机地取这些数,那么所有以 a_ib_i 对为输入的S,其输出结果看起来应该是完全随机的矩阵,所以 S(a_i,b_j) 看起来应该是一个D中m乘以m的随机块。

这就是合成器。我们给点时间让大家消化一下,大家也需要消化下输入数对的形式。可能下面这张图能让大家更好理解一些。这是我想要满足的性质。想象一下,你把所有的a按照行放置,所有的b按照列放置,然后我给攻击者 S(a_1,b_1)S(a_1,b_2)S(a_2,b_1) 这些值,以此类推,我们就输出了一张表。攻击者应该不能从均匀随机表格中,区分出这个表是按照这种形式产生的,这是我们要求的安全性质。重要的是,我们要求对于所有的m,这个性质都要成立。所以m可能会非常大,可能有上亿行和上亿列,但你仍然没法判断这些输出值是按照这种形式产生的。

我认为这基本上可以看作是一个平方输出长度的PRG。不是一个两倍长度输出PRG,是一个平方长度输出PRG。而且很容易构造出这个PRG,原因在这儿。它的输入是2m个数,输出是 m^2 个数,而且这 m^2 个输出和随机数是不可区分的。这就是伪随机的性质,输入是2m个数,输出是 m^2 个数,输出的数量与输入的数量成平方关系。进一步,每一个输出值都只与2个输入相关。要得到 U_{i,j} ,你只用到 a_ib_j ,不需要其他输入值,所以把它看成一种特殊的PRG对理解上很有帮助。

这就是合成器。我们来看看Naor和Reingold如何用合成器构造低递归次数的PRF。假设我们有一个合成器,两个参数作为输入,一个参数作为输出。我们要进行一个归纳构造。基础模块非常简单,如何在不使用任何假设的条件下,构造一个1比特输入的PRF?不使用任何假设,构造一个1比特输入的PRF,如何构造?我没法阻止大家预习,方法已经在后面的幻灯片中给出了。我们要做的是,选择两个值 s_0s_1 ,把它们称为种子。如果某个人给的输入是0,你就输出 s_0 。如果给的输入是1,你就输出 s_1。他们都是随机数,所以这是一个PRF,我们的输出 s_0s_1 确实是均匀随机值。如果输入只有1比特长,你就可以构造一个真正的随机函数了,这就是基础情况。归纳步骤是双倍输入转换。我们PRF的输入是k比特,输出是2k比特,PRF将把输出长度扩大2倍。我们可以一遍遍地扩大2倍,直到我们得到想要的长度。工作原理是,如果我有一个k比特输入的PRF函数族,这些函数的输入是k比特,我们定义一个新的函数族,其输入是2k比特,输出是D中的值。新定义函数的种子是原始函数族中的两个函数,我们把它们分别称为左函数和右函数, F_lF_r ,它们都是从PRF中选择的。新的函数以 F_lF_r 作为种子,新函数的输入为 x_lx_r ,两个都是k比特长。我们接下来要怎么做?我们把左函数作为左边的输入,把右函数作为右边的输入,然后应用合成器来计算输出结果。注意到这两个函数输出的是D中的元素,所以如果你把S的输入分别设置为两个D中的元素,那么合成器的输出也是D中的元素。

这是一个递归构造,我们用一张图来描述此构造方法。这就是Naor-Reingold的构造。如果你想构造一个输入为4比特长的PRF,这就是构造方法。你有4个基础情况。在基础情况中,它们都是真正的随机函数。当某人问询输入为 x_1...x_4 所对应的输出时,你要做的是,对于每个输入比特,你选择对应的一对数。随后,按照树状形式计算,合成一遍,再合成一遍,把一对对的数都合并起来,一遍遍进行合并,直到最后输出了一个结果。这就是这个函数的工作原理。当然了,注意这个构造中树的深度。数的深度为log(k),我们需要一个log(k)深的树,k比特输入对应的合成器是一个log(k)深的树。如果你的输入是128比特,比如AES的输入长度,你会得到一个7层深的合成器。

这就是构造方法,安全性只需要两行字就可以解释清楚。PRF进行了多步操作,但本质上是在原始PRF函数族中选择左函数和右函数, F_lF_r 都是伪随机函数。我们可以把它们看成真正随机的函数,这是伪随机函数的安全需求,我们可以把它们看成真正随机的函数, F_l(x_l)F_r(x_r) 输出的序列都是真正随机的序列。因为 F_lF_r 都是随机函数,我们现在得到的是:左边,你可以得到一个看起来是随机的序列;右边,你也可以得到一个看起来是随机的序列。而且合成器告诉我们,把左右序列合并起来,结果看起来也是随机的。所以合成器最后告诉我们,如果考虑所有的左侧输出和右侧输出,它们看起来都是随机的。这里大家有什么问题吗?这些都是背景知识,都是构造PRF的重要方法。

这让我们面对了一个新的情况。我们现在需要一个合成器,这样我们就能得到一个PRF,特别感谢Naor和Reingold在1995年的成果。我们来看看能不能利用LWE构造一个合成器。这看起来好像不会很难。LWE称,很难区分 a_i 和b这一数对,其中 b_i 等于 a_i 乘以s加上e,或者 a_ib_i 都是真实均匀随机选取的,这是上一节我们讲的内容。在作业中,大家需要去证明,合并证明可以让LWE参数变得更多些。当我们有很多秘密的时候,我们仍然没法区分这些元组。这里我们有很多秘密值,也有很多相互独立的噪声,它们是A乘以 S_1 加上 E_1 ,A乘以 S_2 加上 E_2 ,这样我们可以得到很多的LWE参数。证明这也是不可区分的是一个练习题,不过如果你相信我说的,或者自己证明一下,你就会知道如何通过这个假设,用LWE构造一个合成器了,就用这个假设就可以构造。

下面就是合成器的样子,合成器左边的输入是这些A, A_1, A_2, ..., A_m ,每一个参数都是一个矩阵。合成器右边的输入是 S_1, S_2, ..., S_m ,参数仍然是矩阵。合成器的输出是 A_i 乘以 S_j 加上 E_{ij} 。我们无法区分表中元素是按照LWE计算到的,还是均匀随机选取的。回顾一下,合成器的输入是D中的两个值,输出也属于D,我们会对输出进行缩放,或者其他一些操作,使输出也在D中。

这看起来确实是均匀随机的,但有什么问题吗?错误值从哪里来呢?合成器应该是一个确定性函数,它不能自己产生一个错误值。 E_{ij} 应该从哪里来呢?好像没有什么好办法。你可能会想到把 E_{ij} 拆开,一部分放在S中,一部分放在A中。稍微考虑一下这个方法,就会发现这个方法不行,因为错误值必须与其他参数相互独立。所以,这里你需要 m^2 个相互独立的错误值矩阵。我们不能通过密钥确定错误值,我们不能通过输入确定错误值。所以真正的问题在这里,我们没法生成这堆愚蠢的错误值。

能不能不用错误值,能不能不加错误值呢?所以我们需要克服这个阻碍。我们引入了一个方法,可以解决这个问题,克服这个阻碍。这是一种产生确定性错误的方法,基本思想是这样的。我们不增加噪声,我们直接对结果进行舍入操作,将结果舍入到 \mathbb{Z}_q 中的一个小的循环子集中。你可以把循环子集看成 \mathbb{Z}_q 中的一个子群。这里有个图,可以帮助大家理解。这里q等于24,所有数都是在0到23之间的,都属于 \mathbb{Z}_q 。p是一个小的子群。 \mathbb{Z}_p 可能为3,也就是0、1和2。我们要做的是进行舍入,我们可以把所有绿色区域的数都舍入为1,所有蓝色区域的数都舍入为0,所有红色区域的数都舍入为2。我们要做的是取一个 \mathbb{Z}_q 中的元素,然后把这个 \mathbb{Z}_q 中的元素舍入到小子集 \mathbb{Z}_p 中。

为什么我说这有点像生成确定性的错误值呢?一种理解的方法是,如果得到的数是11,你会把它舍入为1。但我们也可以理解为11是8的舍入结果,相当于我们把11舍入为了8,我们加了一个-3的噪声。如果输入是13,你把它舍入为2,也就是变成了 \mathbb{Z}_q 中的16。你把13舍入为16,增加了一个+3的噪声。你实际上在确定性地进行舍入操作,把数值变为小子集上的点。实际上,这不是一个新提出的思想,这个思想早就有了。实际上在格密码学系统的解密操作时,我们一直都是这么做的。如果你能想起来的话,解密方计算点乘,你会得到一个近似为0,或者近似为q/2的结果。实际上解密方在把解密结果舍入为0或者q/2,把舍入结果作为解密结果。解密经常做这样的操作,我想明天或者后天大家就会看到,这个技术对于同态加密这个新密码学系统的构造起到了重要的启发作用。这个技术实际上是格密码学领域的基本思想。

我们正式定义一下这个技术。如果你有某个模q下的输入x,你就用这个公式把它舍入为模p下的值,所以你计算p/q乘以x。形象点的话,实际上我们在进行舍入操作。有关舍入操作与增加确定性噪声的关系,大家有什么问题吗?

所以我们定义了LWE的一个变种问题,不再增加错误值,而是舍入。此问题为Learning With Rounding,这个困难问题本质上和LWE是一样的。给定 a_ia_i 乘以s,但不是 a_i 乘以s加上噪声,而是 a_i 乘以s后进行舍入操作。这里应该是 \mathbb{Z}_q^n ,大家手动改一下吧。LWE中的数对都是模q下的,但LWR中右边的数是 \mathbb{Z}_p 中的,其中p是一个比较小的数值。这就是Learning With Rounding问题了,这是一个判定性问题,区分这样生成的数对,或者均匀随机选取的数对。另一种对LWE和LWR问题的理解方法是,简单来说,LWE是在隐藏内积中低位的比特值,通过小噪声对最后几个比特值进行模糊操作,让高位的比特值保持不变。而在LWR中,我们没有用随机数来对低位比特值进行模糊操作,我们直接把低位比特值略去,不引入随机数。我们只是把低位比特值略去,而不是用噪声对其进行模糊。但从另一个角度看,他们本质上做的是同一种操作。实际上,你可以证明LWR问题不比LWE问题简单,所以如果你能解决我们定义的这个问题,你也可以解决LWE问题,你也就能用同样的方法解决所有这些格中的困难问题了。

看起来这是一个非常棒的假设,不过在参数设定上,这里需要一个条件。我们需要大的模数q 比小的模数p大出超多项式引子的比例,不过只是证明中需要这个条件。实际上,如果q和p的比例值为根号n的话,这个问题好像也是个困难问题。q除以根号n本质上就是进行舍入操作时所加噪声的平均值,这就是为什么根号n很重要的原因。如果我们更贪婪写,让q和p的比例小于根号n,这个困难问题会遭受到去年提出的over-n-gate攻击。这里的问题是,如何证明这样设置的参数是正确的,困难性是指数级的,这是我们明天的作业。证明非常简单,涉及到一些小技巧。这是所涉及到的技巧。假设我们试着要解决LWE问题,而我们有一个LWR的预言机,我们的预言机会帮我们从均匀随机数对中区分出满足LWR分布的数对。我们要做的是解决LWE问题。这是解决方法。大家有什么想法吗?如何用LWR预言机解决LWE问题?我们应该怎么做?我们要做的是取(a, b)对,然后对b进行舍入操作。我们取一个可能有噪声的b,然后对其进行舍入操作。无论是否有噪声项,我们都把它舍入为模p的某个值。如果是LWE,则有很大概率使得带不带噪声项的舍入结果都差不多,所以<a, s>加上e后进行舍入,与<a, s>直接进行舍入的结果差不多。如果我们得到的是红色的随机数值,然后加上噪声的话,结果可能还是红色的随机数值,它们两个的舍入结果应该是一样的。当然,有小概率使得等式不成立,不过这个概率是可以忽略的。所以归约过程是,我们对b进行舍入操作,然后问询LWR预言机。如果原始数对是从LWE来的,我们就把它变成了LWR数对。如果原始数对是均匀随机的,那么舍入的结果也是均匀随机的,所以预言机会告诉我们得到的数对属于哪个类型。我们差不多用两行文字证明了我们的结论。在论文中,由于某种原因我们要用两页纸进行证明,不过基本思想就是这样的。对于LWR,大家还有什么问题吗?

我们继续往下讲。大家可能已经能猜到,我们如何通过LWR得到一个合成器了。用LWR,我们就不用引入随机错误值了。这就是合成器的样子。和前面一样,合成器的输入是两个模q的方阵。现在合成器的输出也是一个方阵,不过是模p下的方阵,合成器就是A乘以S,再舍入到模p下。这和LWE问题几乎完全一样,只不过这里我们没有增加噪声,只进行舍入。大家能看出来这里有什么问题吗?定义合成器的时候,我们要求输入属于D,输出也属于D。满足这一条件,我们才能用树状构造得到一个合成器。我们发现,输出是模p域不会对安全性造成什么影响。它的影响只是合成器的调用次数会受到限制。我们做的是不停地忽略比特值,直到我们不能再扔任何一个比特值了,这时候你就应该停止合成了。这样我们就得到了一个合成器。

特别地,我们得到了这样一个PRF,我们得在屏幕上展示一下这个PRF。我们要做的是,构造一个k比特输入的PRF,其中k等于 2^d ,比如考虑d=7,这时候输入是128比特。我们要做的是,取模数 q_0q_d ,它们一个比一个大,要足够大,私钥是模最大模数下的方阵。函数的形式看起来差不多是这个令人抓狂的样子。你要做的是得到一个树状构造,进行矩阵乘法、舍入,把一对数合并起来,相乘、舍入、合并,以此类推,直到完成全部操作。这是一个8比特输入的例子,我们完成了构造,得到了一个PRF。你只需要保证,原始的模数要足够大,这样才可以一步步缩小结果。这里有什么问题吗?大家应该喘口气,喝杯水了。

我们来看看另一个完全不同的构造。我们往回看一下,我们得到了一个很棒的合成器,我们用合成器得到了一个PRF。不过,Naor和Reingold还告诉我们,可以通过数论直接构造一个特殊结构的PRF。特别地,我们已经有了一个树深度为log(k)的合成器,每一个合成器都属于 NC^1 类型,这样你就得到一个 NC^2 类型的PRF。但是Naor和Reingold在1997年,以及NRR在2000年,给出了一个不用合成器构造PRF的方案。这个函数也是一个PRF,这是一个基于DDH问题的PRF。输入是DDH问题困难的群,以及k个指数, x_1x_k 。你的输入是 x_1x_k ,你要做的只是计算子集乘法,把所有 x_i=1 对应的 s_i 乘起来,把相乘结果作为指数,计算g的指数次方。这样我们就得到了一个基于DDH假设的PRF。种子是指数,我们计算这些指数的子集乘,再求g的指数次方。有什么问题吗?

令人高兴的是,利用LWE,我们也可以进行这样的操作。我们可以基于LWE构造一个PRF,这是工作原理,我们可以看出构造方法非常相似。我们这里有2个模数,不再是前面的一系列模数了,只需要两个模数q和p。我们的私钥是一个均匀随机矩阵A,把它看成是一个生成元。接下来,我们有一系列短的秘密值 S_1S_k ,这些也是矩阵。为什么要求它们比较小呢?这是证明中要求的,我们还不知道这是不是个必要条件,不过证明中要求它们比较小,所以可能这是个必要条件。矩阵中的数值是按照错误分布选取的,也就是LWE错误分布。这就是函数了。这是舍入子集乘,我们做的事情完全一样。我们取秘密矩阵的子集乘结果,所有这些都是模q下计算的,再乘以A,有点像求指数,再舍入成模p下的结果。这就是我们的函数定义。这个函数计算起来非常快,我猜应该是比较快的,你需要乘一系列矩阵,需要很多方阵乘法,一共是k个方阵。我确实不知道实际上的计算速度能有多快,可能不是那么快,矩阵乘法比指数运算差不多快0.3%。所以我不太清楚,可能实际运算中并不是那么高效。在实际中,这些秘密值应该不能为矩阵,而是为环中的特定元素,环元素中的乘法应该是线性复杂度的,我们可以把它看成子集和的另一种形式。我不知道如何进一步进行优化,不过如果秘密值是环元素的话,乘法运算应该非常高效。我们要等到周二,才会知道环是什么。

这就是我们构造的函数,从表述上看和上面这个非常像。我们可以证明它的一些性质。我们可以证明,如果使用环元素的话,我们就能得到一个常数深度的电路,而且在实际中也可以实现这个电路。虽然没法继续优化了,但其计算效率只比AES之类的原语慢几个数量级,这个PRF的运算速度非常快。还有多长时间?我们应该能早点结束,还不错。对于这个函数,大家有什么问题吗?

我们来简单的看看证明过程。回顾一下,我们有一个种子,种子是一系列矩阵。这是我们定义的函数,我们把子集乘应用在这些相互独立的项上。我们用类似的方法证明其安全性,跟LWR困难性证明类似,用两行文字差不多就够了,不过还需要一些其他的补充,来描述如何回复问询。这里给出的是证明的基本思想。如果我们不按照PRF的函数定义来计算PRF结果,如果我收到问询,我们不按照定义计算PRF。当然,我没理由换种方式计算函数输出,但我可以这么计算。我取得A,乘以 S_i 。如果 x_1=1 ,我就乘以 S_1 ,和原始函数一样,但是再继续乘以 S_2, S_3 之类的项之前,我先在上面增加一些错误值。因为某些原因,我决定这么做。A乘以 S_1 ,根据 x_1 是0还是1,决定是否在上面增加噪声。然后继续计算,把剩下的项都乘进去。

如果我们把括号打开,把等式展开,会得到什么结果?我们会得到右边的结果:A乘以一个子集乘结果,还有红色的部分,也是做乘法,然后把两项加到一起。红色部分有什么性质呢?它是错误矩阵乘以一系列密钥矩阵。红色部分的参数都比较小,它们都是从错误分布中选取的。所以,如果我们把它们都乘起来,结果也会相对比较小。结果可能会变大一点,不过还是比较小。我们得到的结果是原始值的舍入结果,这部分是我们本来要计算得到的,再加上某个很小的项,再把它舍入到p附近。所以证明的关键点在于 \tilde{F} 的计算方法,这样计算也会得到相同的结果,和用正确方法计算得到的结果一样,因为增加的噪声都比较小,噪声相乘后也会比较小。这里的关键点是,我可以按照这种计算方式回复问询,我给攻击者的计算结果是完全一样的。但现在我们可以观察到,可以把均匀随机的矩阵A换成与LWE相关的矩阵。我可以把这些项用LWE实例换掉,把A和A乘以 S_1 加噪声,换成两个均匀随机矩阵 A_0A_1 。这样一来,新函数中就没有 S_1 项了。当回复问询时,我们可以不使用 S_1 ,而是使用LWE参数相乘,再舍入。我们可以重复这一置换过程,把 S_2S_3S_4也置换掉。如果我们一共置换k次,最后就能得到完全随机的函数,每个x都与一个A相关联,最后得到的是一个真实随机的函数。这就是安全性证明了,我们证明了为什么原始函数与真实随机函数不可区分。这里有什么问题吗?

这里有很多公开问题,等待在座的各位去解决。第一个公开问题是,能不能有更好的方法证明LWR问题是困难的。我们需要p和q的比例比较大,但我认为正确答案应该是q/p约为根号n。只要比例值为根号n,LWR问题就应该是一个困难问题。另一个问题是,q的大小和错误值的大小相关。当前q的取值比较大,如果能让q变小就更好了。特别地,对于我刚才讲到子集乘PRF,如果能证明当q和p是多项式关系,PRF仍然是安全的,就更好了,比如q和p的关系是根号n,可能比根号n大,不过不会太大。现在我们要求比例值是n的k次方,还是比较大的。能不能基于子集和或者LPN构造PRF呢?这是个好问题,仍然是个公开问题。之所以现在没法用LPN构造的一个原因是,当前的构造需要舍入操作。如果在模2下构造PRF,就没办法做舍入操作了,你需要用一个比较大的模数,但LPN的模数是2。就是这些了,谢谢,我们晚饭见。

发布于 06-27

文章被以下专栏收录