RLWE(Ring Learning With Errors,环上带错误学习) 可以理解为标准 LWE 的 “性能压缩包” 或 “进化版”。
如果说 LWE 是现代格密码的基石,那么 RLWE 就是让格密码真正能够走进千家万户、在手机和电脑上流畅运行的最大功臣。
一、 为什么需要 RLWE?(标准 LWE 的致命痛点)
在前文介绍的 LWE 中,核心公式是 b=A⋅s+e。为了保证抗量子计算机的绝对安全,矩阵 A 必须非常大。比如在实际应用中,矩阵 A 可能是 1024×1024 的规模。
这带来了两个致命问题:
- 密钥太大了(存储痛点):一个公钥 (A,b) 可能需要占用好几 MB 的空间。当你打开一个网页进行 HTTPS 握手时,如果要传输几 MB 的密钥,网络延迟会让人崩溃。
- 计算太慢了(性能痛点):巨大的矩阵相乘需要海量的计算(复杂度是 O(n2)),低功耗设备(如智能卡、物联网设备)根本吃不消。
密码学家的解决方案:引入“多项式环(Polynomial Ring)”。把庞大且毫无规律的矩阵 A,替换成具有代数结构的多项式。这就是 Ring-LWE (RLWE)。
通过这种替换:
- 空间压缩:密钥大小从几 MB 骤降到了几 KB。
- 速度狂飙:利用快速傅里叶变换(NTT技术),多项式乘法的速度极快(复杂度降为 O(nlogn))。
二、 RLWE 的数学设定:什么是“多项式环”?
在 RLWE 中,我们不再使用普通的数字矩阵,而是使用多项式(就是中学学的 f(x)=3x2+2x+1 这种)。
为了不让多项式相乘后长度无限变长(比如 x2×x2=x4),我们设定了一个**“紧箍咒”(模多项式)**,通常是 xn+1。
这也叫**“环的折叠规则”**。
规则很简单:当多项式的最高次幂达到 n 时,就把它变成 −1。
假设设定 n=4,那么规则就是 x4=−1。如果出现 x5,它就等于 x4⋅x=−1⋅x=−x。如果出现 x6,它就等于 x4⋅x2=−1⋅x2=−x2。
通过这个规则,无论你怎么乘,多项式的最高次幂永远不会超过 x3,长度永远固定!
另外,多项式前面的系数同样对一个素数 q 取模。
三、 RLWE 的核心公式
与 LWE 高度对称,只是全变成了多项式(用 a(x) 表示):
b(x)=a(x)⋅s(x)+e(x)(modq,xn+1)
- a(x):公开的、随机生成的多项式。
- s(x):秘密多项式(私钥),系数非常小(比如只有 0, 1, -1)。
- e(x):误差多项式(噪音),系数也非常小。
- b(x):计算出来的结果多项式。公钥就是 (a(x),b(x))。
RLWE 问题就是:给你公开的 a(x) 和带噪音的结果 b(x),你求不出原始的秘密 s(x)。
四、 详细计算举例(玩具级 RLWE 实例)
4.1 公私钥生成过程
为了让你看懂多项式是如何计算并隐藏秘密的,我们来做一个手工演算。
1. 设定公开参数
- n=4:多项式最高到 x3。折叠规则是 x4=−1。
- q=13:所有系数对 13 取模(逢 13 归零,比如 14≡1 ,−1≡12)。
2. 生成密钥 (Key Generation)
假设我是接收方,我要生成我的公私钥。
- 选择随机多项式 a(x)(公开):
a(x)=4x3+x2+11x+3
- 选择秘密多项式 s(x)(私钥,系数必须很小):
s(x)=x3−x2+1
- 选择误差多项式 e(x)(噪音,系数必须很小):
e(x)=−x2+x−1
现在开始计算 b(x)=a(x)⋅s(x)+e(x):
第一步:先算乘法 a(x)⋅s(x)
(4x3+x2+11x+3)×(x3−x2+1)
通过正常的初中多项式展开,合并同类项后得到:
=4x6−3x5+10x4−4x3−2x2+11x+3
第二步:施加“紧箍咒”(模 x4+1)
把里面超过次幂的项替换掉(记住 x4=−1, x5=−x, x6=−x2):
=4(−x2)−3(−x)+10(−1)−4x3−2x2+11x+3
=−4x2+3x−10−4x3−2x2+11x+3
合并整理:
=−4x3−6x2+14x−7
第三步:系数对 q=13 取模
- −4≡9(mod13)
- −6≡7(mod13)
- 14≡1(mod13)
- −7≡6(mod13)
所以,a(x)⋅s(x)≡9x3+7x2+x+6
第四步:加上噪音 e(x)
b(x)=(9x3+7x2+x+6)+(−x2+x−1)
合并后:
b(x)=9x3+6x2+2x+5
最终结果:
- 我的公钥是:a(x)=4x3+x2+11x+3 , b(x)=9x3+6x2+2x+5
- 我的私钥是:s(x)=x3−x2+1
你可以看到,黑客拿到的公钥 b(x) 中的系数 (9,6,2,5) 看起来毫无规律。由于中间经历了多项式乘法展开、折叠相加、对 13 取模,最后还加上了未知的噪音,黑客从 b(x) 和 a(x) 根本无法倒推出 s(x)。
4.2 加密解密过程
基于发送方(Alice)和接收方(Bob),完整地走一遍**“加密真实数据”和“解密还原数据”**的过程。
- 规则限制:n=4(最高到 x3,x4=−1),q=13(所有系数对 13 取模)。
- Bob 的公钥(公开):a(x)=4x3+x2+11x+3 , b(x)=9x3+6x2+2x+5
- Bob 的私钥(保密):s(x)=x3−x2+1
第一步:准备待加密的数据(编码)
假设 Alice 想给 Bob 发送一段 4 比特的二进制密码:1011。
在 RLWE 中,数据不能直接发,必须先编码成多项式。
Alice 把 1011 的每一位作为多项式的系数(从高次到低次):
- 原始信息:M(x)=1⋅x3+0⋅x2+1⋅x+1=x3+x+1
【核心操作:信号放大】
如果在 M(x) 上直接加噪音,0 和 1 会被噪音干扰导致分不清。所以 Alice 需要把 0 和 1 拉开差距。
方法是乘以 ⌊q/2⌋(向下取整)。这里 q=13,13÷2=6.5,取 6。
Alice 把信息放大 6 倍:
- 放大后的信息:Mscale(x)=6⋅M(x)=6x3+0x2+6x+6
(记住这个目标多项式,Bob 最后解密出来的结果应该非常接近它!)
第二步:Alice 进行加密 (Encryption)
为了加密,Alice 不能直接把信息加上去,她需要自己生成几个临时的“小噪音”,用来把信息彻底打乱。
假设 Alice 随机生成了以下三个系数极小(只有 0, 1, -1)的多项式:
- 临时密钥:r(x)=x2−1
- 噪音 1:e1(x)=x
- 噪音 2:e2(x)=−1
Alice 需要计算两个密文多项式:u(x) 和 v(x)。
计算密文 1:u(x)=a(x)⋅r(x)+e1(x)(mod13)
- 算乘法并代入 x4=−1:a(x)⋅r(x)=(4x3+x2+11x+3)(x2−1)=7x3+2x2−15x−4
- 加上 e1(x) (即 x):=7x3+2x2−14x−4
- 对 13 取模(−14≡12,−4≡9):
u(x)=7x3+2x2+12x+9
计算密文 2:v(x)=b(x)⋅r(x)+e2(x)+Mscale(x)(mod13)
(把放大的信息混入第二个多项式中)
- 算乘法并代入 x4=−1:b(x)⋅r(x)=(9x3+6x2+2x+5)(x2−1)=−7x3−x2−11x−11≡6x3+12x2+2x+2
- 加上噪音 e2(x) (即 −1):=6x3+12x2+2x+1
- 加上放大的信息 6x3+6x+6:
=(6+6)x3+12x2+(2+6)x+(1+6)
=12x3+12x2+8x+7
v(x)=12x3+12x2+8x+7
发送密文:Alice 把 (u(x),v(x)) 通过互联网发送给 Bob。黑客在路上截获了这个,由于没有任何规律,黑客完全看不懂。
第三步:Bob 进行解密 (Decryption)
Bob 收到了 (u(x),v(x))。此时只有 Bob 手里有私钥 s(x)=x3−x2+1。
Bob 使用著名的解密公式(类似抵消魔法):
解密结果 = v(x)−u(x)⋅s(x)(mod13)
-
Bob 先算 u(x)⋅s(x):
(7x3+2x2+12x+9)(x3−x2+1)
经过多项式展开并施加 x4=−1 的“紧箍咒”后,得到:
=4x3−14x2+17x−1≡4x3+12x2+4x+12(mod13)
-
Bob 用 v(x) 减去上面的结果:
v(x)−u(x)s(x)
=(12x3+12x2+8x+7)−(4x3+12x2+4x+12)
=(12−4)x3+(12−12)x2+(8−4)x+(7−12)
=8x3+0x2+4x−5
-
对 13 取模(−5≡8):
解密出来的多项式 = 8x3+0x2+4x+8
第四步:Bob 提取最终数据(见证奇迹的时刻)
Bob 看着解密出来的多项式 8x3+0x2+4x+8。
由于密码学中充满了不可控的微小噪音,这个结果并不是 Alice 当初构造的完美的 6x3+0x2+6x+6。
但这完全不影响!Bob 只需要用**“四舍五入”**的逻辑来判断:
因为密码对 13 取模,一半是 6.5。
- 如果系数接近 0(比如 0, 1, 2 或者 11, 12),那它原本代表的就是 比特 0。
- 如果系数接近 6(比如 4, 5, 6, 7, 8),那它原本代表的就是 比特 1。
Bob 开始逐个检查解密结果的系数 (8,0,4,8):
- x3 的系数是 8:距离 6 比较近(误差是 2),所以第一位是
1。
- x2 的系数是 0:就是 0,所以第二位是
0。
- x1 的系数是 4:距离 6 比较近(误差是 2),所以第三位是
1。
- 常数项的系数是 8:距离 6 比较近(误差是 2),所以第四位是
1。
Bob 把它们拼起来,成功得到了:1011。
与 Alice 发送的信息完全一致!
五、为什么可行
5.1 核心逻辑:为什么公开矩阵 a(x) 会消失?
让我们把黑客视角和 Bob(接收方)视角拉平,看看所有的参数是怎么生成的:
- Bob 的公钥构成:b=a⋅s+e (这里面藏着私钥 s 和原始噪音 e)
- Alice 发送的密文 1:u=a⋅r+e1 (用来锁定临时密钥 r)
- Alice 发送的密文 2:v=b⋅r+e2+Mscale (把真实数据混入其中)
黑客的困境:黑客拿到了 u 和 v,但他不知道 s。对他来说,a 是随机的,b 看似随机,u 和 v 也全是被打乱的随机多项式。
Bob 的魔法:Bob 拿到了 u 和 v,但他手里有私钥 s。
Bob 执行的解密公式是:v−u⋅s
见证奇迹的代数推导(请跟着一步步看):
我们把 v 和 u 的本来面目代入到 Bob 的公式中:
解密结果 =(b⋅r+e2+Mscale)−(a⋅r+e1)⋅s
接下来,我们把公钥 b 的本来面目(b=a⋅s+e)也代入进去:
=((a⋅s+e)⋅r+e2+Mscale)−(a⋅r+e1)⋅s
展开括号(利用初中的乘法分配律):
=a⋅s⋅r+e⋅r+e2+Mscale−a⋅r⋅s−e1⋅s
【高能预警:抵消发生了!】
仔细看上面的式子,里面有一个 a⋅s⋅r,后面还有一个 −a⋅r⋅s。
在多项式乘法中,顺序互换结果不变(s⋅r=r⋅s)。
所以:巨大的、用来掩护的随机多项式 a⋅s⋅r 被完美抵消成了 0!
把抵消后的式子重新整理,解密结果就变成了:
解密结果 = Mscale+(e⋅r+e2−e1⋅s)
你看懂了吗?那个极其复杂的 a(x) 和 b(x) 彻底消失了!
剩下的只有两部分:
- Mscale:Alice 想要发送的被放大的真实数据(信号)。
- (e⋅r+e2−e1⋅s):一堆小噪音的组合(总噪音)。
5.2 结合我们的例子,算算“总噪音”到底有多大
刚才我们说,解密结果 = 真实信号 + 总噪音。
在刚才的例子中,Bob 算出的解密结果是:8x3+0x2+4x+8
而 Alice 放大的真实信号是:6x3+0x2+6x+6
两者的差值,也就是实际产生的总噪音,等于:
(8−6)x3+(0−0)x2+(4−6)x+(8−6)
=2x3+0x2−2x+2
这个总噪音大吗?非常小!系数只有 2、0、-2、2。
为什么它这么小?我们回到总噪音的公式:Etotal=e⋅r+e2−e1⋅s
在密码学设定中,我们强制要求所有的噪音和私钥(e,r,e2,e1,s)都必须是非常小的数字(比如例子里的 1, 0, -1)。
几个极小的数字互相相乘、相加:
- 小 × 小 = 还是小
- 小 + 小 = 稍微变大一点点,但依然很小。
密码学家在设计参数时(比如设定 q=13,限制 n=4),会用严密的概率论证明:无论怎么组合,这个总噪音 Etotal 的系数绝对值,极大概率不会超过 q/4(在我们这里也就是绝对不会超过 3.25)。
5.3 为什么噪音无法破坏数据?(信号与噪音的物理抗衡)
现在我们明白了,Bob 拿到的最终多项式,每一项的系数其实都是:
Bob看到的系数 = 原始信号 (0 或 6) + 噪音 (±2 左右)
这就是我们整个系统切实可行的最后一道保障——四舍五入(阈值判定):
- 如果 Alice 原本发送的是
0:
信号是 0。Bob 看到的系数 = 0± 小噪音。
在我们的例子中,第二项噪音是 0,所以 Bob 看到的是 0。它离 0 最近,Bob 判定为 0。
- 如果 Alice 原本发送的是
1:
信号被放大了,变成了 6(也就是 q/2)。Bob 看到的系数 = 6± 小噪音。
在我们的例子中:
- 第一项:6+2=8
- 第三项:6−2=4
- 第四项:6+2=8
虽然 8 和 4 都不是 6,但它们在对 13 取模的“圆环”上,都死死地聚拢在 6 的周围,远离 0。Bob 只需要问自己一句:“8 是离 6 近,还是离 0 近?”答案显而易见是 6。所以 Bob 判定为
1。
六、 总结与现状
- 本质:RLWE 就是把 LWE 中的矩阵替换成了多项式。
- 优点:大幅减小了密钥尺寸(体积变小),大大提升了运算速度(可以使用 FFT/NTT 加速多项式乘法)。
- 安全性牺牲了吗? 密码学家证明了,虽然多项式引入了代数结构,但破解 RLWE 的难度依然等价于求解理想格(Ideal Lattice)上的最坏情况困难问题,目前没有发现有效的量子攻击算法。