Visual C ++ BigInt和SecureRandom?是否有一个带有modPow的BigInt库?

时间:2010-03-04 05:23:10

标签: c++ cryptography biginteger

我必须从java中将一些加密代码移植到visual c ++中(visual c ++)我不是很熟悉。我在http://sourceforge.net/projects/cpp-bigint/找到了一个可用于大整数的库。

然而,它没有相当于javas SecureRandom类。我确实在c ++中找到了一个名为beecrypt的项目,但无法使其与Visual Studio 2008一起使用。

有没有人对这些类型的图书馆有任何经验?我也看到了gmp,但找不到一个与视觉工作室合作的人。

在我走错路之前,有什么建议吗?

谢谢!

---- UPDATE -------

我似乎有一个概念证明使用上面的cpp-bigint和小数字。在库中没有modPow函数。现在我创建了一个for循环,如:

for(RossiBigInt i("0",DEC_DIGIT); i< r; i++)

{   x = x * g;   x = x%p;  }

这给了我x = g ^ r mod p但它非常慢。有没有人知道其他BitInteger库与modPow函数或知道更快的方式来计算这个?

谢谢!

2 个答案:

答案 0 :(得分:2)

可以使用“square and multiply”算法有效地评估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()实现使用蒙哥马利减少,这是一个聪明的技巧,它将所有模块化缩减合并到最后的单个类似操作中。

如果你有时间,实施自己的模幂运算将是非常教学的;您将从阅读“应用密码学手册”第14章开始,可以从this site免费下载。然而,在这个苛刻的世界里,普通的预算考虑往往限制了创造力和空闲时间,你可能会对已经实施的图书馆感到满意。众所周知,GMP非常好,但在Windows上有点难以使用。你可能会有更好的运气NTL

答案 1 :(得分:0)

要在Windows上生成随机数据,您还可以使用CryptoAPI,特别是CryptGenRandom方法。