直白理解 NTRU 公钥加密系统
0. 摘要(Abstract)
本文将探讨 NTRU 公钥加密系统(NTRU Public Key Cryptosystem)。
NTRU 由 Joseph Silverman、Jeffery Hoffstein 和 Jill Pipher 于 1996 年提出。
该系统利用截断多项式环(truncated polynomial rings)来实现数据的加密与解密。
在 2013 年,NTRU 被正式开放至公共领域(public domain),供公众自由使用。
本文将描述NTRU加密系统的工作原理,并介绍如何使用该系统进行基本的加密与解密操作。
0.1 引言(Introduction)
密码学(Cryptography)的历史最早可追溯到尤利乌斯·凯撒(Julius Caesar)和古罗马时期。
自那时起,密码学在政府及民间的安全通信中都发挥了重要作用。
一个密码系统(cryptosystem)包含两个核心过程:
- 加密(encryption):将明文信息转换为难以辨认的文本或数字形式;
- 解密(decryption):将加密信息还原为原始内容。
私钥加密系统和公钥加密系统都已公开可用,但公钥加密系统相较于私钥加密系统具有某些优势。
NTRU 加密系统 属于一种 公钥密码系统,由 Joseph Silverman、Jeffery Hoffstein 和 Jill Pipher 在 1996 年设计完成。
- 最初,NTRU 仅以商业授权形式发布;
- 直到 2013 年,它才被完全开放到公共领域,允许自由使用。
NTRU 的安全性基于某些计算数学问题的公认难度,以及解决这些问题所需的极其长的时间。这些计算问题由NTRU加密系统实现中选定的特定数值参数所定义。
本文旨在通过研究 NTRU 加密系统,帮助读者理解其原理并掌握如何使用它安全地加密消息和数据。
文末还将进一步讨论NTRU加密系统的安全性分析。
为此:
- 必须了解截断多项式环,
- 将消息转换为二进制,
- 以及将这些二进制位串转换为多项式。
1. 预备知识(Preliminary Background)
1.1 密码系统(Cryptosystems)
密码学(Cryptography) 是研究在存在第三方的情况下,如何安全地共享信息的一门科学。
在密码学中,存在多种具体的加密系统(cryptosystem),每个系统都包含独立的加密、解密与密钥生成过程。
- 加密(Encryption):将明文信息转换为无意义的字母或数字组合;
- 解密(Decryption):执行加密的逆过程,将密文还原为原文。
每个加密系统中:
- 都需要定义一些数值参数来决定加密细节。这些参数称为 加密密钥(encryption keys)。
- 同样地,解密过程中使用的数值参数称为 解密密钥(decryption keys)。
为了说明这一概念,在此以凯撒密码(Caesar Cipher)为例。
假设明文为:
“HELLO WORLD”
若将每个字母在字母表中向后平移两位,则可得到密文:
“JGNNQ YQTNF”
此时的加密密钥为:
key=+2\text{key} = +2 key=+2
要将密文“JGNNQ YQTNF”解回明文“HELLO WORLD”,则需将每个字母向前平移两位:
key=−2\text{key} = -2 key=−2
在凯撒密码中,任何 1 至 25 之间的整数都可作为密钥使用。
上面的凯撒密码是私钥加密系统(Private Key Cryptosystem)的一个例子。
在这种系统中:
- 加密和解密使用的是同一个密钥;
- 一旦知道加密密钥,就能轻易求出解密密钥;
- 因此,密钥必须在通信双方之间保密。
- 这也是“私钥(Private Key)加密系统”这一名称的由来。
与私钥加密系统相对,存在一种称为公钥加密系统(public key cryptosystem)的概念。
在公钥加密系统中,会生成一对密钥:
- 加密密钥(encryption key)
—— 该密钥是公开的(public key),任何人都可以使用它来加密消息; - 解密密钥(decryption key)
—— 该密钥必须由密钥持有者严格保密(private key),用于解密。
需要注意的是:公钥与私钥并不相同。
正如前文提到的,NTRU 就是公钥加密系统的一个例子。
1.2 模运算(Modular Arithmetic)
设 mmm 为一个正整数,aaa 为任意整数。
表达式:
a(modm)a \pmod{m} a(modm)
表示唯一的非负整数 rrr,满足:
0≤r<m,a−r是 m的整数倍。0 \le r < m, \quad a - r \text{ 是 } m \text{ 的整数倍。} 0≤r<m,a−r 是 m 的整数倍。
也就是说,当写作:
a≡b(modm)a \equiv b \pmod{m} a≡b(modm)
意味着 aaa 与 bbb 在除以 mmm 时得到相同的余数,因此它们的差值 aaa − bbb 是 mmm 的倍数。
其中 mmm 称为模数(modulus)。
模运算同样支持加法、减法与乘法。对于任意整数 a, b,有:
a(modm)+b(modm)≡a+b(modm)a(modm)−b(modm)≡a−b(modm)a(modm)×b(modm)≡ab(modm)\begin{aligned} a \pmod{m} + b \pmod{m} &\equiv a + b \pmod{m} \\ a \pmod{m} - b \pmod{m} &\equiv a - b \pmod{m} \\ a \pmod{m} \times b \pmod{m} &\equiv ab \pmod{m} \end{aligned} a(modm)+b(modm)a(modm)−b(modm)a(modm)×b(modm)≡a+b(modm)≡a−b(modm)≡ab(modm)
当两个整数 aaa 与 mmm 的唯一正公因数为 111 时,称二者是相对互质的(relatively prime)。
若 aaa 与 mmm 相对互质,则存在一个整数 bbb(称为 aaa 在模 mmm 下的逆元(modular inverse)),满足:
ab≡1(modm)ab \equiv 1 \pmod{m} ab≡1(modm)
在 NTRU 加密系统 中,模运算是作用在多项式(polynomials)上的。因此,上述性质同样可以推广至多项式的运算。
设多项式 a\mathbf{a}a 和 b\mathbf{b}b 的形式如下:
a=a0+a1X+a2X2+⋯+aN−1XN−1+aNXNb=b0+b1X+b2X2+⋯+bN−1XN−1+bNXN\begin{aligned} \mathbf{a} &= a_0 + a_1X + a_2X^2 + \dots + a_{N-1}X^{N-1} + a_NX^N \\ \mathbf{b} &= b_0 + b_1X + b_2X^2 + \dots + b_{N-1}X^{N-1} + b_NX^N \end{aligned} ab=a0+a1X+a2X2+⋯+aN−1XN−1+aNXN=b0+b1X+b2X2+⋯+bN−1XN−1+bNXN
其中所有系数均为整数。
记 ab\mathbf{a}\mathbf{b}ab 为多项式 a\mathbf{a}a 与 b\mathbf{b}b 的乘积。
表达式:
ab(modm)\mathbf{a}\mathbf{b} \pmod{m} ab(modm)
表示对乘积 ab\mathbf{a}\mathbf{b}ab 的每个系数 ccc 取 c(modm)c \pmod mc(modm) 所得到的多项式。
如设:
a=2+5X3,b=X+X2+6X3,m=2\mathbf{a} = 2 + 5X^3, \\ \mathbf{b} = X + X^2 + 6X^3, \\ m = 2 a=2+5X3,b=X+X2+6X3,m=2
首先进行普通多项式乘法:
ab=2X+2X2+12X3+5X4+5X5+30X6\mathbf{a}\mathbf{b} = 2X + 2X^2 + 12X^3 + 5X^4 + 5X^5 + 30X^6 ab=2X+2X2+12X3+5X4+5X5+30X6
然后对每个系数取模 222(即保留余数):
ab(mod2)=X4+X5\mathbf{a}\mathbf{b} \pmod{2} = X^4 + X^5 ab(mod2)=X4+X5
1.3 截断多项式环(Truncated Polynomial Rings)
设 k 为任意正整数。定义:
Zk=0,1,2,…,k−1\mathbb{Z}_k = {0, 1, 2, \dots, k-1} Zk=0,1,2,…,k−1
表示模 kkk 的整数环(ring of integers modulo kkk)。
固定一个正整数 NNN。
令 T\mathbf{T}T 表示所有系数属于 Zk\mathbb{Z}_kZk 且阶数不超过 N−1N−1N−1 的多项式集合。
若 a,b∈T\mathbf{a}, \mathbf{b} \in \mathbf{T}a,b∈T,则它们的形式为:
a=a0+a1X+a2X2+⋯+aN−2XN−2+aN−1XN−1b=b0+b1X+b2X2+⋯+bN−2XN−2+bN−1XN−1\begin{aligned} \mathbf{a} &= a_0 + a_1X + a_2X^2 + \dots + a_{N-2}X^{N-2} + a_{N-1}X^{N-1} \\ \mathbf{b} &= b_0 + b_1X + b_2X^2 + \dots + b_{N-2}X^{N-2} + b_{N-1}X^{N-1} \end{aligned} ab=a0+a1X+a2X2+⋯+aN−2XN−2+aN−1XN−1=b0+b1X+b2X2+⋯+bN−2XN−2+bN−1XN−1
其中:
a0,a1,…,aN−1,b0,b1,…,bN−1∈Zka_0, a_1, \dots, a_{N-1},\ b_0, b_1, \dots, b_{N-1} \in \mathbb{Z}_k a0,a1,…,aN−1, b0,b1,…,bN−1∈Zk
集合 T\mathbf{T}T 中的加法运算按通常方式进行,即对相同阶数项的系数逐一相加:
a+b=(a0+b0)+(a1+b1)X+⋯+(aN−1+bN−1)XN−1\mathbf{a} + \mathbf{b} = (a_0 + b_0) + (a_1 + b_1)X + \dots + (a_{N-1} + b_{N-1})X^{N-1} a+b=(a0+b0)+(a1+b1)X+⋯+(aN−1+bN−1)XN−1
显然,a+b\mathbf{a} + \mathbf{b}a+b 仍属于 T\mathbf{T}T。
对于集合 T\mathbf{T}T 中的一对多项式 a\mathbf{a}a 和 b\mathbf{b}b ,如果直接使用普通的多项式乘法,所得积 ab\mathbf{a}\mathbf{b}ab 的阶数可能会大于 N−1N − 1N−1,从而不再属于 T\mathbf{T}T。
因此,希望重新定义乘法,使得乘积 ab\mathbf{a}\mathbf{b}ab 仍属于 T\mathbf{T}T。
显然,两个阶数为 NNN 的多项式相乘,其结果的阶数将大于 N−1N − 1N−1。
为了解决这一问题,对于每一个大于 N−1N − 1N−1 的整数 mmm,将 XmX^mXm 替换为 XrX^rXr,其中:
r=mmodNr = m \bmod N r=mmodN
即 rrr 是 mmm 除以 NNN 的最小非负余数。
然后,系数依然按通常方式相加。由此得到的积 ab\mathbf{a}\mathbf{b}ab 一定属于 T\mathbf{T}T。
如,设:
N=5a=2+X+X3b=8X+5X2+2X4N = 5 \\ \mathbf{a} = 2 + X + X^3 \\ \mathbf{b} = 8X + 5X^2 + 2X^4 N=5a=2+X+X3b=8X+5X2+2X4
则:
ab=(2+X+X3)(8X+5X2+2X4)=16X+10X2+4X4+8X2+5X3+2X5+8X4+5X5+2X7=16X+18X2+5X3+12X4+7X5+2X7∉T\begin{aligned} \mathbf{a}\mathbf{b} &= (2 + X + X^3)(8X + 5X^2 + 2X^4) \\ &= 16X + 10X^2 + 4X^4 + 8X^2 + 5X^3 + 2X^5 + 8X^4 + 5X^5 + 2X^7 \\ &= 16X + 18X^2 + 5X^3 + 12X^4 + 7X^5 + 2X^7 \notin T \end{aligned} ab=(2+X+X3)(8X+5X2+2X4)=16X+10X2+4X4+8X2+5X3+2X5+8X4+5X5+2X7=16X+18X2+5X3+12X4+7X5+2X7∈/T
根据前述规则,将高阶项按模 N=5N = 5N=5 进行截断:
=16X+18X2+5X3+12X4+7X5+2X7=(7+0)X0+16X+(18+2)X2+5X3+12X4=7+16X+20X2+5X3+12X4∈T\begin{aligned} &=16X + 18X^2 + 5X^3 + 12X^4 + 7X^5 + 2X^7 \\ &= (7 + 0)X^0 + 16X + (18 + 2)X^2 + 5X^3 + 12X^4 \\ &= 7 + 16X + 20X^2 + 5X^3 + 12X^4 \in T \end{aligned} =16X+18X2+5X3+12X4+7X5+2X7=(7+0)X0+16X+(18+2)X2+5X3+12X4=7+16X+20X2+5X3+12X4∈T
将这种多项式称为截断多项式(truncated polynomial)。
显然,集合 T\mathbf{T}T 在加法与乘法下封闭,并且这两种二元运算都满足结合律与分配律,
因此 T\mathbf{T}T 构成一个环(ring)。
1.4 截断多项式的逆元(Inverses of Truncated Polynomials)
为了使NTRU加密系统能够正常工作,需要在指定模数下找到某个多项式的逆元。
设:
- p∈T\mathbf{p}\in \mathbf{T}p∈T 为一个多项式;
- qqq 为一个整数。
有时,可以找到另一个多项式 P∈T\mathbf{P} \in \mathbf{T}P∈T,使得:
pP≡1(modq)\mathbf{p}\mathbf{P} \equiv 1 \pmod{q} pP≡1(modq)
需要注意的是,并非所有多项式 p\mathbf{p}p 都存在逆元。
如:
p=X+X2,P=2+X,q=2,N=3\mathbf{p} = X + X^2, \\ \mathbf{P} = 2 + X, \\ q = 2, \\ N = 3 p=X+X2,P=2+X,q=2,N=3
则有:
pP(mod2)=(X+X2)(2+X)=2X+X2+X2+X3=2X+2X2+X3≡1+2X+2X2(mod2)≡1\begin{aligned} \mathbf{p}\mathbf{P} &\pmod{2} = (X + X^2)(2 + X) \\ &= 2X + X^2 + X^2 + X^3 \\ &= 2X + 2X^2 + X^3 \\ &\equiv 1 + 2X + 2X^2 \pmod{2} \\ &\equiv 1 \end{aligned} pP(mod2)=(X+X2)(2+X)=2X+X2+X2+X3=2X+2X2+X3≡1+2X+2X2(mod2)≡1
因此,在该例中,P\mathbf{P}P 是 p\mathbf{p}p 在模 q=2q=2q=2 下的逆元。
1.5 字母到二进制的转换(Letter to Binary Conversion)
在计算机中,所有消息、文本、图像等都会被转换为由 0 和 1 组成的比特串,
通常使用 ASCII(American Standard Code for Information Interchange) 编码。
NTRU 加密系统也遵循相同的思想,因此,理解这种转换方式是必要的。
这种转换非常简单,而且是确定的,因此可以使用现成的 ASCII 对照表(见本文附录)。
2. NTRU 公钥加密系统(NTRU Public Key Cryptosystem)
2.1 参数(Parameters)
NTRU 加密系统有多个不同的版本,其中一些为了提高安全性而更为复杂。
本文讨论的是最基本的 NTRU 版本,仅使用三个主要参数。
(更复杂的版本可能包含更多参数。)
本系统使用了在 1.3 节 定义的集合 T\mathbf{T}T。
这三个参数是:
- NNN:多项式环中多项式的维度;
- qqq:一个选定的较大模数;
- ppp:一个选定的较小模数。
2.2 生成密钥(Generating a Key)
假设 Bob 想使用 NTRU 加密系统 向 Alice 发送一条消息。
在此之前,Alice 必须先创建她的加密密钥(encryption key)和解密密钥(decryption key)。
-
1)步骤 1:选择随机多项式
Alice 从环 T\mathbf{T}T 中随机选择两个多项式 f\mathbf{f}f 和 g\mathbf{g}g。
这两个多项式都需要是“较小的(small)”,即它们的系数相对于模 qqq 下的随机多项式来说比较小。
换句话说,它们的每个系数都不能超过 qqq。 -
2)步骤 2:计算 f\mathbf{f}f 的逆元 【取 (f,fp)(\mathbf{f},\mathbf{f}_p)(f,fp) 为私钥】
接下来,Alice 分别在模 qqq 和模 ppp 下计算 f\mathbf{f}f 的逆元。
若 f\mathbf{f}f 在这些模下可逆,则满足:
ffq≡1(modq)(1)\mathbf{f} \mathbf{f}_q \equiv 1 \pmod{q} \tag{1} ffq≡1(modq)(1)
以及
ffp≡1(modp)(2)\mathbf{f} \mathbf{f}_p \equiv 1 \pmod{p} \tag{2} ffp≡1(modp)(2)
其中:- fq\mathbf{f}_qfq:表示 f\mathbf{f}f 在模 qqq 下的逆元;
- fp\mathbf{f}_pfp:表示 f\mathbf{f}f 在模 ppp 下的逆元。
如果在任意一个模数下逆元不存在,Alice 必须重新随机选择另一个 f\mathbf{f}f,直到找到一个同时满足 (1) 与 (2) 的多项式为止。
-
3)步骤 3:生成公钥 h\mathbf{h}h
当 Alice 找到一个可逆的 f\mathbf{f}f 后,她计算如下多项式:
h=pfqg(modq)\mathbf{h} = p \mathbf{f}_q \mathbf{g} \pmod{q} h=pfqg(modq)
此时:
- 私钥(private key) 是多项式对:(f,fp)(\mathbf{f}, \mathbf{f}_p)(f,fp),必须保密;
- 公钥(public key) 是多项式 h\mathbf{h}h,可以公开发布给任何人。
2.3 加密(Encryption)
当 Alice 生成好她的密钥对后,她将公钥 h\mathbf{h}h 公布给外界。
此时,Bob 就可以用这个公钥向 Alice 发送加密消息。
-
1)步骤 1:消息多项式化
Bob 首先将他的消息转换为一个多项式 m\mathbf{m}m,其系数取模 ppp,使得 m\mathbf{m}m 成为模 qqq 下的“较小”多项式。 -
2)步骤 2:选择随机掩码
Bob 还需选择一个随机的小多项式 r\mathbf{r}r,用于混淆消息内容。
这可以增加安全性,使非目标接收者更难解密。 -
3)步骤 3:生成密文
Bob 使用多项式 m\mathbf{m}m、r\mathbf{r}r 以及 Alice 的公钥 h\mathbf{h}h,计算:
e=rh+m(modq)\mathbf{e} = \mathbf{r} \mathbf{h} + \mathbf{m} \pmod{q} e=rh+m(modq)
其中:- e\mathbf{e}e:即为加密后的消息(ciphertext)。
随后,Bob 将多项式 e\mathbf{e}e 发送给 Alice。
2.4 解密(Decryption)
当 Alice 收到 Bob 的密文后,她需要将其解密回原始消息。
- 1)步骤 1:计算多项式 a\mathbf{a}a
Alice 使用她的多项式 f\mathbf{f}f 计算:
a=fe(modq)\mathbf{a} = \mathbf{f} \mathbf{e} \pmod{q} a=fe(modq) - 2)步骤 2:计算多项式 b\mathbf{b}b
然后对多项式 a\mathbf{a}a 取模 ppp,得到:
b=a(modp)\mathbf{b} = \mathbf{a} \pmod{p} b=a(modp) - 3)步骤 3:计算多项式 c\mathbf{c}c
最后,Alice 使用她的 fp\mathbf{f}_pfp(即 f\mathbf{f}f 在模 ppp 下的逆元)计算:
c=fpb(modp)\mathbf{c} = \mathbf{f}_p \mathbf{b} \pmod{p} c=fpb(modp)
结果多项式 c\mathbf{c}c 就是 Bob 最初发送的明文消息 m\mathbf{m}m。
正确性验证:
环 T\mathbf{T}T 的结构,以及逆元的存在,使得 Alice 能够解出 Bob 的消息。
当 Alice 计算 a\mathbf{a}a 时,实际上她是在计算:
a=fe(modq)=f(rh+m)(modq)=f(rpfqg+m)(modq)=ffqprg+fm(modq)=prg+fm(modq)\begin{aligned} \mathbf{a} & = \mathbf{f} \mathbf{e} \pmod{q}\\ &= \mathbf{f} (\mathbf{r} \mathbf{h} + \mathbf{m}) \pmod{q} \\ &= \mathbf{f} (\mathbf{r} p \mathbf{f}_q \mathbf{g} + \mathbf{m}) \pmod{q} \\ &= \mathbf{f} \mathbf{f}_q p \mathbf{r} \mathbf{g} + \mathbf{f} \mathbf{m} \pmod{q} \\ &= p \mathbf{r} \mathbf{g} + \mathbf{f} \mathbf{m} \pmod{q} \end{aligned} a=fe(modq)=f(rh+m)(modq)=f(rpfqg+m)(modq)=ffqprg+fm(modq)=prg+fm(modq)
由于多项式的所有系数都远小于模数 qqq,且 p≪qp \ll qp≪q,因此在取模 qqq 时不发生数值截断或折返,即系数保持不变。
于是有:
a=prg+fm\mathbf{a} = p \mathbf{r} \mathbf{g} + \mathbf{f} \mathbf{m} a=prg+fm
从而有:
b=a(modp)=prg+fm(modp)=fm(modp)\begin{aligned} \mathbf{b} & = \mathbf{a} \pmod{p}\\ &= p \mathbf{r} \mathbf{g} + \mathbf{f} \mathbf{m} \pmod{p} \\ &= \mathbf{f} \mathbf{m} \pmod{p} \end{aligned} b=a(modp)=prg+fm(modp)=fm(modp)
因为有:
c=fpb(modp),\mathbf{c} = \mathbf{f}_p \mathbf{b} \pmod{p}, c=fpb(modp),
而 b=fm(modp)\mathbf{b} = \mathbf{f} \mathbf{m} \pmod{p}b=fm(modp),从而有:
c=fpb(modp)=fpfm(modp)=m(modp)=m\begin{aligned} \mathbf{c} & = \mathbf{f}_p \mathbf{b} \pmod{p} \\ &= \mathbf{f}_p \mathbf{f} \mathbf{m} \pmod{p} \\ &= \mathbf{m} \pmod{p} \\ & = \mathbf{m} \end{aligned} c=fpb(modp)=fpfm(modp)=m(modp)=m
因此,Alice 成功恢复了原始消息 m\mathbf{m}m。
2.5 NTRU 的一个使用示例
为了演示 NTRU 加密系统的使用,首先需要选择整数 NNN、ppp 和 qqq。
设:
N=11,q=32,p=3.N = 11, \quad q = 32, \quad p = 3. N=11,q=32,p=3.
接下来,需要选择一个多项式 f\mathbf{f}f,使得它在模 ppp 和模 qqq 下均存在逆元,并且选择另一个多项式 g\mathbf{g}g。
设:
f=−1+X+X2−X4+X6+X9−X10\mathbf{f} = -1 + X + X^2 - X^4 + X^6 + X^9 - X^{10} f=−1+X+X2−X4+X6+X9−X10
以及:
g=−1+X+X2+X3−X8−X10.\mathbf{g} = -1 + X + X^2 + X^3 - X^8 - X^{10}. g=−1+X+X2+X3−X8−X10.
对应的逆元为:
fp=1+2X+2X3+2X4+X5+2X7+X8+2X9\mathbf{f}_p = 1 + 2X + 2X^3 + 2X^4 + X^5 + 2X^7 + X^8 + 2X^9 fp=1+2X+2X3+2X4+X5+2X7+X8+2X9
以及:
fq=5+9X+6X2+16X3+4X4+15X5+16X6+22X7+20X8+18X9+30X10.\mathbf{f}_q = 5 + 9X + 6X^2 + 16X^3 + 4X^4 + 15X^5 + 16X^6 + 22X^7 + 20X^8 + 18X^9 + 30X^{10}. fq=5+9X+6X2+16X3+4X4+15X5+16X6+22X7+20X8+18X9+30X10.
由于公钥的定义为:
h=pfqg(modq).\mathbf{h} = p \mathbf{f}_q \mathbf{g} \pmod{q}. h=pfqg(modq).
使用上述数值计算得:
h=pfqg(modq)=18+6X+21X2+16X3+2X4+21X5+X6+17X7+30X8+3X9+25X10\begin{aligned} \mathbf{h} & = p \mathbf{f}_q \mathbf{g} \pmod{q} \\ & = 18 + 6X + 21X^2 + 16X^3 + 2X^4 + 21X^5 + X^6 + 17X^7 + 30X^8 + 3X^9 + 25X^{10} \end{aligned} h=pfqg(modq)=18+6X+21X2+16X3+2X4+21X5+X6+17X7+30X8+3X9+25X10
现在得到了 h\mathbf{h}h——即为 公钥,可以向外界公开,以便他人向我们发送加密消息。
接下来,来尝试发送一条消息——假设要发送的消息是 “Hi”。
为了将这条消息转换为多项式形式,首先需要将每个字母转换为对应的 二进制(binary) 表示。这可以通过附录中的 ASCII 表完成。
因此:
H=1001000H = 1001000 H=1001000
i=1101001i=1101001 i=1101001
要将它们转换为多项式,只需在相应的二进制位上加上 XXX 的幂次即可:
H=X3+X6H = X^3 + X^6 H=X3+X6
i=1+X3+X5+X6i = 1 + X^3 + X^5 + X^6 i=1+X3+X5+X6
令它们分别为多项式 m1\mathbf{m}_1m1 和 m2\mathbf{m}_2m2。
在使用公钥 h\mathbf{h}h 加密消息之前,必须选择一个随机多项式 r\mathbf{r}r。
设:
r=1+X+X2+X7.\mathbf{r} = 1 + X + X^2 + X^7. r=1+X+X2+X7.
由于加密消息定义为:
e=rh+m1(modq).\mathbf{e} = \mathbf{r} \mathbf{h} + \mathbf{m}_1 \pmod{q}. e=rh+m1(modq).
因此,使用 m1\mathbf{m}_1m1 计算得:
e=rh+m1(modq)=14+6X+14X2+29X3+5X4+18X5+18X6+7X7+10X8+7X9+22X10\begin{aligned} e & = \mathbf{r} \mathbf{h} + \mathbf{m}_1 \pmod{q} \\ &= 14 + 6X + 14X^2 + 29X^3 + 5X^4 + 18X^5 + 18X^6 + 7X^7 + 10X^8 + 7X^9 + 22X^{10} \end{aligned} e=rh+m1(modq)=14+6X+14X2+29X3+5X4+18X5+18X6+7X7+10X8+7X9+22X10
要解密 m1\mathbf{m}_1m1,首先计算 a\mathbf{a}a。
根据解密中定义:
a=fe(modq).\mathbf{a} = \mathbf{f} \mathbf{e} \pmod{q}. a=fe(modq).
代入 f\mathbf{f}f 与 e\mathbf{e}e,得:
a=fe(modq)=6+5X+2X2+8X3+5X4+3X5+29X6+3X7+X8+X9+28X10\begin{aligned} a &= \mathbf{f} \mathbf{e} \pmod{q} \\ &= 6 + 5X + 2X^2 + 8X^3 + 5X^4 + 3X^5 + 29X^6 + 3X^7 + X^8 + X^9 + 28X^{10} \end{aligned} a=fe(modq)=6+5X+2X2+8X3+5X4+3X5+29X6+3X7+X8+X9+28X10
接着根据 b=a(modp)\mathbf{b}=\mathbf{a}\pmod pb=a(modp),有:
b=a(modp)=2X+2X2+2X3+2X4+2X6+X8+X9+X10\begin{aligned} \mathbf{b} & = \mathbf{a} \pmod{p} \\ & = 2X + 2X^2 + 2X^3 + 2X^4 + 2X^6 + X^8 + X^9 + X^{10} \end{aligned} b=a(modp)=2X+2X2+2X3+2X4+2X6+X8+X9+X10
根据公式 c=fpb(modp)\mathbf{c} = \mathbf{f}_p \mathbf{b} \pmod{p}c=fpb(modp),计算:
c=fpb(modp)=X3+X6=m1\begin{aligned} \mathbf{c} &= \mathbf{f}_p \mathbf{b} \pmod{p} \\ & = X^3 + X^6 \\ & = \mathbf{m}_1 \end{aligned} c=fpb(modp)=X3+X6=m1
接下来,对消息 m2\mathbf{m}_2m2 重复相同的过程。仍然使用之前相同的随机多项式 r\mathbf{r}r。
因此,加密过程为:
e=rh+m2(modq)=17+6X+14X2+29X3+5X4+11X5+18X6+25X7+22X8+7X9+10X10\begin{aligned} \mathbf{e} & = \mathbf{r} \mathbf{h} + \mathbf{m}_2 \pmod{q} \\ & = 17 + 6X + 14X^2 + 29X^3 + 5X^4 + 11X^5 + 18X^6 + 25X^7 + 22X^8 + 7X^9 + 10X^{10} \end{aligned} e=rh+m2(modq)=17+6X+14X2+29X3+5X4+11X5+18X6+25X7+22X8+7X9+10X10
为了解密 m2\mathbf{m}_2m2,再次计算:
a=fe(modq)=6+3X2+18X3+3X4+5X5+14X6+25X7+X8+X9+8X10\begin{aligned} \mathbf{a} & = \mathbf{f} \mathbf{e} \pmod{q} \\ & = 6 + 3X^2 + 18X^3 + 3X^4 + 5X^5 + 14X^6 + 25X^7 + X^8 + X^9 + 8X^{10} \end{aligned} a=fe(modq)=6+3X2+18X3+3X4+5X5+14X6+25X7+X8+X9+8X10
然后取模 ppp:
b=a(modp)=2X5+X6+X7+X8+X9+X10\begin{aligned} \mathbf{b} & = \mathbf{a} \pmod{p} \\ & = 2X^5 + X^6 + X^7 + X^8 + X^9 + X^{10} \\ \end{aligned} b=a(modp)=2X5+X6+X7+X8+X9+X10
最后,计算:
c=fpb(modp)=1+X3+X5+X6=m2\begin{aligned} \mathbf{c} & = \mathbf{f}_p \mathbf{b} \pmod{p} \\ & = 1 + X^3 + X^5 + X^6 \\ & = \mathbf{m}_2 \end{aligned} c=fpb(modp)=1+X3+X5+X6=m2
现在得到了该消息的两个部分 m1\mathbf{m}_1m1 和 m2\mathbf{m}_2m2,即完整的原始消息。
2.6 NTRU 的安全性
NTRU 的安全性基于某些计算数学问题的计算难度以及解决这些问题所需的极高时间成本。
这些计算问题由系统实现时选择的数值参数 N,q,pN, q, pN,q,p 所定义。通过对这些参数施加特定条件,可以进一步提高系统的安全性。
在 NTRU 加密系统中,目前已知唯一可行的攻击方法是基于格(lattice-based)的攻击。
这种攻击方式通过建立一个方程组,试图求解某个多项式。该方程组对应一个大小为 N×NN \times NN×N 的矩阵。
目前已知存在几种格攻击,其中最复杂的一种仅在 N<100N < 100N<100 时,能在大约 40 分钟 内破解 NTRU。
虽然格攻击在 N<100N < 100N<100 时确实有效,但可以通过设置特定条件来提高 NTRU 的安全性。
如,可以令 NNN 取较大的值:
- 若 N=200N = 200N=200,则系统具有中等安全性(moderate security);
- 若 N=500N = 500N=500,则系统具有高安全性(high security)。
这是因为,虽然计算机能够求解大型矩阵,但当破解时间需要数周甚至数年时,攻击就变得不可行。
如,当 N=500N = 500N=500 时,预计破解所需时间约为 8.4 年。
此外,如果参数 ppp 和 qqq 被选为较大且相对互素(relatively prime),则求解整个系统的难度将进一步增加。
3. 附录:ASCII 字母与二进制对照表
ASCII 字母与二进制的对应关系:
| 字母 | 二进制表示 | 字母 | 二进制表示 |
|---|---|---|---|
| A | 1000001 | a | 1100001 |
| B | 1000010 | b | 1100010 |
| C | 1000011 | c | 1100011 |
| D | 1000100 | d | 1100100 |
| E | 1000101 | e | 1100101 |
| F | 1000110 | f | 1100110 |
| G | 1000111 | g | 1100111 |
| H | 1001000 | h | 1101000 |
| I | 1001001 | i | 1101001 |
| J | 1001010 | j | 1101010 |
| K | 1001011 | k | 1101011 |
| L | 1001100 | l | 1101100 |
| M | 1001101 | m | 1101101 |
| N | 1001110 | n | 1101110 |
| O | 1001111 | o | 1101111 |
| P | 1010000 | p | 1110000 |
| Q | 1010001 | q | 1110001 |
| R | 1010010 | r | 1110010 |
| S | 1010011 | s | 1110011 |
| T | 1010100 | t | 1110100 |
| U | 1010101 | u | 1110101 |
| V | 1010110 | v | 1110110 |
| W | 1010111 | w | 1110111 |
| X | 1011000 | x | 1111000 |
| Y | 1011001 | y | 1111001 |
| Z | 1011010 | z | 1111010 |
参考资料
[1] 2019年论文《Understanding the NTRU Public Key Cryptosystem》
