我必须将一些加密代码从我不太熟悉的Java(Visual C++)移植到Visual C++。我在http://sourceforge.net/projects/cpp-bigint/找到了一个可用于大整数的库。
但是,它没有与javas SecureRandom类等效的类。我确实在c++中找到一个名为beecrypt的项目,但无法使其与Visual Studio 2008一起使用。
有人对这些类型的库有经验吗?我也看到了gmp,但找不到与Visual Studio配合使用的软件。
在我走错路之前,有什么建议吗?
谢谢!
----更新------
我似乎有一个从上面用少量cpp-bigint进行工作的概念证明。库中没有modPow函数。现在,我创建了一个for循环,例如:
for(RossiBigInt i("0",DEC_DIGIT); i< r; i++)
{
x = x * g;
x = x%p;
}
这给我x = g ^ r mod p,但是非常慢。有人知道带有modPow函数的其他BitInteger库,还是知道我计算它的更快方法?
谢谢!
最佳答案
可以使用“平方和乘法”算法有效地评估modPow函数。在Java中看起来像这样(如果Java的BigInteger还没有的话):
/* Compute x^n mod m. */
static BigInteger modPow(BigInteger x, BigInteger n, BigInteger m)
{
if (n.signum() < 0)
throw new IllegalArgumentException("bwah, negative exponent");
BigInteger r = BigInteger.ONE;
for (int i = n.bitLength() - 1; i >= 0; i --) {
if (n.testBit(i))
r = r.multiply(x).mod(m);
if (i > 0)
r = r.multiply(r).mod(m);
}
return r;
}
这样,循环迭代的次数等于指数的长度(以位为单位),因此计算时间是可以接受的。
每次迭代您仍然会得到一两个模块化的约简,所以这将不是有史以来最快的幂运算算法(模块化的约简比乘法昂贵)。典型的modPow()实现使用蒙哥马利简化,这是一个巧妙的技巧,最终将所有模块化简化合并为一个类似的操作。
如果您有时间,实现自己的模幂将非常有教育意义;您将首先阅读可从this site免费下载的“应用密码学手册”的第14章。但是,在这个苛刻的世界中,平凡的预算考虑常常限制了创造力和空闲时间,您可能会对已经实现的图书馆感到满意。 GMP相当不错,但是在Windows上使用起来有些困难。使用NTL可能会更好。