我正在寻找一个算法(或代码)帮助我计算多项式的逆,我需要它来实现NTRUEncrypt。我更喜欢易于理解的算法,虽然有伪代码可以做到这一点,但它们仍然很困惑且难以实现,而且仅凭伪代码我无法真正理解过程。
是否有任何算法可以计算关于截断多项式环的多项式的逆?
是否有任何算法可以计算关于截断多项式环的多项式的逆?
我在 Security Innovation 工作,该公司拥有 NTRU,很高兴看到这个问题受到关注。
IEEE 标准 1363.1-2008 指定了如何使用最新的参数集来实现 NTRUEncrypt。它给出了以下多项式反演的规范:
除法:
输入为两个多项式 a 和 b,其中 b 的次数为 N-1,b_N 是 b 的首项系数。输出为 q 和 r,使得 a = q*b + r 且 deg(r) < deg(b)。r_d 表示 r 的 d 次系数,即 r 的首项系数。
a) Set r := a and q := 0
b) Set u := (b_N)^–1 mod p
c) While deg r >= N do
1) Set d := deg r(X)
2) Set v := u × r_d × X^(d–N)
3) Set r := r – v × b
4) Set q := q + v
d) Return q, r
在这里,r_d 是d次项的系数。
扩展欧几里得算法:
a) If b = 0 then return (1, 0, a)
b) Set u := 1
c) Set d := a
d) Set v1 := 0
e) Set v3 := b
f) While v3 ≠ 0 do
1) Use the division algorithm (6.3.3.1) to write d = v3 × q + t3 with deg t3 < deg v3
2) Set t1 := u – q × v1
3) Set u := v1
4) Set d := v3
5) Set v1 := t1
6) Set v3 := t3
g) Set v := (d – a × u)/b [This division is exact, i.e., the remainder is 0]
h) Return (u, v, d)
在Z_p上的逆元,其中p是一个质数:
a) Run the Extended Euclidean Algorithm with input a and (X^N – 1). Let (u, v, d) be the output, such that a × u + (X^N – 1) × v = d = GCD(a, (X^N – 1)).
b) If deg d = 0, return b = d^–1 (mod p) × u
c) Else return FALSE
在 Z_p^e 中求逆元 / (M(X)为合适的多项式,例如 X^N-1,p为质数)
a) Use the Inversion Algorithmto compute a polynomial b(X) ε R[X] that gives an inverse of a(X) in (R/pR)[X]/(M(X)). Return FALSE if the inverse does not exist. [The Inversion Algorithm may be applied here because R/pR is a field, and so (R/pR)[X] is a Euclidean ring.]
b) Set n = p
c) While n <= e do
1) b(X) = p × b(X) – a(X) × b(X)^2 (mod M(X)), with coefficients computed modulo p^n
2) Set n = p × n
d) Return b(X) mod M(X) with coefficients computed modulo p^e.
如果你正在完整地实现NTRU,你应该看看是否可以让你的机构购买1363.1,因为原始的NTRU加密对抗主动攻击者并不安全,而1363.1描述了修复此问题的消息处理技术。
(更新2013-04-18: 感谢Sonel Sharam在以前版本中发现的一些错误)
b_N ^-1 mod p
不存在而失败?具体来说,像 2044 ^-1 mod 2048 这样的东西会出现,导致算法失败。我只是用一个新的 f
重新启动,但它无限期地失败。 - Loganmod p
而不是mod p^e
,然后将其提高修复了它。不过需要一些时间来理解。 - Logann = n + 1
而不是n = p * n
,因为n
是p
的指数。我刚刚用维基百科上给出的示例进行了测试,使用n = n + 1
可以工作,但是使用n = p * n
则不行。 - AbcAeffchenn = 2
。对于p = 2没有任何影响。 - AbcAeffchen
f(X):=a(X)
这样的话时,他们的意思是 f 是你程序中的一个变量,a 是函数的输入,并且这两个东西的类型都是“多项式”。例如,f(X)/X
的意思是x^2 + x + 0
->x + 1
。另一个棘手的部分是当你最终得到答案时,你必须将它对X^N-1
取模。 - Steve Jessop1
),则在b和k中“建立”的内容将为您提供逆运算,您只需将这些信息组合在一起即可。作为实现细节,如果您将多项式存储为系数数组,则乘以或除以x只需将所有内容向左移动一位即可。 - Steve Jessop