我正在使用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
文件,编译器会经历并编译它将使用的所有必要文件。
我应该如何尝试编译上面的程序以解决链接错误?
答案 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。