从伪代码实现递归(NTRUEncrypt)

时间:2010-03-06 18:36:33

标签: java recursion cryptography polynomial-math

我需要实施NTRU公钥密码系统作为我最后一年大学项目的一部分。我正在尝试实现一种通过递归来乘以长多项式的算法,但是我在试图理解伪代码时陷入了困境。

Algorithm PolyMult(c, b, a, n, N)
Require: N, n, and the polynomial operands, b and c.
PolyMult returns the product polynomial a through the argument list
PolyMult(a,b,c,n,N)
{
1. if(...)
2. {
3.    ...
4.    ...
5.    ...
6.    ...
7. }
8. else
9. {
10.   n1 = n/2;
11.   n2 = n-n1;
12.   b = b1+b2*X^(n1);
13.   c = c1+c2*X^(n1);
14.   B = b1+b2;
15.   C = c1+c2;
16.   PolyMult(a1,b1,c1,n1,N);// a1 = b1*c1
17.   PolyMult(a2,b2,c2,n2,N);// a2=b2*c2
18.   PolyMult(a3,B,C,n2,N);// a3 = B*C=(b1+b2)*(c1+c2)
19.   a = a1 + (a3-a1-a2)*X^(n1) + a2*X^(2*n1);
20.}
}

注意N,n,n1和n2都是int类型。 a,a1,a2,b,b1,b2,c,c1,c2,B,C都是多项式,并表示为数组。

在第16,17和18行,调用函数PolyMult,参数为a1,b1,c1,n1,N,然后是a2,b2,c2,n2,N,最后是a3,B,C,n2,N 。我已经在第16行之前初始化了数组a1,b1,c1,然后我将它们传递给PolyMult本身(递归从这里开始!)并返回一个答案并将其存储在一些临时数组中,例如我按如下方式实现第16行: / p>

int z[] = PolyMult(a1,b1,c1,n1,N);

现在我的问题是:什么时候在程序中再次使用存储在数组z []中的多项式,我没有看到它将再次从伪代码中使用,但是如果数组z []在程序中不再使用,第16行和递归的重点是什么?我该如何实施第16-18行?

重复一下,在程序中再次使用存储在数组z中的多项式的时间和方式?我应该如何实施第16-18行?

有关详细信息,请参阅本文第3页的{-3}}。

2 个答案:

答案 0 :(得分:3)

在伪代码中,通过将结果存储到a[]数组中来“返回”结果,该数组作为参数给出。 PolyMult(a1, b1, c1, n1, N)将其结果存储在a1[]

乘法技术只是Karatsuba乘法,应用于多项式(这使得它更容易,因为多项式中没有进位)。有关指示,请参阅this Wikipedia article

就我个人而言,我认为仅通过数学更容易理解,而不是遵循伪代码。

答案 1 :(得分:0)

我为NTRU工作,所以我很高兴看到这种兴趣。

我不确定你正在使用什么参数集,但是对于很多NTRU参数集我们发现实现Karatsuba所涉及的开销是不值得的。假设你正在乘以A和B.对于NTRUEncrypt卷积运算,所涉及的多项式之一总是二进制或三进制。比如说A.然后结果中的每个系数都是一个子集的总和 B的系数如果将A存储为非零系数的索引数组,而不是将其存储为1和0的数组,并且如果A不是太密集,则更快地通过数组指数比做Karatsuba。代码更小更简单。

我可以问你在读什么大学?