【问题标题】:Algorithm for computing the inverse of a polynomial计算多项式逆的算法
【发布时间】:2010-03-10 23:17:41
【问题描述】:

我正在寻找一种算法(或代码)来帮助我计算多项式的逆,我需要它来实现 NTRUEncrypt。我更喜欢通俗易懂的算法,有伪代码可以做到这一点,但是它们很混乱,很难实现,而且我不能仅仅从伪代码中真正理解这个过程。

任何计算多项式关于ring of truncated polynomials 的逆的算法?

【问题讨论】:

  • 哪个逆?你想要反函数来解决(即分解)多项式,还是想要在作为多项式在某个基域上的商形成的域中找到它们的乘法逆,以及不可约多项式? NTRU 代表“Number Theorists R Us”,IIRC,因此很难凭直觉知道需要什么数学。 en.wikipedia.org/wiki/NTRUEncrypt 说“加密和解密都只使用简单的多项式乘法”,所以那篇文章也没有告诉我你的意思。无论需要什么,这都可能是一个 MathOverflow 问题。
  • 在这种情况下,请仔细复制伪代码,逐个操作。当他们说f(X):=a(X) 之类的话时,他们的意思是 f 是您例程中的一个变量,a 是函数的输入,并且这两个东西的类型都是“多项式”。 f(X)/X 表示例如 x^2 + x + 0 -> x + 1。另一个棘手的部分是当你最终得到答案时,你必须减少它 mod X^N-1
  • 哦,为你的函数写一个单元测试。您应该能够将输出乘以输入,以 2 为模减少系数,以 X^N-1 为模减少生成的多项式,并得到多项式 1(即除最后一个以外的所有系数都为 0)。
  • 非常感谢 steve,我正在尝试非常仔细地逐行实现伪代码,这里有一个扩展伪代码写得更清楚:wpi.edu/Pubs/ETD/Available/etd-0430102-111906/unrestricted/… 在第 27 页,我我正在仔细编码,我正在用 NTRU 给出的一些示例答案对其进行测试,我认为我在理解伪代码方面也受到阻碍,在我的代码中,我给多项式提供了固定长度和一组值f,8-31的无限循环永远不会结束,感谢指出f是一个变量。还有什么要注意的技巧吗?
  • 什么都没有想到。 “步骤 1:初始化”中列出的所有内容都是一个变量,并且在某处进行了修改。您应该看到 f 和 g 变得越来越小(就它们的最高非零系数而言),而 b、c 和 k 实际上记录了您对 f 和 g 所做的事情。一旦 f 在第 5 步中尽可能小 (1),您在 b 和 k 中“建立”的内容就会反过来,您只需要将这些信息放在一起。作为一个实现细节,如果您将多项式存储为一个系数数组,那么乘以或除以 x 只是意味着将所有内容移到一个位置。

标签: algorithm polynomial-math inverse ntruencrypt


【解决方案1】:

我在拥有 NTRU 的 Security Innovation 工作,所以我很高兴看到这种兴趣。

IEEE 标准 1363.1-2008 指定如何使用最新的参数集实现 NTRUEncrypt。它给出了以下规范来反转多项式:

部门:

输入是 a 和 b,两个多项式,其中 b 的次数为 N-1,b_N 是 b 的前导系数。输出是 q 和 r,使得 a = q*b + r 和 deg(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是r的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), p 是素数,M(X) 是合适的多项式,例如 X^N-1

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 重新启动,但它会无限期地失败。
  • 你知道吗,这是最后一个伪代码部分计算 mod p 而不是 mod p^e 然后提升它来修复它。不过,Gunna 需要一些时间来理解这一点。
  • 在计算 Z_p^e / (M(X)) 中的倒数的算法中,点 c ) 2) 似乎是错误的。这应该是n = n + 1 而不是n = p * n,因为np 的指数。我刚刚用example given on Wikipedia 测试了它,它适用于n = n + 1,但不适用于n = p * n
  • 如果这是对的,那么 b) 行也可能是错误的,应该是 n = 2。对于 p = 2,它没有区别。
  • @William,如果您仍然在 Stack Overflow 上活跃,请通过 noloader, gmail 帐户与我联系。我正在寻找一位 NTRU 专家来帮助/建议我进行开源实施。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-15
相关资源
最近更新 更多