C ++处理非常大的整数

时间:2008-09-23 22:32:28

标签: c++ rsa biginteger integer

我正在使用RSA算法进行加密/解密,为了解密文件,您必须处理一些非常大的值。更具体地说,像

这样的事情
P = C^d % n
  = 62^65 % 133

现在这是唯一无法进行的计算。我尝试过使用Matt McCutchen的BigInteger库,但是在链接过程中我遇到了很多编译器错误,例如:

encryption.o(.text+0x187):encryption.cpp: undefined reference to `BigInteger::BigInteger(int)'

encryption.o(.text+0x302):encryption.cpp: undefined reference to `operator<<(std::ostream&, BigInteger const&)'

encryption.o(.text$_ZNK10BigIntegermlERKS_[BigInteger::operator*(BigInteger const&) const]+0x63):encryption.cpp: undefined reference to `BigInteger::multiply(BigInteger const&, BigInteger const&)'

所以我想知道处理RSA算法产生的真正大整数的最佳方法是什么。

我听说有可能将你的变量声明为双倍长,所以......

long long decryptedCharacter;

但我不确定可以存储多大的整数。


例如,我尝试使用dev C ++编译并运行以下程序:

#include iostream

#include "bigint\BigIntegerLibrary.hh"

using namespace std;

int main()
{
    BigInteger a = 65536;
    cout << (a * a * a * a * a * a * a * a);
    return 0;
}

然后我得到了那些错误。

Derek,我认为通过包含BigIntegerLibrary.hh文件,编译器会经历并编译它将使用的所有必要文件。

我应该如何尝试编译上面的程序以解决链接错误?

16 个答案:

答案 0 :(得分:23)

元的答案:

如果您正在使用bigint算法库,那么问问自己为什么不使用库来实现整个RSA。

例如,http://www.gnu.org/software/gnu-crypto/包含RSA实现。它与GMP具有相同的许可证。

但是,它们与http://mattmccutchen.net/bigint/没有相同的许可证,我觉得这些许可证已被置于美国的公共领域。

答案 1 :(得分:12)

我建议使用gmp,它可以处理任意长的整数并且具有不错的C ++绑定。

当前硬件/软件上的afaik长多为64位,因此无符号可以处理高达(2 ** 64)-1 == 18446744073709551615的数字,这比您必须处理RSA的数字要小得多。

答案 2 :(得分:12)

Tomek,听起来你没有正确链接到BigInteger代码。我认为你应该解决这个问题而不是寻找新的库。我查看了源代码,BigInteger::BigInteger(int)最明确定义。简短的一瞥表明其他人也一样。

您所暗示的链接错误意味着您要么忽略编译BigInteger源,要么忽略在链接时包含生成的对象文件。请注意,BigInteger源使用“cc”扩展名而不是“cpp”,因此请确保您也在编译这些文件。

答案 3 :(得分:4)

要查看很长时间的大小,请尝试:

#include <stdio.h>

int main(void) {
    printf("%d\n", sizeof(long long));

    return 0;
}

在我的机器上它返回8,这意味着8个字节,可以存储2 ^ 64个值。

答案 4 :(得分:3)

对于RSA,您需要一个bignum库。这些数字太大而无法容纳64位长。我曾经在大学找过一位同事来实施RSA,包括建立自己的bignum图书馆。

碰巧,Python有一个bignum库。编写bignum处理程序足够小,可以适应计算机科学任务,但仍然有足够的陷阱使其成为一项非常重要的任务。他的解决方案是使用Python库生成测试数据以验证他的bignum库。

您应该能够获得其他bignum图书馆。

或者,尝试在Python中实现原型并查看它是否足够快。

答案 5 :(得分:3)

如果您没有将RSA作为学校作业实施,那么我建议您查看加密++库http://www.cryptopp.com

实施加密技术非常容易。

答案 6 :(得分:3)

这是我的方法,它结合使用平方+模幂运算的快速取幂,减少了所需的空间。

long long mod_exp (long long n, long long e, long long mod)
{
  if(e == 1)
  {
       return (n % mod);
  }
  else
  {
      if((e % 2) == 1)
      {
          long long temp = mod_exp(n, (e-1)/2, mod);
          return ((n * temp * temp) % mod);
      }
      else
      {
          long long temp = mod_exp(n, e/2, mod);
          return ((temp*temp) % mod); 
      }
  }
}

答案 7 :(得分:3)

确保RSA实施不仅仅是大数字。简单的RSA实现往往会通过辅助通道泄漏私人信息,尤其是时间(简单来说:计算时间取决于处理后的数据,这允许攻击者恢复一些,可能全部的私钥位)。良好的RSA实施实施对策。

此外,除了模幂运算之外,还有整个填充业务,这在概念上并不困难,但是,因为所有I / O和解析代码都有微妙的错误空间。最容易编写的代码是已经由其他人编写的代码。

另一点是,一旦启动并运行了RSA代码,您就可以开始设想扩展和其他情况,例如: “如果我想使用的私钥不是在RAM而是在智能卡中呢?”一些现有的RSA实现实际上是可以处理它的API。在Microsoft世界中,您要查找集成在Windows中的CryptoAPI。您可能还想查看NSS,这是Firefox浏览器用于SSL的内容。

总结一下:你可以从大整数构建一个符合RSA的实现,但这比通常看起来更难以正确执行,所以我的建议是使用现有的RSA实施

答案 8 :(得分:2)

我会试用GMP库 - 它很健壮,经过良好测试,并且常用于此类代码。

答案 9 :(得分:2)

Openssl也可以使用Bignum类型。我用过它并且效果很好。如果你愿意的话,很容易用C ++或Objective-C等语言包装。

https://www.openssl.org/docs/crypto/bn.html

另外,如果您不知道,要找到此形式x ^ y%z的等式的答案,请查找称为模幂运算的算法。大多数加密或bignum库都具有专门用于此计算的函数。

答案 10 :(得分:1)

long int通常是64位,这可能不足以处理大的整数。你可能需要某种bigint库。

另请参阅Stack Overflow上的this question

答案 11 :(得分:1)

查看编译器文档。某些编译器具有定义的类型,例如__int64,它们可以为您提供大小。也许你有一些可用。

答案 12 :(得分:1)

请注意:__ int64和long long是非标准扩展名。并非所有C ++编译器都支持这两种编译器。 C ++基于C89(它出现在98,所以它不能基于C99)

(C支持自C99以来的'long long')

顺便说一句,我认为64位整数不能解决这个问题。

答案 13 :(得分:1)

我使用LibTomCrypt库为我的加密需求取得了很大的成功。它快速,精简,便携。它可以为您做RSA,或者只是根据需要处理数学。

答案 14 :(得分:0)

事实上,使用某个biginteger库时遇到问题并不意味着,这是一个糟糕的方法。

使用long long肯定是一个糟糕的方法。

正如其他人所说,已经使用biginteger库可能是一个很好的方法,但你必须发布更多关于你使用提到的库的详细信息,以便我们能够帮助你解决这些错误。

答案 15 :(得分:0)

我在编写RSA实现时使用了GMP。