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

NTRU 公钥加密系统详解

1. 引言

现代大多数密码算法与协议的安全性都依赖于某些数学问题的计算困难性,如:

  • 两个大素数乘积的因数分解问题(RSA);
  • 某些群上的离散对数问题(Diffie–Hellman 密钥交换、ElGamal 加密系统)。

这些问题被认为没有有效的(多项式时间)解法,因此任何基于这些问题的密码协议至少应当同样难以被破解。
只要假设潜在攻击者的计算能力有限,就可以认为这些协议是安全的。

然而,这种假设在量子计算机出现后将不再成立。
如果攻击者拥有量子计算能力(几年内或许并非天方夜谭),许多此类算法问题(或其中一部分)将变得 容易求解。

如,RSA 的模数 N=pqN = p qN=pq 可以通过 Shor 算法 在多项式时间内被分解。
因此,RSA 以及许多其他流行协议,如 Diffie–Hellman 密钥交换、ElGamal 加密、DES、ECC(椭圆曲线密码)等,都将失效。
这些方案必须被新的、在量子计算假设下仍安全的算法所取代。

幸运的是,有一些数学问题被认为在 经典计算机与量子计算机上都难以求解。
这类后量子密码算法包括以下几大类:

  • 基于哈希(hash-based)密码;
  • 基于纠错码(code-based)密码;
  • 基于多元二次方程(MQ,multivariate-quadratic-equations)密码;
  • 基于格(lattice-based)密码。

其中,NTRU(包括 NTRUEncrypt 与 NTRUSign) 就是一种基于格中特殊点计算困难性的公钥密码系统。

2. 格(Lattices)

一个 nnn 维格可以想象为 nnn 维空间中的一个规则点阵。
它是以下形式的向量(点)集合:
L(v1,v2,…,vn)={∑i=1naivi∣ai∈Zfor 1≤i≤n},\begin{equation} L(v_1, v_2, \dots, v_n) = \biggl\{ \sum_{i=1}^n a_iv_i \mid a_i \in \mathbb{Z} \text{ for } 1 \leq i \leq n \biggr\}, \end{equation} L(v1,v2,,vn)={i=1naiviaiZ for 1in},

其中 v1,v2,…,vn∈Znv_1, v_2, \dots, v_n \in \mathbb{Z}^nv1,v2,,vnZn 为线性无关的整数向量(称为格LLL的基向量)。

如,在二维空间中,一个简单的格就是所有整数坐标点的集合(此时 v1=[0,1]v_1 = [0,1]v1=[0,1]v2=[1,0]v_2 = [1,0]v2=[1,0])。
等价地说,一个格就是在某个基下具有整数坐标的所有点的集合。

可以将这些基向量组成矩阵 B∈Zn×nB \in \mathbb{Z}^{n \times n}BZn×n 的列,于是格也可写为:
L(B)=L([v1,v2,…,vn])=L(v1,v2,…,vn)={Bx∣x∈Zn}.\begin{equation} L(B) = L([v_1, v_2, \dots, v_n]) = L(v_1, v_2, \dots, v_n) = \lbrace Bx \mid x \in \mathbb{Z}^n\rbrace. \end{equation} L(B)=L([v1,v2,,vn])=L(v1,v2,,vn)={BxxZn}.

现在定义一个模 qqq 的格(即点的坐标都在模 qqq 下取值)——qqq-进制格(qqq-ary Lattice)。

取任意矩阵 A∈Zqn×mA \in \mathbb{Z}_q^{n\times m}AZqn×m(具有nnnmmm列的整数矩阵),定义:
Lq(A)={y∈Zm∣y=ATsmod q,s∈Zn}\begin{equation} L_q(A) = \lbrace y \in \mathbb{Z}^m \mid y = A^Ts \text{ mod } q,\, s \in \mathbb{Z}^n\rbrace \end{equation} Lq(A)={yZmy=ATs mod q,sZn}

该定义足以引出格密码学(lattice-based cryptography)中3个最核心、计算上极为困难的问题:

  • 1)SVP – 最短向量问题(Shortest Vector Problem)
    给定一个 nnn 维格 LLL 的基向量 v1,v2,…,vnv_1, v_2, \dots, v_nv1,v2,,vn,求出 LLL 中最短的非零向量。
  • 2)CVP – 最近向量问题(Closest Vector Problem)
    给定一个 nnn 维格 LLL 的基向量 v1,v2,…,vnv_1, v_2, \dots, v_nv1,v2,,vn,以及某个向量 vvv,求出 LLL 中 最接近 vvv 的向量。
  • 3)SIVP – 最短线性无关向量问题(Shortest Independent Vector Problem)
    给定一个 nnn 维格 LLL 的基向量 v1,v2,…,vnv_1, v_2, \dots, v_nv1,v2,,vn,求出一组新的基向量 v1′,v2′,…,vn′v'_1, v'_2, \dots, v'_nv1,v2,,vn,使得该组基向量中 最长向量的长度最小化。

其中 “向量的长度” 通常指 欧几里得范数(Euclidean norm),其定义为:
∥x∥n=∥[x1,x2,…,xn]∥n=x12+x22+⋯+xn2.\newcommand{\norm}[1]{\left\lVert#1\right\rVert} \norm{x}_n = \norm{[x_1, x_2, \dots, x_n]}_n = \sqrt{x_1^2 + x_2^2 + \dots + x_n^2}. xn=[x1,x2,,xn]n=x12+x22++xn2.

格密码的基本思想是:

  • 一个格(lattice)可以用 许多不同的基向量集(basis) 来表示。
    • 某些基向量集非常“简单”,容易计算;
    • 而另一些则非常“复杂”,即使要找到SVP/CVP最短向量的多项式近似解,也需要进行极其复杂的计算。

在格密码中,寻找 SVP 近似解的最常用方法是 LLL 算法(Lenstra–Lenstra–Lovász)。

该算法能够在多项式时间内找到“相对较短”的向量,但这种近似的精度有限——LLL 只保证找到的向量长度不超过:
(23)Ns\left(\frac{2}{\sqrt{3}}\right)^Ns(32)Ns

其中 sss 是该格中最短向量的长度。在很多实际应用中,这样的近似仍不足以解决 SVP 或 CVP 的困难性。

一般认为:

  • CVP 问题是 NP 完全的;
  • SVP 问题是 NP 困难的(尚未被严格证明)。

因此,目前没有有效算法能近似求解这些问题。

3. GGH 算法(Goldreich–Goldwaser–Halevi)

格密码中最早的两个公钥方案是 GGH 和 NTRUEncrypt。

然而在 2008 年,P. Nguyen 指出了 GGH 协议存在信息泄露与结构性缺陷,使其安全性基石(CVP 难解性)被削弱,因此GGH算法现已被认为不安全。

尽管如此,GGH 仍然很好地展示了如何利用 CVP 的困难性构建一个公钥系统。

来看两个格基(ZN\mathbb{Z}^NZN 中的 NNN 个线性无关向量):

  • BBBHHH

可以以这样的方式生成 BBBHHH,使得 L(B)=L(H)L(B) = L(H)L(B)=L(H) —— 也就是说,这两个基都生成同一个格 L=L(B)=L(H)L = L(B) = L(H)L=L(B)=L(H)
其中:

  • BBB 是容易处理的(几乎正交,其向量尽可能短),
  • HHH 则不是 —— 仅凭 HHH,在格 LLL 中求解 最短向量问题(SVP) 和 最近向量问题(CVP) 都是困难的。

BBB 设为私钥,将 HHH 设为公钥。
加密的过程非常简单:

  • 取任意向量 v∈Lv \in LvL,并将其与另一个向量 mmm(消息)相加。
    密文因此为:
    c=v+m.c = v + m. c=v+m.

解密的过程是:

  • 找到一个在格 LLL 中最接近 ccc 的点 v′v'v(希望它与加密时选择的 vvv 相同),然后将其从 ccc 中减去。
    • 这一操作只有在给定基 BBB 的情况下才能高效完成,因为有了 BBB,就可以容易地解决最近向量问题(CVP)。

如果 v=v′v = v'v=v,则能成功解密密文,并得到:
m′=c−v′.m' = c - v'. m=cv.
为了保证 m=m′m = m'm=m,必须选择一个“相对较短”的消息向量 mmm,以确保最接近的格点确实是 vvv

这个协议的描述是非常简化的,但它很好地展示了该加密思想的基本原理。

4. NTRUEncrypt

与其他任何公钥密码系统一样,为了实现安全通信,需要私钥和公钥各一份,并定义两个函数:
Encrypt(message,public_key)\texttt{Encrypt}(\texttt{message}, \texttt{public\_key}) Encrypt(message,public_key)

Decrypt(ciphertext,private_key).\texttt{Decrypt}(\texttt{ciphertext}, \texttt{private\_key}). Decrypt(ciphertext,private_key).

此外,假设存在一些对所有参与者都已知的全局参数:

  • NNN —— 一个整数,决定“维度”;
  • ppp, qqq —— 两个互质的整数模数(gcd(p,q)=1gcd(p, q) = 1gcd(p,q)=1);
  • dfd_fdf, dgd_gdg, drd_rdr, dmd_mdm —— 用于限定私钥、公钥以及消息空间的整数边界。

在 NTRU 中,加密与解密是以多项式的形式描述的(定义在 Z[X]/(XN−1)\mathbb{Z}[X]/(X^N - 1)Z[X]/(XN1) 环上),其中系数是整数、阶数 ≤N−1\leq N - 1N1
这只是比使用格向量更一致的一种描述方式,本质思想保持不变。

在 NTRU 中,需要三种多项式运算:

  • 1)卷积乘积(Convolutional product)
  • 2)多项式求逆
  • 3)模整数的多项式约简

4.1 卷积乘积(Convolutional Product)运算

两个多项式 fffggg 的卷积乘积定义为:
f⋆g=∑i+j=kmodNfigj,f \star g = \sum_{i + j = k \bmod N} f_i g_j, fg=i+j=kmodNfigj,

其中:
f=∑i=0N−1fixi,g=∑i=0N−1gixi.f = \sum_{i=0}^{N-1} f_i x^i, \quad g = \sum_{i=0}^{N-1} g_i x^i. f=i=0N1fixi,g=i=0N1gixi.

这意味着,在对两个多项式做“普通”乘法之后,还必须将所有 XXX 的指数 模 NNN 进行约简。
换言之,指数在 NNN 上循环(即 XN=1X^N = 1XN=1)。

4.2 多项式的逆元(Inverse Polynomial)运算

多项式 fff 的逆元 f−1f^{-1}f1 定义为满足下式的多项式:
f⋆f−1=f−1⋆f=1.f \star f^{-1} = f^{-1} \star f = 1. ff1=f1f=1.

4.3 多项式模 qqq 约简(Reduction Modulo qqq)运算

将多项式模 qqq 约简,意味着对多项式的所有系数取模 qqq

4.4 系数计数符号

还将使用记号 #af\#_a f#af,表示多项式 fff 中系数等于 aaa 的项的数量。

如,当 N=5N = 5N=5 时:
f(x)=2x4+2x3+x+3f(x) = 2x^4 + 2x^3 + x + 3 f(x)=2x4+2x3+x+3

则有:
#0f=1#1f=1#2f=2#3f=1\#_0 f = 1 \\ \#_1 f = 1 \\ \#_2 f = 2 \\ \#_3 f = 1 #0f=1#1f=1#2f=2#3f=1

4.5 私钥(Private Key)

私钥由两个多项式 fffggg 组成,它们满足:【即系数由0,1,−10,1,-10,1,1组成】

  • #1f=df, #−1f=df−1, and #0f=N−2df+1\#_{1}f = d_f\text{, }\#_{-1}f = d_f-1\text{, and }\#_{0}f = N-2d_f+1#1f=df#1f=df1, and #0f=N2df+1
  • #1g=#−1g=dg, and #0g=N−2dg\#_{1}g = \#_{-1}g = d_g\text{, and }\#_{0}g=N-2d_g#1g=#1g=dg, and #0g=N2dg
  • 要求 fff 在模 qqq 意义下可逆,即存在多项式 fp−1f_p^{-1}fp1fq−1f_q^{-1}fq1,使得:
    f⋆fp−1=1(modp),f \star f_p^{-1} = 1 \pmod p, ffp1=1(modp),
    f⋆fq−1=1(modq).f \star f_q^{-1} = 1 \pmod q. ffq1=1(modq).

因此,私钥为 (f,g)(f, g)(f,g) pair。出于效率考虑,fq−1f_q^{-1}fq1 通常在密钥生成阶段计算并作为私钥的一部分存储。

4.6 公钥(Public Key)

公钥的定义非常简单:
h=fq−1⋆g(modq).h = f_q^{-1} \star g \pmod q. h=fq1g(modq).

4.7 加密(Encryption)

NTRU 的加密过程为:

  • 1)首先,消息需要被编码成一个三元(trinary)多项式消息 mmm,并且必须满足:
    #1m=#−1m=dm, and #0m=N−2dm\#_1m=\#_{-1}m=d_m \text{, and } \#_0m=N-2d_m #1m=#1m=dm, and #0m=N2dm
  • 2)然后,需要生成一个随机多项式 rrr,其形式与消息类似:
    #1r=#−1r=dr, and #0r=N−2dr.\#_1r=\#_{-1}r=d_r\text{, and }\#_0r=N-2d_r. #1r=#1r=dr, and #0r=N2dr.
  • 3)接着,密文 ccc 定义为:
    c=m+pr⋆hmod q,c = m + pr\star h \text{ mod } q, c=m+prh mod q,
    其中,密文 ccc 的系数要模 qqq 约简,使其落在区间 (−q2,q2]\left(-\frac{q}{2}, \frac{q}{2}\right](2q,2q] 内,从而使 密文 ccc 的值以 0 为中心。

4.8 解密(Decryption)

解密过程非常直接,只需将 密文 ccc 与私钥多项式 fff 进行卷积乘积(⋆\star):
c⋆f=f⋆m+f⋆pr⋆hmod q=f⋆m+pr⋆f⋆fq−1⋆gmod q=f⋆m+pr⋆gmod qc\star f = f\star m + f\star pr \star h \text{ mod }q\\ = f\star m + pr \star f \star f_q^{-1}\star g \text{ mod } q\\ = f \star m + pr \star g \text{ mod } q cf=fm+fprh mod q=fm+prffq1g mod q=fm+prg mod q

由此,可以通过模 ppp 运算来得到 f⋆mf \star mfm
f⋆m=(f⋆m+pr⋆gmod q)mod p,f\star m = (f \star m + pr \star g \text{ mod } q) \text { mod } p, fm=(fm+prg mod q) mod p,

最后,再将结果乘以 fp−1f_p^{-1}fp1 即可还原明文 mmm

4.9 NTRUEncrypt 算法

上述算法被称为 NTRUEncrypt(NTRU 加密算法)。
结合 NTRUSign(NTRU 签名算法),两者共同构成了 NTRU 公钥密码系统。
该系统最早发表于论文 “NTRU: A New High Speed Public Key Cryptosystem”(1996)。

目前,关于 NTRU 参数取值有多种公开资料。
常见的典型参数如下:

  • p=3p = 3p=3
  • q=211=2048q = 2^{11} = 2048q=211=2048
  • NNN 通常为质数,如 443443443587587587743743743(具体取决于所需安全级别)

学术界已有多篇论文专门讨论 NTRU 参数选择及其安全性分析。

5. 最后说明(Final Remarks)

NTRUEncrypt 除了能抵御量子计算攻击之外,还具备其他多项优点,如:

  • 比 RSA 更高效、更快速;
  • 计算和存储开销更低。

关于 后量子密码学(Post-Quantum Cryptography) 与 NTRU 加密体系 的更多深入资源,如:

  • Post-quantum cryptography

本文仅为简化说明,旨在帮助理解 NTRUEncrypt 算法背后的基本概念与思想。
若需进行更深入或正式的研究,请参考原始论文、官方标准及技术规范。

参考资料

[1] 2019年11月8日博客 NTRU public key cryptosystem explained

http://www.dtcms.com/a/528793.html

相关文章:

  • 深入浅出 VGGNet:经典卷积神经网络解析
  • 盐城整站优化柳州做网站去哪家公司好
  • 协程:实战与系统集成(高级篇)
  • 芯片验证基石UVM:高效验证的方法论与挑战
  • 旅游网站开发的作用seo快排技术教程
  • 3DS-GBA-GBC-NDS-switch梦可宝精灵游戏合集 -全汉化游戏
  • VCS Verdi 2023安装
  • R语言~T检验
  • 春季大扫除:清理 Arch Linux 中的垃圾
  • 未在props中声明的属性
  • php网站iis设置同心食品厂网站建设项目任务分解
  • 中国启用WPS格式进行国际交流:政策分析与影响评估
  • 中文域名做的网站有哪些网站域名怎么做分录
  • Docker使用【镜像】
  • 全链路智能运维中的业务连续性保障与容灾切换机制
  • linux的文件系统
  • 英语四级真题完整版(1990-2025)|2025年6月最新试题+答案解析|可打印PDF
  • 网站开发 项目的人员分配建筑工程网络计划编制软件
  • React 06
  • 红河县网站建设昆明网站建设哪家
  • 社区互助养老系统设计与实现方案
  • 服装购物商城网站建设安徽六安旅游必去十大景点
  • 「用Python来学微积分」14. 连续函数的运算与初等函数的连续性
  • 红酒商城网站建设广告设计案例网站
  • Linux内核进程管理子系统有什么第六十七回 —— 进程主结构详解(63)
  • 哪个网站可以接针织衫做单淘宝上找人做网站
  • C++容器deque
  • 【NestJS】 OpenAPI文档:运行时动态生成揭秘
  • 关闭VSCode的GitHub Copilot功能
  • 网站页面设计版权企业做网站这些问题必须要注意