我必须将一些加密代码从我不太熟悉的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可能会更好。

07-24 14:11