密码学简介
上文的图例基本展示了常见加密体系。加密体系,如果用比较正式的描述方法,无疑是做了三件事:
- 首先,通过一个生成算法 𝐾𝑒𝑦𝐺𝑒𝑛(1𝜆) 来随机生成一对用于加密和解密的密钥 (𝐸𝑛𝑐𝐾𝑒𝑦,𝐷𝑒𝑐𝐾𝑒𝑦) 。
- 加密方通过加密密钥 𝐸𝑛𝑐𝐾𝑒𝑦 和加密算法 𝐸𝑛𝑐𝑟𝑦𝑝𝑡𝑖𝑜𝑛 来加密原文 𝑃𝑙𝑎𝑖𝑛𝑡𝑒𝑥𝑡 ,最后得到密文 𝐶𝑖𝑝ℎ𝑒𝑟𝑡𝑒𝑥𝑡 。
- 随后,在解密的时候,解密方可以通过解密密钥 𝐷𝑒𝑐𝐾𝑒𝑦 和解密算法 𝐷𝑒𝑐𝑟𝑦𝑝𝑡𝑖𝑜𝑛 来解密密文,最后还原回来原来的原文。
在密码学研究中,每当我们看到一个新的系统的定义之后,接下来往往都要陈述这个系统所应具有的属性(Properties)。
首先,我们第一个要实现的属性是正确性(Correctness)。正确性代表说,如果我拥有一个正确的密钥,那么我就可以通过解密算法 𝐷𝑒𝑐𝑟𝑦𝑝𝑡𝑖𝑜𝑛 来把密文还原成原文。我们往往都使用概率的方法来表示解密的成功率:
∀𝑝𝑡∈𝑃𝑇,(𝑘𝑒𝑛𝑐,𝑘𝑑𝑒𝑐)←𝐾𝑒𝑛𝐺𝑒𝑛(1𝜆): 𝑃𝑟[𝐷𝑒𝑐𝑟𝑦𝑝𝑡𝑖𝑜𝑛(𝑘𝑑𝑒𝑐,𝐸𝑛𝑐𝑟𝑦𝑝𝑡𝑖𝑜𝑛(𝑘𝑒𝑛𝑐,𝑝𝑡))=𝑝𝑡]=1
上面的等式代表了,如果我们拥有正确的密钥,那么解密算法可以还原加密算法生成的密文的几率是100%。
我们要实现的第二个属性是语义安全(Semantic Security)。
具体对于语义安全的定义,我们在这里不多做解释了。但是我们可以理解为,如果我们拥有任意两个不同的原文所对应的密文,那么我们是无法区分到底哪个密文是对应了哪个原文的:
∀𝑚0,𝑚1:{𝐸𝑛𝑐(𝑘𝑒𝑛𝑐,𝑚0)}≈𝑐{𝐸𝑛𝑐(𝑘𝑑𝑒𝑐,𝑚1)}
语义安全的主要意义在于旁观者无法区分两条加密的消息。那么如果有入侵者窃听网络,看到了我发出的加密信息,只要我使用的加密体系是语义安全的,那么我就可以确信入侵者无法从密文中得到关于加密内容的任何信息。
满足了上述两条属性之后,一个加密体系就变得健全啦。
什么是全同态
加密算法加法同态
假如我们拥有两条消息 𝑚0,𝑚1 的加密,分别为 𝑐𝑡0,𝑐𝑡1 ,展开来就是:
𝑐𝑡0=(𝑣0=𝑔𝑦0,𝑒0=𝑝𝑘𝑦0⋅𝑔𝑚0)
𝑐𝑡1=(𝑣1=𝑔𝑦1,𝑒1=𝑝𝑘𝑦1⋅𝑔𝑚1)
我们可以注意到,如果我们把两条密文的两个部分各自相乘的话,我们就可以得到一个新的密文 𝑐𝑡^ :
𝑐𝑡=𝑐𝑡0⋅𝑐𝑡1=(𝑣=𝑔𝑦0+𝑦1,𝑒^=𝑝𝑘𝑦0+𝑦1⋅𝑔𝑚0+𝑚1)
我们得到的结果恰恰就是原文 𝑚0+𝑚1 加在一起之后所对应的加密密文!这样的话,如果我们得到了两条加密算法的密文,我们就可以通过这样的方法得到密文的任意线性组合了。
加密算法乘法同态
同理我们也可以应用于乘法同态加密的算法上—— 𝐹 就只能把所有的私密输入相乘起来,但是没有办法做任何线性组合(加法)。乘法同态的例子其实也非常常见,我们大家都熟悉的RSA加密就是一个乘法同态的系统。
RSA加密的实现方法大致如下:
- 首先找到一个很大的数字 𝑁=𝑝⋅𝑞 ,并且 𝑝,𝑞 为质数。然后找到一组数字 𝑒,𝑑 使得可以满足 𝑒⋅𝑑=1 mod (𝑝−1)(𝑞−1) 。我们把 (𝑁,𝑒) 作为公钥, (𝑁,𝑑) 作为私钥。
- 如果要加密一个消息 𝑚 ,我们只需要输出密文 𝑐𝑡←𝑚𝑒 mod 𝑁 。
- 如果需要解密一个消息 𝑐𝑡 ,我们只需要还原出原文 𝑚←𝑐𝑡𝑑 mod 𝑁 。
这个加密算法的正确性就在于 (𝑚𝑒)𝑑=𝑚 mod 𝑁 。因为RSA加密和解密的过程也就只涉及到了幂的计算,我们又可以观察到同态的性质了。假如说我们有两条加密的消息 𝑐𝑡0,𝑐𝑡1 对应 𝑚0,𝑚1 。那么我们可以把他们相乘起来得到 𝑐^ ,并且可以观察到:
𝑐^=𝑐𝑡0⋅𝑐𝑡1=𝑚0𝑒⋅𝑚1𝑒=(𝑚0⋅𝑚1)𝑒
我们就得到了这两条消息相乘之后所对应的密文!这就是乘法同态性质了,我们可以接着这条密文继续往上叠加新的密文,这样一来我们就可以得到密文之间任意的相乘。
部分同态加密(Partially Homomorphic Encryption)
同态加密最初级的阶段被称为部分同态加密,定义就是密文只有一种同态特性。这一阶段就包括了我们上文所描述的加法同态与乘法同态两种模式。
近似同态加密(Somewhat Homomorphic Encryption)
部分同态加密的下一阶段是近似同态加密。如果我们有近似同态加密算法的话,那么我们就可以在密文上同时计算加法与乘法了。但是需要注意的是,正因为这一阶段是近似同态(Somewhat Homomorphic)的,所以可以做的加法和乘法次数非常有限,可以计算的函数 𝐹 也在一个有限的范围内。
在某些特殊的循环群中,我们还可以找到一些薄弱的乘法同态性质。
配对(Pairing)是基于某些特有的椭圆曲线循环群可以进行的一种特殊运算,我们用 𝑒(⋅,⋅) 来表示。具体Pairing做的事情,就是把两个循环群中的值映射到第三个循环群中:
𝑒(𝑔𝑥∈𝐺,𝑔𝑦∈𝐺)→𝑔𝑇𝑥𝑦∈𝐺𝑇
这样一来,我们就变相的得到了前两个值的幂之间的乘积组合!Pairing这一特殊属性并不会出现在所有的循环群当中。所以如果我们把两个可以做Pairing的群中的值通过Pairing相乘起来,映射到了一个新的群 𝐺𝑇 当中之后,那么新的群并不一定能找到对应的Pairing属性!
这也就是说,通过拥有Pairing属性的循环群,我们只能做非常有限的乘法计算。假如说我们当前的群 𝐺 支持Pairing,但是新的映射群 𝐺𝑇 并不支持任何Pairing,那就代表了如果我们要基于当前的体系进行同态加密运算,可以运算的函数F虽然可以包涵任意的线性组合,但是只能包涵最多一层乘法在里面。
这一局限性证明了这个系统是近似同态的,因为我们不能计算任意逻辑和深度的函数F。
有限级数全同态加密(Fully Leveled Homomorphic Encryption)
我们已经可以对密文进行任意的加法乘法组合了,没有任何对于次数的局限性。之所以被称之为有限级数全同态的原因是,这个阶段的算法会引入一个新的复杂度上限 𝐿 的概念,这一复杂度上限约束了函数 𝐹 的复杂度。如果我们可以把 𝐹 用二进制电路 𝐶 来表示的话,那么 𝐶 的深度和大小一定要在 𝐿 的范围之内,即:
∣𝐶∣≤𝐿
也就是说,如果L相对来说比较大的话,那么我们就可以进行各种各样较为简单(低复杂度)的同态运算了。有限级数同态加密的算法也是下一阶段全同态加密的奠基石,当我们实现了L复杂度以内的全同态之后,实现完全同态也不远了。
我们可以了解一下这个复杂度的上限 𝐿 是怎么来的。首先,我们可以想象一下,假如有一个全同态加密的算法,可以对密文进行任何的加法与乘法的运算。但是这个算法在加密的时候会在密文里面加入一定的随机噪音。
当噪音早可控范围内的时候,那么解密算法就可以很容易从密文还原回原文。但是当我们叠加密文在一起进行同态计算的时候,每一个密文里面自带的噪音会被叠加扩大。如果我们只是对密文进行比较简单的逻辑,那么叠加起来的噪音还在一个可以接受的范围。但是如果我们过于复杂地堆叠密文在一起,那么一旦噪音的范围超过了临界值,那么就会彻底的覆盖掉原来的原文,从而导致解密会失败。
在这个场景中,这个同态加密系统可以接受的噪音上限转换为叠加的逻辑的复杂度的话就是 𝐿 了。这就是为什么我们只可以进行复杂度小于L的计算,因为一旦复杂度超过L,我们就再也无法还原回原来的原文了。
全同态
什么叫做「全」(Fully)?
● 在密码学中,加密方案可以支持多种操作,比如加法、乘法等。当我们说一个加密方案是「全同态」的,我们意味着这个加密方案支持在加密数据上进行任意数目的基本运算(例如加法和乘法)而不需要解密。这与部分同态加密(如只支持加法或只支持乘法的方案)形成对比。
什么叫做「同态」(Homomorphic)?
● “同态”来自于希腊文,意思是「相同的形状或结构」。在密码学中,当我们说加密方案是同态的,意味着有些运算在明文上的效果与在密文上的效果是一样的。换句话说,如果你在加密的数据上进行某种运算,然后解密结果,这和你先解密数据然后在解密后的数据上进行相同的运算是等价的。
例如,考虑一个支持同态加法的加密方案。假设你有两个数字:3 和 4。你可以先加密这两个数字,然后使用这个同态加密方案将两个加密的数字相加。最后,你解密相加后的结果。得到的解密结果将是 7,这与你直接在明文 3 和 4 上相加得到的结果是一样的。
全同态在大模型应用
全同模态应用场景
全同态加密框架
这张图描述了一个基于全同态加密技术的用户与服务器交互的过程,具体步骤如下:
- 用户生成引导密钥(Generate Bootstrapping Key):用户首先生成一个引导密钥,这个密钥将在后续的交互中使用。
- 服务器接收引导密钥(Send Bootstrapping Key):用户将生成的引导密钥发送给服务器。
- 用户加密提示(Encrypt Prompt):用户使用引导密钥对输入的提示进行加密。
- 服务器接收加密提示(Send Encrypted Prompt):用户将加密后的提示发送给服务器。
- 服务器推断提示(Inference on Prompt):服务器接收到加密的提示后,使用相应的算法进行推断或计算。由于提示是加密的,服务器无法直接读取提示的内容。
- 用户接收加密输出(Receive Encrypted Output):服务器将推断或计算后的加密输出发送给用户。
- 用户解密输出(Decrypt Output):用户使用引导密钥对服务器返回的加密输出进行解密,从而得到最终的结果。
这个过程确保了用户输入的提示在传输和处理过程中的安全性,因为所有的数据都是以加密形式进行传输和处理的。服务器只能对加密数据进行运算,而无法获取原始的明文数据。
大模型全同态加密实现
在 TFHE 中,模型权重和激活均用整数表示。非线性函数必须通过可编程自举 (Programmable Bootstrapping,PBS) 操作来实现。PBS 对加密数据实施查表 (table lookup,TLU) 操作,同时刷新密文以支持 任意计算。不好的一面是,此时 PBS 的计算时间在线性运算中占主导地位。利用这两种类型的运算,你可以在 FHE 中表达任何子模型的计算,甚至完整的 LLM 计算。
Zama 的解决方案是使用全同态加密 (FHE),在加密数据上执行函数。这种做法可以实现两难自解,既可以保护模型所有者知识产权,同时又能维护用户的数据隐私。在 FHE 中实现的 LLM 模型保持了原始模型的预测质量。使用 Concrete-Python 对推理部分进行改造,这样就可以将 Python 函数转换为其 FHE 等效函数。
概述了一个简化的底层实现。在这个方案中,模型权重会被分成两个部分,分别存储在客户端和服务端。首先,客户端在本地开始推理,直至遇到已第一个不在本地的层。用户将中间结果加密并发送给服务端。服务端对其执行相应的注意力机制计算,然后将结果返回给客户端,客户端对结果进行解密并继续在本地推理。
小结
密码学简介
密码学是研究如何保护信息的科学,它涉及加密和解密算法的设计和分析。在密码学中,一个常见的加密系统包括以下三个主要部分:
- 密钥生成算法:用于生成一对用于加密和解密的密钥(公钥和私钥)。
- 加密算法:使用公钥对明文进行加密,生成密文。
- 解密算法:使用私钥对密文进行解密,还原为明文。
一个健全的加密系统应该满足两个基本属性:
- 正确性:如果使用正确的密钥进行解密,应该能够准确地还原出原始的明文。
- 语义安全:即使攻击者获得了密文,也无法获得关于明文的任何有用信息。
同态加密
同态加密是一种特殊的加密技术,它允许在加密数据上进行某些操作,而不需要先解密数据。根据支持的操作类型,同态加密可以分为以下几种类型:
- 部分同态加密:只支持一种类型的操作,如加法或乘法。
- 近似同态加密:支持加法和乘法操作,但操作的次数有限。
- 有限级数全同态加密:支持任意次数的加法和乘法操作,但操作的复杂度受到限制。
- 全同态加密:支持任意次数的加法和乘法操作,没有复杂度限制。
全同态加密是最强的同态加密类型,它允许在加密数据上进行任意的计算,而不需要先解密数据。这使得全同态加密在保护数据隐私的同时,仍然能够进行复杂的计算。
全同态加密在大模型中的应用
全同态加密在大模型中的应用主要体现在保护用户的隐私和模型的知识产权。通过使用全同态加密技术,用户可以在不暴露原始数据的情况下,使用大模型进行计算和推理。同时,模型的所有者也可以保护其模型的知识产权,因为在加密数据上进行的计算不会暴露模型的内部结构和参数。
具体来说,全同态加密可以应用于大模型的训练和推理过程中。在训练过程中,可以使用全同态加密技术对训练数据进行加密,然后在加密数据上进行模型的训练。这样可以保护训练数据的隐私,同时仍然能够训练出有效的模型。在推理过程中,用户可以通过全同态加密技术对输入数据进行加密,然后将加密数据发送给模型进行推理。模型在加密数据上进行计算,并将结果返回给用户,用户解密后即可得到最终的结果。
总之,全同态加密技术为大模型的应用提供了一种强大的隐私保护机制,使得用户可以在不暴露原始数据的情况下,安全地使用大模型进行各种计算和推理任务。
参考:
https://finance.sina.cn/blockchain/2023-10-18/detail-imzrpiwi7756862.d.html
https://zhuanlan.zhihu.com/p/149812445