格密码学进阶之五:从IBE出发到内积ABE(AFV11)

东泽 安比技术社区 2020-09-30 12:30

本文作者东泽,来自安比技术社区的小伙伴,目前就读于斯坦福大学,研究方向密码学。

写在前面

越往后面写,笔者发现随着难度的进阶,很多内容并不是可以全部塞在一篇文章中一起发出来的了。每一篇文章的内容都有太多细节的地方需要满满的思考。

从这一期开始,为了方便阅读,我们缩短每一期的篇幅,每一期就详细的介绍一篇或者几篇有关的paper。这样可以方便我们充分的理解体系的构造以及安全性的证明。

在之前的文章中,我们已经充分的了解了IBE加密在格中的实现方法。IBE其实并不是一个什么大难题,因为我们已经有基于双线性配对(Bilinear Maps)的非常好的IBE系统了。

真正让Lattice突出它的强大的地方在于,我们可以从类似ABB10的IBE架构出发,逐步添加新的功能,最后就可以实现传说中的ABEAttribute-based Encryption),即属性加密了。

这一期,我们来看一看从IBE开始向ABE跨越的第一步:支持内积运算

ABE简介

乍一看支持内积运算这个词,大家都会感觉一头雾水。想要了解它是什么意思的话,我们需要了解一下ABE问题的具体定义。

想必现在网上已经有许多关于属性加密(ABE)的介绍了。我们在这里就不多说整个问题的背景知识了,而是直接给出大概的定义。

首先,整个系统和IBE是一样的,需要一组由管理员生成的MPK与MSK。拥有了MSK的管理员,就可以基于任何属性函数签发对应的私钥。什么是属性函数呢?属性函数其实就是一个读取一个属性输入的函数,如果通过了函数的验证,那么这个函数就会输出1,反之就会输出0。(反过来也可以,如果通过了输出0,没有就输出1也是一样的。)
这样的话,如果Alice要发送一封消息,她可以根据MPK与自己选择的一个属性输入创建一个特殊的公钥,进而加密她的消息。这个时候,和IBE不同的是,这个消息并不是指向某个的,而是任何人,只要拥有管理员签发的密钥,并且的话,那就可以解密这条消息。

Image

不仅如此,管理员也可以签发多个的私钥,并且分发给不同的人。这样就可以确保一条消息对应的属性只会有一部分人对应的函数可以验证通过。这样的构造对于人数众多的ACLAccess Control List)使用场景下非常有用。即如果我想要一条消息只让某个分组的人可以解密,就可以通过ABE系统来高效地实现。
对于这一类把属性函数存放在密钥sk中,然而把属性本身放在密文中的构造,我们一般都称之为KP-ABEKey Policy ABE)。反之,如果我们把验证的函数放在密文中,然而把属性放在密钥中的话, 这种构造被叫做CP-ABECiphertext Policy ABE)。
一般来说,CP-ABE更加贴合我们实际的使用逻辑一点——我们在创造密文的时候,可以决定验证的属性函数,就可以很轻松的选择到底谁能看到谁不能看到。每个人所拥有的属性密钥,就可以是他们的名字或者是身份证号。然而,现在最常见的构造仍然是KP-ABE的结构,因为CP-ABE的构造会更复杂一点(需要能够把函数嵌入在密文中并且可以快速验证属性输入)。
如果我们不需要高效这一点,我们可以把任意的KP-ABE结构转换成CP-ABE结构,即对调加密方和解密方的角色。假如我们拥有一个可以支持任意复杂度电路的属性函数的KP-ABE结构,这个时候,我们只需要生成一个对应于Universal Circuit全能电路的密钥,就足够了。
Universal Circuit 是一个万能的电路,其功能如下:我们输入一个电路的描述,与的输入,然后全能电路就可以计算这个输入的电路在上的值随后输出。在KP-ABE的场景中,我们想要通过Key中的函数来验证密钥中的输入。当Key中的函数是,即内嵌了输入的Universal Circuit的时候,这个时候密钥中的输入就变成了CP-ABE中的属性函数的电路描述。换句话说,我们可以把对于属性函数电路的描述存放在密钥中,然后通过Key中嵌入的全能电路和输入来进行计算,最后得到的值。
关于Universal Circuit的适用方法,还有很多很多,这里就不多描述了。但是的最大弊端在于这么一个全能的电路的体积是非常庞大的。如果我们把作为嵌入在中,首先能否实现巨大的复杂度先不说,就算可以实现,整体的效率也会非常低。

IBE是ABE的一种简化版本

了解完ABE是什么之后,我们回头看IBE的时候就会发现,其实IBE就是一种非常简化版本的ABE了。

IBE的问题在于,在一个系统中,每一个人都拥有属于自己的一个任意选择的“身份”,即。然后如果我想给某人发消息,我就需要基于那个人的来作为公钥进行加密。那个人会从系统管理员那里拿到属于自己的的密钥,从而就可以解开所有对着他的加密的密文了。
如果套用ABE的构造的话,那么“身份”即,就是ABE系统中的属性输入,然后验证身份所用的属性函数也很简单:
之前我们描述的ABE的属性函数对于通过的属性会输出1,这里我们为了方便后续的构造,我们颠倒一下1与0的定义,如果属性通过验证,会输出0。(这一点并不影响ABE的实现,非常的trivial。)
在ABE中,IBE只是一种非常简单的属性函数。我们观察的定义可以发现,这其实就是一个Point Function。也就是说,在整个函数的输入空间中,只有一个点(即)上对应的输出是0,其余都是1。
Point Function在所有可能的属性函数的集合中,属于最简单的一类。之前我们说到的CHKP10与ABB10这两种IBE构造都是变相的实现了Point Function ABE。
写到这里,我们不禁开始思考:我们知道ABE最后的终点就是可以实现任意复杂度的函数,但是我们目前只知道怎么实现Point Function而已。我们能不能循序渐进继续摸索下一个复杂度的函数类别呢?

内积函数

如果要超出Point Function的范畴,进入下一阶段的话,一个比较有意义的方向就是线性函数(Linear Function)了,即对于属性(可以是一个向量)的任意线性组合。我们在表达中的元素的线性组合的时候,就可以使用的内积形式来表述。举个例子:
在2011年的时候,Agrawal,Freeman与Vaikuntanathan在【AFV11】这篇paper中介绍了一种新的ABE构造,可以实现属性向量与密钥中的一个向量的内积。这里的属性函数为:
AFV11同样也是一个KP-ABE架构。这也就是说,在这个构造中,我们在密钥中嵌入一个计算与向量内积的函数。然后我们在加密的过程中在密文中嵌入属性向量。这样,如果解密方的密钥中的与密文中的的内积为0的时候,解密方就可以成功解密这个密文啦。
即然Point Function ABE就等于IBE,那么基于内积函数的ABE可以实现什么不同的功能呢?如果仔细观察的话,我们可以把一组有限长度的布尔逻辑表达式(CNF/DNF)嵌入在这个里面。这样的话,向量的每一位就代表一个boolean bit,然后中就是对应的约束。只要内积等于0,那就代表布尔逻辑验证通过了。
光是基于内积,就已经可以实现很多有限约束的逻辑了。是不是感觉很强大?

AFV11的具体构造

接下来,我们来详细的看一下AFV11 ABE是如何构造的。

内积ABE这个概念在【KSW08】中被第一次提出。其大致形式和我们之前描述的相同:在密钥中嵌入一个向量,在密文中嵌入一个向量。最后如果两者的内积为0,则拥有的密钥就可以解开携带属性的密文。
为了方便我们表述AFV11的具体结构,我们假设进行内积运算的向量的长度为4,即

 公共参数

AFV11 ABE系统的公共参数和之前介绍的CHKP10系统大致相似。首先,我们需要一个通过MP12 Trapdoor算法生成的随机平均分布的矩阵,与一个任意选择的SIS问题向量
其次,因为我们这里的内积向量长度为4,所以我们需要额外的生成4个随机平均分布的(没有Trapdoor的)矩阵

Image

这个系统的MSK就是矩阵的Trapdoor

加密矩阵与密钥生成

熟悉基于Lattice的ABE之后,想必我们都知道下一步是什么了:根据一个约束向量,如何构造ABE矩阵。AFV11中的矩阵很简单:
AFV11真正不一样的地方在于右侧,把的每一项乘以对应的矩阵,然后把结果加起来得到一个新的组合矩阵。因为基于格的方案基本上都是针对于一个bit来进行操作的,所以我们这里也额外的约束这个ABE中的向量都为二进制向量。当的时候,就等于的一个subset sum。
矩阵的左侧和往常一样,就是带有Trapdoor的矩阵,这确保了拥有MSK的管理员可以生成任何对应的密钥。对应的密钥就是其SIS问题的解:


加密算法Enc

我们知道如何根据约束向量生成和对应的密钥之后,下一步就是根据属性开始加密一段密文了。
首先,我们要做的事情是和普通的Dual Regev一样,把需要加密的原文嵌入在密文中:
其中为随机选择的一个向量,为噪音。
我们知道,光有还是不够的,我们还需要一个辅助的密文
其中为噪音向量,为噪音向量。
在普通的Dual Regev中,我们只需要知道一个对应了 SIS问题中的解,就可以把转换成一个近似的值,随后就可以把这一部分从中移除,从而还原出的值来。
但是在这里,我们不能轻易的给出这个来,而是要巧妙的设计一个结构,使得如果的时候,我们就可以得到一个近似的值,帮助我们解密。
AFV11中,这个体系的具体实现方式是这样的,我们根据这个属性向量的每一个值,分别构造出四个密文矩阵:
如果我们仔细观察这个密文矩阵的构造的话,我们会发现因为是随机选择的,所以可以当作一个完美的One-Time Pad来完全的隐藏所有的属性。
总结一下,我们的加密算法一共会生成普通的Dual Regev密文,还会额外的生成4个对应了约束的密文

解密算法Dec

现在,我们来看看最重要的环节——解密是如何进行的。

总结一下,作为一个解密方,我们会拥有一个属于自己的约束向量和对应的密钥。我们看到的密文由三部分组成:
  1. Dual Regev中蕴涵了真正的加密内容的密文
  2. 为了方便我们解开第一部分而存在的一段补充的密文
  3. 根据加密方选择的属性向量生成的一组密文
AFV11 ABE的精髓在于,已知,我们可以巧妙的组合这些信息,计算并移除密文中的One-Time Pad ,从而还原出原文来。
我们知道这些信息中,最方便我们解密的应该是我们所拥有的密钥,因为它满足了如下的等式:
接下来就是想办法构造出这个结构,从而让这个密钥发挥用武之地了。
首先,我们把的信息叠加到密文上,构成新的组合密文
如果我们展开的表达式,我们会发现其中带有的一项,如果的内积为0的话,就可以被完美的消除。这样一来,整个表达式就变成了纯粹的,这也就是我们前面用到的矩阵的一部分!
接下来,最后一步我们就是要正确的使用密钥来解密。我们拼接,并且乘上,就可以得到:
得到这个结果之后,我们就可以从中减去这一项,就可以得到密文啦!


AFV11的深入理解

由于篇幅原因,这里就不给出AFV11的安全论证了。不过大致的方案和之前相同,我们需要能够在不知道MSK和对应的任何约束情况下的密钥的条件下,可以生成任何的密钥并且符合AFV11的正确性要求。
如果我们仔细的品味一下AFV11的结构的话,我们会发现其实它在解密的时候根据的值组合这些密文的过程,和FHE同态加密运算非常的神似。就好比是我们收到了一段对于秘密属性向量的加密,然后我们同态的把的值叠加上去,得到一个新的密文。
然而这里解密的精髓非常的耐人寻味:我们事先通过MSK生成了在的情况下对应密文的一个密钥。因为解密者并不知道或者的值,所以他只能同态的计算他的与带有的密文的内积,得到一个新的密文。如果恰巧两者的内积是0的话,那么他手中的密钥就可以巧妙的“解开”新的密文,拿到帮助我们解密的
如果我们换一种方法来理解的话,我们可以把它理解为同态计算了内积的密文
这里的即基于了的值生成的
项为0之后,我们会发现整个密文失去了任何有关的信息,这也就是为什么一开始我们可以在不知道的情况下只通过MSK就能生成解开这个密文的密钥。

归纳到ABE

如果我们再进一步的观察这个结构的话,我们可以把这个结构进一步的generalize一下:

这里的就是嵌入了属性函数的矩阵
在AFV11中,我们的属性函数就是与的内积操作,即:
这里的我们可以理解为嵌入在中的一个constant。
用这种角度来看的话,我们发现,只要我们能够把的复杂度范围扩大(目前AFV11只给了我们线性内积的),那就可以用这种模式来实现任何属性函数的ABE了!
我们来尝试总结一下这种结构的ABE的大致结构:
  1. 首先使用Dual Regev来加密密文,使其隐藏在构成的的One-Time Pad中。
  2. 随后我们使用MSK生成关于本身组成的所对应的密钥
  3. 加密方把自己的属性输入嵌入在中,随后解密方同态的在上计算
  4. 如果,密文中带有的项全部都会归零,然后我们只会剩下描述。随即我们就可以使用来得到并且还原出原文
这样的结构,正是Boneh et al.提出的【BGG+14】的ABE结构!由于现在我们只解决了线性函数的计算,距离真正的ABE还差了一点距离。这一部分正是BGG+14所解决的。

写在最后

下一期,我们就来深入的了解一下BGG+14是如何构造的,以及我们如何证明齐安全性。


封面图来自unsplash,作者krismas IrN

往期回顾

格(Lattice)学习笔记之一:历史与基本概念

格(Lattice)学习笔记之二:计算问题

格(Lattice)学习笔记之三:对偶格

格(Lattice)学习笔记之四:SIS与LWE 问题

格(Lattice)学习笔记之五:基于SIS的OWF

格(Lattice)学习笔记之六:SIS的困难度论证

格(Lattice)学习笔记之七:SIS的效率与RingSIS

格(Lattice)学习笔记之八:SIS OWF的应用

格(Lattice)学习笔记之九:Ring-SIS与Ideal Lattice

格密码学进阶之一:Lattice Trapdoors(格中陷门)

格密码学进阶之二:Lattice Trapdoors Cont'd(格中陷门下篇)

格密码学进阶之三:基于格的Identity-based Encryption(身份加密)

格密码学进阶之四:更高效率的IBE(ABB10)

初探全同态加密:FHE的定义与历史回顾

初探全同态加密之二:格密码学与LWE问题

初探全同态加密之三:构建GSW全同态加密系统

浅谈零知识证明之一:背景与起源

浅谈零知识证明之二:简短无交互证明(SNARK)

浅谈零知识证明之三:zkSNARK证明体系的实现(上)

浅谈零知识证明之四:zkSNARK证明体系的实现(下)

密码学学习笔记——Sigma Protocol

密码学学习笔记——aSCV

探索零知识证明系列(一):初识「零知识」与「证明」

探索零知识证明系列(二):从「模拟」理解零知识证明

探索零知识证明系列(三):读心术:从零知识证明中提取「知识」

探索零知识证明系列(四):亚瑟王的「随机」挑战:从交互到非交互式零知识证明

探索零知识证明系列(五):云中「秘密」:构建非交互式零知识证明

zkPoD:区块链,零知识证明与形式化验证,实现无中介、零信任的公平交易

PoD-Tiny——实现零信任交易的最简协议

如果量子计算时代到来,我们的比特币安全吗?


零知识证明学习资源汇总

从零开始学习 zk-SNARK(一)——多项式的性质与证明

从零开始学习 zk-SNARK(二)——多项式的非交互式零知识证明

从零开始学习 zk-SNARK(三)——从程序到多项式的构造

从零开始学习 zk-SNARK(四)——多项式的约束

从零开始学习 zk-SNARK(五)—— Pinocchio 协议

零知识证明 Learn by Coding:libsnark 入门篇

链上富人寻「隐私」记(一:Mixer 篇)

理解零知识证明算法Bulletproofs(一):Range Proof

理解零知识证明算法Bulletproofs(二):Improved Range Proof

理解零知识证明算法Bulletproofs(三):Range Proof 实现分析

理解零知识证明算法Bulletproofs(四):Arithmetic Circuits

以太坊颠覆了以太坊:引入密码学实现2.0性能突破


Image

长按二维码添加微信进群技术讨论

邮箱 : info@secbit.io




收录于合集 #Lattice
 8
上一篇格密码学进阶之四:更高效率的IBE(ABB10)下一篇格密码学进阶之六:ABE属性加密(BGG+14)

Scan to Follow