C++ 大数

C++ big numbers

我正在尝试为一个项目实施 RSA,但我被困在需要大于 19 位数字的阶段(long long 我认为有 19 位数字)。我试过给 unsigned long long 但我仍然没有 1 位数字并且值不正确。我什至无法检查我的 encryption/decryption 是否有效。

我已经尝试了一些库,但我无法使用该类型和 int 进行交叉操作...有什么帮助吗?

这是我所拥有的:

void En() {
crypted= text;
unsigned long long temp=0;
unsigned long long enc = 0;
for (int i = 0; i < text.length() / 2; i++)
{
    if (text[i]>='a' && text[i] <= 'z')
    {
        temp = (text[i] - 96) * 26 + text[i + 1] - 96;
        enc = pow(temp, public_key);
        enc= enc % N
        cout << enc << endl;
        enc_v2 = enc;
    }

}

cout << "Enc: " << enc << endl;}

void De() {
unsigned long long c = 0;
unsigned long long temp2 = 0;
unsigned long long temp = 0;
char ch=' ', ch2=' ';
for (int i = 0; i < text.length()/2; i++)
{
    cout << enc_v2 << private_key;
    temp = pow(enc_v2, private_key);
    cout << "Temp :" << temp;
    temp = temp % N;
    cout << "Temp modulo :" << temp;
    temp2 = temp;
    temp = temp / 26;
    cout << " Temp char 1 :"<< temp;
    ch = temp + 96;


    temp2 = temp2 - temp * 26;
    cout << " Temp char 1 :" << temp2;
    ch2 = temp2 + 96;


}
cout << "Text: " << ch << ch2;}

谢谢!

为了表示大于任何基本类型的整数,您可以使用整数数组,其中数组的每个数字代表较大数字的不同字节。这称为任意精度算术。对于这样的 "big" 数字类型,每个算术运算以及输入和输出都必须单独实现。

对于更大的数字,您需要在单个函数中求模幂。这意味着您执行模数 您正在进行计算。当然后面的操作可以,但是:

  1. 它占用更多的位并且
  2. 它几乎没有效率。

作为一个(低效的)示例,您可以将求幂视为对基数执行乘法,然后取模并重复该过程,直到您执行了 e 次乘法(从值 1 而不是当然是基础)。

在大多数(加密)库中,您都有某种 bignum 库提供 modPow 方法。请注意,仅具有此类功能本身并不足以创建安全的 RSA 操作;通常还需要实施某种针对基于时间或功率的侧信道攻击的保护。