我必须从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函数或知道更快的方式来计算这个?
谢谢!
答案 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方法。