NTRU 加密系统原理及示例:NTRU、CTRU以及ITRU
1. NTRU加密系统
NTRU 加密系统于 1996 年 由 Hoffstein、Pipher 和 Silverman 提出(见1998年论文《NTRU: A Ring-Based Public Key Cryptosystem》)。
NTRU 是一种 非基于因数分解或离散对数问题 的公钥加密系统,它基于格上的最短向量问题(Shortest Vector Problem, SVP)。
NTRU 公钥加密系统是目前已知速度最快的公钥加密系统之一。
NTRU 工作在一个被截断的多项式环中:
Rq=Zq[X]/(XN−1),R_q = \mathbb{Z}_q[X]/(X^N - 1), Rq=Zq[X]/(XN−1),
其中:
- NNN 是固定的正整数,
- Zq\mathbb{Z}_qZq 表示模 qqq 的整数环。
在Zq\mathbb{Z}_qZq整数环中,多项式 fff 可写作:
f=(f0,f1,…,fN−1)=∑k=0N−1fkXk.f = (f_0, f_1, \dots, f_{N-1}) = \sum_{k=0}^{N-1} f_k X^k. f=(f0,f1,…,fN−1)=k=0∑N−1fkXk.
两个多项式 f=(f0,f1,…,fN−1)f = (f_0, f_1, \dots, f_{N-1})f=(f0,f1,…,fN−1) 与 g=(g0,g1,…,gN−1)g = (g_0, g_1, \dots, g_{N-1})g=(g0,g1,…,gN−1) 的加法定义为对应系数的逐项相加:
f+g=(f0+g0,f1+g1,…,fN−1+gN−1).f + g = (f_0 + g_0, f_1 + g_1, \dots, f_{N-1} + g_{N-1}). f+g=(f0+g0,f1+g1,…,fN−1+gN−1).
两个多项式 fff 与 ggg 的乘法定义为卷积乘法(convolution):
f⋆g=h=(h0,h1,…,hN−1),其中 hk=∑i+j≡k(mod N)figj.f \star g = h = (h_0, h_1, \dots, h_{N-1}), \quad \text{其中 } h_k = \sum_{i + j \equiv k \ (\text{mod } N)} f_i g_j. f⋆g=h=(h0,h1,…,hN−1),其中 hk=i+j≡k (mod N)∑figj.
如,计算:
(x4+2x3+3)⋆(x4+3x2+x+2)=x8+2x7+3x6+7x5+7x4+4x3+9x2+3x+6.(x^4 + 2x^3 + 3) \star (x^4 + 3x^2 + x + 2) = x^8 + 2x^7 + 3x^6 + 7x^5 + 7x^4 + 4x^3 + 9x^2 + 3x + 6. (x4+2x3+3)⋆(x4+3x2+x+2)=x8+2x7+3x6+7x5+7x4+4x3+9x2+3x+6.
在多项式环 Z3[X]/(X5−1)\mathbb{Z}_3[X]/(X^5 - 1)Z3[X]/(X5−1) 中,该式可化简为:
x3+2x2+3x+7+7x4+4x3+9x2+3x+6=7x4+5x3+11x2+6x+13=x4+2x3+2x2+1.x^3+2x^2+3x+7+7x^4+4x^3+9x^2+3x+6 \\ = 7x^4+5x^3+11x^2+6x+13\\ =x^4+2x^3+2x^2+1.x3+2x2+3x+7+7x4+4x3+9x2+3x+6=7x4+5x3+11x2+6x+13=x4+2x3+2x2+1.
对于给定的正整数 ddd,定义集合:
B(d)={∑k=0N−1fkXk:fi=0或 1,∑k=0N−1fk=d}.B(d)=\left\{\sum_{k=0}^{N-1}f_kX^k : f_i=0\text{ 或 }1, \sum_{k=0}^{N-1}f_k=d\right\}. B(d)={k=0∑N−1fkXk:fi=0 或 1,k=0∑N−1fk=d}.
1.1 NTRU参数选型
NTRU中 的参数选取如下:
- NNN:足够大的素数;
- p,qp, qp,q:互质整数,且 q≫pq \gg pq≫p;
- df,dg,drd_f, d_g, d_rdf,dg,dr:整数参数,其中:
- 私钥多项式从集合 B(df)B(d_f)B(df)、B(dg)B(d_g)B(dg) 中选取;
- 加密时用于掩蔽(blinding)的随机多项式从集合 B(dr)B(d_r)B(dr) 中选取;
- 明文空间为 Zp[X]/(XN−1)\mathbb{Z}_p[X]/(X^N - 1)Zp[X]/(XN−1)。
1.2 NTRU密钥生成
NTRU密钥生成为:
- 随机选择多项式 f∈B(df)f \in B(d_f)f∈B(df),要求 fff 在模 ppp 和模 qqq 下均可逆;
- 计算:
fp≡f−1(modp),fq≡f−1(modq);f_p \equiv f^{-1} \pmod{p}, \quad f_q \equiv f^{-1} \pmod{q}; fp≡f−1(modp),fq≡f−1(modq); - 随机选择多项式 g∈B(dg)g \in B(d_g)g∈B(dg);
- 计算:
h≡g⋆fq(modq);h \equiv g \star f_q \pmod{q}; h≡g⋆fq(modq); - 公钥为 (N,h)(N, h)(N,h),私钥为 (f,fp)(f, f_p)(f,fp)。
1.3 NTRU加密过程
NTRU加密过程为:
- 将消息表示为明文空间中的多项式 mmm;
- 随机选择多项式 r∈B(dr)r \in B(d_r)r∈B(dr);
- 根据以下规则生成密文:
e≡p⋆r⋆h+m(modq).e \equiv p \star r \star h + m \pmod{q}. e≡p⋆r⋆h+m(modq).
1.4 NTRU解密过程
NTRU解密过程为:
- 计算:
a≡f⋆e(modq);a \equiv f \star e \pmod{q}; a≡f⋆e(modq); - 将 aaa 的系数转换到区间 [−q2,q2)[-\frac{q}{2}, \frac{q}{2})[−2q,2q);
- 计算:
m≡fp⋆a(modp).m \equiv f_p \star a \pmod{p}. m≡fp⋆a(modp).
解密正确性验证:
- 计算如下:
a≡f⋆e(modq)≡f⋆(p⋆r⋆h+m)(modq)≡p⋆r⋆g⋆f⋆fq+f⋆m(modq)≡p⋆r⋆g+f⋆m(modq).\begin{equation*} \begin{aligned} a &\equiv & f \star e \pmod{q}\\ &\equiv & f \star (p \star r \star h + m) \pmod{q}\\ &\equiv & p \star r \star g \star f \star f_q + f \star m\pmod{q}\\ &\equiv & p \star r \star g + f \star m\pmod{q}.\\\end{aligned} \end{equation*} a≡≡≡≡f⋆e(modq)f⋆(p⋆r⋆h+m)(modq)p⋆r⋆g⋆f⋆fq+f⋆m(modq)p⋆r⋆g+f⋆m(modq).
因此:
fp⋆a(modp)≡(p⋆r⋆g+f⋆m)⋆fp(modp)≡m(modp).f_p \star a \pmod{p} \equiv (p \star r \star g + f \star m) \star f_p \pmod{p} \equiv m \pmod{p}. fp⋆a(modp)≡(p⋆r⋆g+f⋆m)⋆fp(modp)≡m(modp).
1.5 NTRU加解密示例
如为演示NTRU加解密示例,取:
N=7,p=3,q=41,f=X6−X4+X3+X2−1,g=X6+X4−X2−X,m=−X5+X3+X2−X+1,r=X6−X5+X−1.\begin{equation*} \begin{aligned} && N=7, p=3, q=41,\\ && f=X^6-X^4+X^3+X^2-1,\\ && g=X^6+X^4-X^2-X,\\ && m=-X^5+X^3+X^2-X+1,\\ && r=X^6-X^5+X-1.\end{aligned} \end{equation*} N=7,p=3,q=41,f=X6−X4+X3+X2−1,g=X6+X4−X2−X,m=−X5+X3+X2−X+1,r=X6−X5+X−1.
计算结果为:
fp=X6+2X5+X3+X2+X+1,fq=8X6+26X5+31X4+21X3+40X2+2X+37,h=19X6+38X5+6X4+32X3+24X2+37X+8,e=31X6+19X5+4X4+2X3+40X2+3X+25.\begin{equation*} \begin{aligned} && f_p=X^6 + 2X^5 + X^3 + X^2 + X + 1,\\ && f_q=8X^6 + 26X^5 + 31X^4 + 21X^3 + 40X^2 + 2X + 37,\\ && h=19X^6 + 38X^5 + 6X^4 + 32X^3 + 24X^2 + 37X + 8,\\ && e=31X^6 + 19X^5 + 4X^4 + 2X^3 + 40X^2 + 3X + 25. \end{aligned} \end{equation*} fp=X6+2X5+X3+X2+X+1,fq=8X6+26X5+31X4+21X3+40X2+2X+37,h=19X6+38X5+6X4+32X3+24X2+37X+8,e=31X6+19X5+4X4+2X3+40X2+3X+25.
在 SageMath 中,可以如下实现 NTRU 加密与解密:
def cmap(t, p):if (ZZ(t) % p) > (p // 2):return ((ZZ(t) % p) - p)else:return ZZ(t) % pN = 7
p = 3
q = 41
print("(N,p,q)=", (N, p, q))Zx.<X> = ZZ[]
f = X^6 - X^4 + X^3 + X^2 - 1
g = X^6 + X^4 - X^2 - X
print("f=", f)
print("g=", g)Pp.<b> = PolynomialRing(GF(p))
Pq.<c> = PolynomialRing(GF(q))f3 = Pp(f).inverse_mod(b^N - 1)
f41 = Pq(f).inverse_mod(c^N - 1)
print("f_p=", f3(b=X))
print("f_q=", f41(c=X))h = (p * f41 * Pq(g)) % (c^N - 1)
print("public key h: ", h(c=X))r = X^6 - X^5 + X - 1
print("r=", r)m = -X^5 + X^3 + X^2 - X + 1
print("message m:", m)em = (Pq(r) * h) % (c^N - 1) + Pq(m) % (c^N - 1)
print("encrypted m: ", em(c=X))A = (Pq(f) * em) % (c^N - 1)
print(A(c=X))A1 = [cmap(k, q) for k in A.list()]
print(Zx(A1))print("decrypted message m: ", Zx([cmap(k, p) for k in Pp((Zx(A1) * Zx(f3)) % (X^N - 1)).list()]))
以上sagemath程序输出结果如下:
(N,p,q)= (7, 3, 41)
f = X^6 - X^4 + X^3 + X^2 - 1
g = X^6 + X^4 - X^2 - X
f_p = X^6 + 2*X^5 + X^3 + X^2 + X + 1
f_q = 8*X^6 + 26*X^5 + 31*X^4 + 21*X^3 + 40*X^2 + 2*X + 37
public key h: 19*X^6 + 38*X^5 + 6*X^4 + 32*X^3 + 24*X^2 + 37*X + 8
r = X^6 - X^5 + X - 1
message m: -X^5 + X^3 + X^2 - X + 1
encrypted m: 31*X^6 + 19*X^5 + 4*X^4 + 2*X^3 + 40*X^2 + 3*X + 25
X^6 + 10*X^5 + 33*X^4 + 40*X^3 + 40*X^2 + X + 40
X^6 + 10*X^5 - 8*X^4 - X^3 - X^2 + X - 1
decrypted message m: -X^5 + X^3 + X^2 - X + 1
1.6 NTRU上基于格的攻击
NTRU中公钥满足以下关系式:
h≡g⋆fq(modq)h \equiv g \star f_q \pmod{q} h≡g⋆fq(modq)
因此有:
f⋆h≡g(modq)f \star h \equiv g \pmod{q} f⋆h≡g(modq)
现在考虑定义如下的格(lattice):
Λ=(F1,F2)∈Rq×Rq:F1⋆h≡F2(modq)\Lambda = { (F_1, F_2) \in R_q \times R_q : F_1 \star h \equiv F_2 \pmod{q} } Λ=(F1,F2)∈Rq×Rq:F1⋆h≡F2(modq)
显然,(f,g)∈Λ(f, g) \in \Lambda(f,g)∈Λ。
关系 f⋆h≡g(modq)f \star h \equiv g \pmod{q}f⋆h≡g(modq) 可以写成:
f⋆h−u⋆q=g,其中 u∈Rqf \star h - u \star q = g, \quad \text{其中 } u \in R_q f⋆h−u⋆q=g,其中 u∈Rq
上式可以重写为:
(fg)=(10hq)(f−u)\begin{equation*} \begin{pmatrix} f\\ g \end{pmatrix}= \begin{pmatrix} 1 & 0\\ h & q \end{pmatrix} \begin{pmatrix} f\\ -u \end{pmatrix} \end{equation*} (fg)=(1h0q)(f−u)
或者更有用地写成矩阵形式:
(f0f1⋮fN−1g0g1⋮gN−1)=(10⋯000⋯001⋯000⋯0⋮⋮⋱⋮⋮⋮⋱⋮00⋯100⋯0h0h1⋯hN−1q0⋯0hN−1h0⋯hN−20q⋯0⋮⋮⋱⋮⋮⋮⋱⋮h1h2⋯h000⋯q)(f0f1⋮fN−1−u0−u1⋮−uN−1)\begin{equation*} \begin{pmatrix} f_0\\ f_1\\ \vdots\\ f_{N-1}\\ g_0\\ g_1\\ \vdots\\ g_{N-1}\\ \end{pmatrix}= \begin{pmatrix} 1 & 0& \cdots& 0& 0& 0& \cdots& 0\\ 0 & 1& \cdots& 0& 0& 0& \cdots& 0\\ \vdots & \vdots& \ddots& \vdots& \vdots& \vdots& \ddots& \vdots\\ 0 & 0& \cdots& 1& 0& 0& \cdots& 0\\ h_0 & h_1& \cdots& h_{N-1}& q& 0& \cdots& 0\\ h_{N-1} & h_0& \cdots&h_{N-2} & 0& q& \cdots& 0\\ \vdots & \vdots& \ddots& \vdots& \vdots& \vdots& \ddots& \vdots\\ h_1 & h_2& \cdots& h_0& 0& 0& \cdots& q \end{pmatrix} \begin{pmatrix} f_0\\ f_1\\ \vdots\\ f_{N-1}\\ -u_0\\ -u_1\\ \vdots\\ -u_{N-1}\\ \end{pmatrix} \end{equation*} f0f1⋮fN−1g0g1⋮gN−1=10⋮0h0hN−1⋮h101⋮0h1h0⋮h2⋯⋯⋱⋯⋯⋯⋱⋯00⋮1hN−1hN−2⋮h000⋮0q0⋮000⋮00q⋮0⋯⋯⋱⋯⋯⋯⋱⋯00⋮000⋮qf0f1⋮fN−1−u0−u1⋮−uN−1
需要注意的是,多项式 fff 和 ggg 的系数都很小,因此 (f,g)(f, g)(f,g) 是格 Λ\LambdaΛ 中的一个短向量(short vector)。
因此,可以使用 LLL 算法(Lenstra–Lenstra–Lovász) 来逼近该短向量。
接下来,将对前面讨论的 NTRU 示例应用上述思想。
在 SageMath 中,可以按如下方式实现该格构造与 LLL 攻击:
N=7
p=3
q=41
Zx.<X> = ZZ[] # 多项式环 Z[X]
f=X^6-X^4+X^3+X^2-1
g=X^6+X^4-X^2-X
h=19*X^6 + 38*X^5 + 6*X^4 + 32*X^3 + 24*X^2 + 37*X + 8
M = matrix(2*N) # 初始化 2N×2N 的零矩阵
for i in [0..N-1]: M[i,i] = 1
for i in [N..2*N-1]: M[i,i] = q
for i in [0..N-1]:for j in [0..N-1]:M[i+N,j] = ((Zx(GF(q)(1/p)*h)*X^i)%(X^N-1))[j]
pretty_print(M)
pretty_print(M.transpose().LLL())
pretty_print(f.coefficients(sparse=False))
pretty_print(g.coefficients(sparse=False))
以上sagemath程序输出如下,可成功破解获得 (f,g)(f,g)(f,g):
(1000000000000001000000000000001000000000000001000000000000001000000000000001000000000000001000000030268382402041000000203026838240041000004020302683820041000024020302683800041000382402030268000041008382402030260000041026838240203000000041)\displaystyle \left(\begin{array}{rrrrrrrrrrrrrr} 1 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 \\ 0 & 0 & 1 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 \\ 0 & 0 & 0 & 1 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 \\ 0 & 0 & 0 & 0 & 1 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 \\ 0 & 0 & 0 & 0 & 0 & 1 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 \\ 0 & 0 & 0 & 0 & 0 & 0 & 1 & 0 & 0 & 0 & 0 & 0 & 0 & 0 \\ 30 & 26 & 8 & 38 & 2 & 40 & 20 & 41 & 0 & 0 & 0 & 0 & 0 & 0 \\ 20 & 30 & 26 & 8 & 38 & 2 & 40 & 0 & 41 & 0 & 0 & 0 & 0 & 0 \\ 40 & 20 & 30 & 26 & 8 & 38 & 2 & 0 & 0 & 41 & 0 & 0 & 0 & 0 \\ 2 & 40 & 20 & 30 & 26 & 8 & 38 & 0 & 0 & 0 & 41 & 0 & 0 & 0 \\ 38 & 2 & 40 & 20 & 30 & 26 & 8 & 0 & 0 & 0 & 0 & 41 & 0 & 0 \\ 8 & 38 & 2 & 40 & 20 & 30 & 26 & 0 & 0 & 0 & 0 & 0 & 41 & 0 \\ 26 & 8 & 38 & 2 & 40 & 20 & 30 & 0 & 0 & 0 & 0 & 0 & 0 & 41 \end{array}\right)1000000302040238826010000026302040238800100008263020402380001000388263020402000010023882630204000000104023882630200000001204023882630000000041000000000000004100000000000000410000000000000041000000000000004100000000000000410000000000000041
(−1−1−1−1−1−1−10000000−101−1−101−10−101101−1−101−10−10110−100101−1010−1−1002001−101−1−110−10−1011−2000−1−1001−10−11101−1010−1−100200−10−10081−1−3−58−5−1511−2−900−1952−3−67−500081−1−10−18−5−151−3−5−191−2−900−5052−3−6791−2−900−1052−3−67−5−10081−1−10−58−5−151−3−3−16−26−2−2−6−11−3−4−91−9)\displaystyle \left(\begin{array}{rrrrrrrrrrrrrr} -1 & -1 & -1 & -1 & -1 & -1 & -1 & 0 & 0 & 0 & 0 & 0 & 0 & 0 \\ -1 & 0 & 1 & -1 & -1 & 0 & 1 & -1 & 0 & -1 & 0 & 1 & 1 & 0 \\ 1 & -1 & -1 & 0 & 1 & -1 & 0 & -1 & 0 & 1 & 1 & 0 & -1 & 0 \\ 0 & 1 & 0 & 1 & -1 & 0 & 1 & 0 & -1 & -1 & 0 & 0 & 2 & 0 \\ 0 & 1 & -1 & 0 & 1 & -1 & -1 & 1 & 0 & -1 & 0 & -1 & 0 & 1 \\ 1 & -2 & 0 & 0 & 0 & -1 & -1 & 0 & 0 & 1 & -1 & 0 & -1 & 1 \\ 1 & 0 & 1 & -1 & 0 & 1 & 0 & -1 & -1 & 0 & 0 & 2 & 0 & 0 \\ -10 & -1 & 0 & 0 & 8 & 1 & -1 & -3 & -5 & 8 & -5 & -1 & 5 & 1 \\ 1 & -2 & -9 & 0 & 0 & -1 & 9 & 5 & 2 & -3 & -6 & 7 & -5 & 0 \\ 0 & 0 & 8 & 1 & -1 & -10 & -1 & 8 & -5 & -1 & 5 & 1 & -3 & -5 \\ -1 & 9 & 1 & -2 & -9 & 0 & 0 & -5 & 0 & 5 & 2 & -3 & -6 & 7 \\ 9 & 1 & -2 & -9 & 0 & 0 & -1 & 0 & 5 & 2 & -3 & -6 & 7 & -5 \\ -1 & 0 & 0 & 8 & 1 & -1 & -10 & -5 & 8 & -5 & -1 & 5 & 1 & -3 \\ -3 & -1 & 6 & -2 & 6 & -2 & -2 & -6 & -11 & -3 & -4 & -9 & 1 & -9 \end{array}\right)−1−110011−1010−19−1−3−10−111−20−1−20910−1−11−10−1010−981−206−1−10100−1001−2−98−2−1−11−110080−1−9016−10−10−1−111−1−1000−1−2−1101−1−10−19−10−1−10−20−1−1010−1−358−50−5−6000−100−1−52−5058−110−11−1−1108−3−152−5−300100−10−5−652−3−1−40100−102−171−3−65−901−120−105−5−3−6711000011010−57−5−3−9
[−1,0,1,1,−1,0,1]\displaystyle \left[-1, 0, 1, 1, -1, 0, 1\right][−1,0,1,1,−1,0,1]
[0,−1,−1,0,1,0,1]\displaystyle \left[0, -1, -1, 0, 1, 0, 1\right][0,−1,−1,0,1,0,1]
可见,通过对 NTRU 公钥构造的格 Λ\LambdaΛ 应用 LLL 算法,可以得到一个短向量,其分量与私钥多项式 fff 和 ggg 的系数十分接近。这说明 NTRU 的安全性与找到格中的短向量的难度(即最短向量问题 SVP)密切相关。
2. CTRU:在 F2\mathbb{F}_2F2 上使用多项式的NTRU变体
Gaborit、Ohler 和 Solé 提出了一种 NTRU 的变体,使其能够避免基于格(lattice-based)的攻击。
设 NNN 为一个正整数,定义
R=A[X]/(XN−1),R = A[X]/(X^N - 1),R=A[X]/(XN−1),
其中 AAA 表示 F2\mathbb{F}_2F2 上的多项式环。
固定两个在 A[X]A[X]A[X] 中的不可约多项式 PPP 和 QQQ,它们的阶分别为 sss 和 ttt,即
degP=s,degQ=t.\deg P = s, \quad \deg Q = t.degP=s,degQ=t.
这些数应满足条件 2≤s≤t2 \le s \le t2≤s≤t 且 gcd(s,t)=1\gcd(s, t) = 1gcd(s,t)=1。
最后一个 gcd\gcdgcd 最大公因数条件保证 F2s∩F2t=F2\mathbb{F}_{2^s} \cap \mathbb{F}_{2^t} = \mathbb{F}_2F2s∩F2t=F2。
给定多项式:
F=F0(T)+F1(T)X+⋯+FN−1(T)XN−1∈R,F = F_0(T) + F_1(T)X + \dots + F_{N-1}(T)X^{N-1} \in R,F=F0(T)+F1(T)X+⋯+FN−1(T)XN−1∈R,
用 degT(F)\deg_T(F)degT(F) 表示 FFF 中 XXX 的系数关于 TTT 的最大阶数。
定义集合:
L(d)={F∈R:degT(F)<d}.\begin{equation*} \mathcal{L}(d)=\{F\in R : \deg_T(F)<d\}. \end{equation*}L(d)={F∈R:degT(F)<d}.
对于给定的 XiX^iXi,其对应的系数多项式为:
Fi,0+Fi,1T+⋯+Fi,d−1Td−1,F_{i,0} + F_{i,1}T + \dots + F_{i,d-1}T^{d-1},Fi,0+Fi,1T+⋯+Fi,d−1Td−1,
其中 Fi,j∈F2F_{i,j} \in \mathbb{F}_2Fi,j∈F2。
因此,可能的系数多项式共有 2d2^d2d 个。
由于共有 NNN 个系数,所以集合 L(d)\mathcal{L}(d)L(d) 的大小为 2dN2^{dN}2dN。
在 CTRU 中,使用三个额外参数 df,dg,dϕd_f, d_g, d_\phidf,dg,dϕ,它们是介于 111 和 t−1t-1t−1 之间的整数。
Alice 和 Bob 按以下步骤进行通信:
-
Alice 的步骤:
- 选择一个多项式 f∈L(df+1)f \in \mathcal{L}(d_f + 1)f∈L(df+1),使得 fff 在模 PPP 和模 QQQ 意义下均可逆。
记 fPf_PfP 为 fff 在模 PPP 下的逆元,fQf_QfQ 为模 QQQ 下的逆元。 - 再选择一个多项式 g∈L(dg+1)g \in \mathcal{L}(d_g + 1)g∈L(dg+1)。
- 公钥为
h=g∗fQ(modQ).h = g \ast f_Q \pmod{Q}.h=g∗fQ(modQ).
- 选择一个多项式 f∈L(df+1)f \in \mathcal{L}(d_f + 1)f∈L(df+1),使得 fff 在模 PPP 和模 QQQ 意义下均可逆。
-
Bob 的步骤:
- 选择两个多项式:
第一个是消息多项式 mmm,
第二个是随机多项式 ϕ∈L(dϕ+1)\phi \in \mathcal{L}(d_\phi + 1)ϕ∈L(dϕ+1)。 - 使用以下公式加密消息:
e=P∗ϕ∗h+m(modQ).e = P \ast \phi \ast h + m \pmod{Q}.e=P∗ϕ∗h+m(modQ).
- 选择两个多项式:
-
Alice 的解密:
- 收到 eee 后计算:
a=e∗f=P∗ϕ∗h∗f+m∗f=P∗ϕ∗g+m∗f(modQ),\begin{aligned} a &= e \ast f = P \ast \phi \ast h \ast f + m \ast f \ &= P \ast \phi \ast g + m \ast f \pmod{Q}, \end{aligned} a=e∗f=P∗ϕ∗h∗f+m∗f =P∗ϕ∗g+m∗f(modQ),
然后计算
a∗fP=P∗ϕ∗g∗fP+m∗f∗fP=m(modP).a \ast f_P = P \ast \phi \ast g \ast f_P + m \ast f \ast f_P = m \pmod{P}. a∗fP=P∗ϕ∗g∗fP+m∗f∗fP=m(modP).
- 收到 eee 后计算:
3. ITRU:NTRU 的一种变体
2017 年,Gaithuru、Salleh 和 Mohamad 提出了一种名为 ITRU 的 NTRU 变体。
与 NTRU 使用截断多项式环不同,ITRU 基于整数环进行构建。
ITRU 的参数及主要步骤如下:
- 建议取 p=1000p = 1000p=1000。
- 随机选择整数 f,g,rf, g, rf,g,r,其中 fff 在模 ppp 意义下可逆。
- 固定一个素数 qqq,满足
q>p⋅r⋅g+f⋅m,q > p \cdot r \cdot g + f \cdot m,q>p⋅r⋅g+f⋅m,
其中 mmm 是消息的十进制表示。
建议的转换基于 ASCII 表,如字符a → 97。 - 计算
Fp=f−1(modp),Fq=f−1(modq),F_p = f^{-1} \pmod{p}, \quad F_q = f^{-1} \pmod{q},Fp=f−1(modp),Fq=f−1(modq),
这些可以使用扩展欧几里得算法求得。 - 公钥为
h≡p⋅Fq⋅g(modq)h \equiv p \cdot F_q \cdot g \pmod{q}h≡p⋅Fq⋅g(modq)
以及 qqq。 - 加密过程类似于 NTRU:
生成随机整数 rrr,计算
e≡r⋅h+m(modq).e \equiv r \cdot h + m \pmod{q}.e≡r⋅h+m(modq). - 为从密文恢复明文,计算
a≡f⋅e(modq).a \equiv f \cdot e \pmod{q}.a≡f⋅e(modq).
然后通过计算
Fp⋅a(modp)F_p \cdot a \pmod{p}Fp⋅a(modp)
恢复消息。
需要验证最终确实能得到原始消息。
有:
a≡f⋅e≡f(r⋅h+m)≡f(r⋅p⋅Fq⋅g+m)≡r⋅p⋅g+f⋅m(modq).a \equiv f \cdot e \equiv f(r \cdot h + m) \equiv f(r \cdot p \cdot F_q \cdot g + m) \equiv r \cdot p \cdot g + f \cdot m \pmod{q}. a≡f⋅e≡f(r⋅h+m)≡f(r⋅p⋅Fq⋅g+m)≡r⋅p⋅g+f⋅m(modq).
这里利用了 f⋅Fq≡1(modq)f \cdot F_q \equiv 1 \pmod{q}f⋅Fq≡1(modq)。
接着计算 Fp⋅a(modp)F_p\cdot a\pmod{p}Fp⋅a(modp):
Fp⋅a≡Fp(r⋅p⋅g+f⋅m)≡Fp⋅f⋅m≡m(modp).F_p \cdot a \equiv F_p (r \cdot p \cdot g + f \cdot m) \equiv F_p \cdot f \cdot m \equiv m \pmod{p}. Fp⋅a≡Fp(r⋅p⋅g+f⋅m)≡Fp⋅f⋅m≡m(modp).
需要注意的是,为了选定合适的 qqq,必须知道消息表示的最大可能值。
如果仅使用字母 'A' 到 'Z' 和 'a' 到 'z',则最大值为 122。
在以下 SageMath 的实现中,将使用 255 作为上界:
s='cryptography'
pretty_print('The message is : ', s)
r=8
p=1000
F=Set([k for k in range(2,1000) if gcd(k,1000)==1])
f=F.random_element()
S=Set([2..1000])
g=S.random_element()
m=[ord(k) for k in s]
pretty_print('The ASCII code of the message :',m)
q=next_prime(p*r*g+255*f)
Fp=(1/f)%p
Fq=(1/f)%q
h=(p*Fq*g)%q
pretty_print('Large modulus :', q)
pretty_print('Public key :',h)
pretty_print('Private key pair :', (f,Fp))
e=[((r*h)+m[i])%q for i in [0..len(m)-1]]
pretty_print('The encrypted message :',e)
a=[(f*e[i])%q for i in [0..len(e)-1]]
pretty_print(html(r'$f\cdot e\pmod{q}$ is : $%s$'%latex(a)))
C=[(Fp*a[l])%p for l in [0..len(a)-1]]
pretty_print(html(r'$F_p\cdot a\pmod{q}$ is : $%s$'%latex(C)))
D=[chr(k) for k in C]
pretty_print('The original message :', ''.join(D))
以上sagemath程序输出为:
The message is : cryptography
The ASCII code of the message : [99, 114, 121, 112, 116, 111, 103, 114, 97, 112, 104, 121]
Large modulus : 6340039
Public key : 2524887
Private key pair : (957, 93)
The encrypted message : [1179078, 1179093, 1179100, 1179091, 1179095, 1179090, 1179082, 1179093, 1179076, 1179091, 1179083, 1179100]
f⋅e(mod q) is : [6190743, 6205098, 6211797, 6203184, 6207012, 6202227, 6194571, 6205098, 6188829, 6203184, 6195528, 6211797]
F_p⋅a(mod p) is : [99, 114, 121, 112, 116, 111, 103, 114, 97, 112, 104, 121]
The original message : cryptography
接下来加密一段来自描述 ITRU 的文章中的文字(不包含空格):
‘ThegoalofthisstudyistopresentavariantofNTRUwhichisbasedontheringof
integersasopposedtousingthepolynomialringwithintegercoefficients.
WeshowthatNTRUbasedontheringofintegers(ITRU),hasasimpleparameter
selectionalgorithm,invertibilityandsuccessfulmessagedecryption.
Wedescribeaparameterselectionalgorithmandalsoprovideanimplementation
ofITRUusinganexample.ITRUisshowntohavesuccessfulmessagedecryption,
whichprovidesmoreassuranceofsecurityincomparisontoNTRU.’
如果大模数为 1104427,且公钥为 37619,则密文开头为:
301036, 301056, 301053, 301055, 301063, 301049, 301060, 301063, 301054 …
密文中共有 32 个不同的数字,这些数字介于 300992 和 301073 之间。
通过简单的频率分析,可以得到以下数据:
[(301056, 0.0380313199105145), (301057, 0.0850111856823266),
(301060, 0.0313199105145414), (301061, 0.0290827740492170),
(301062, 0.0648769574944072), (301063, 0.0738255033557047),
(301064, 0.0313199105145414), (301066, 0.0536912751677852),
(301067, 0.0850111856823266), (301068, 0.0693512304250559),
(301069, 0.0201342281879195), (301070, 0.0111856823266219),
(301071, 0.0111856823266219), (301072, 0.00223713646532438),
(301073, 0.0134228187919463), (300992, 0.00223713646532438),
(300993, 0.00223713646532438), (300996, 0.00671140939597315),
(300998, 0.00894854586129754), (301025, 0.00671140939597315),
(301030, 0.00671140939597315), (301034, 0.0134228187919463),
(301036, 0.0156599552572707), (301037, 0.0134228187919463),
(301039, 0.00447427293064877), (301049, 0.0693512304250559),
(301050, 0.00894854586129754), (301051, 0.0357941834451902),
(301052, 0.0246085011185682), (301053, 0.109619686800895),
(301054, 0.0223713646532438), (301055, 0.0290827740492170)]
也就是说,数字 301053 在密文中出现次数最多。
可以猜测 301053 可能对应字母 'e'、'a' 或 't'。
如果假设它对应 'e',那么应用公式:
ci−300952c_i - 300952 ci−300952
得到一串数字序列开头为:
84, 104, 101, 103, 111, 97, 108, 111
如果将这串数字视为 ASCII 码并转为对应的字符,就能得到解码后的明文消息。
参考资料
[1] 8 The NTRU cryptosystem
附录:SageMath 功能总结
- LLL()
返回经过 LLL(Lenstra–Lenstra–Lovász)约化的向量系统。 - chr()
根据给定的 ASCII 码返回对应的字符。 - coefficients()
返回多项式的系数。 - ord()
返回给定字符的 ASCII 码。
