C - RSA密码系统解密问题(unsigned long long不够大?)

时间:2017-12-07 09:09:09

标签: c encryption rsa unsigned-long-long-int

我正在完成一项必须构建RSA密码系统的任务。我能够加密密码密钥没有问题,但由于指数的结果太大,我无法解密密码。我尝试过使用unsigned long long int,但我仍然得到0的输出。

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

//Unsigned long long int power function
unsigned long long getPower(unsigned long long int base, int exponent){
    unsigned long long result = 1;
    int count = 0;

    while(count != exponent){
        result *= base;
        count++;
    }

    return result;
}

int decryptFile(int cipherInt, int n, int d){
    int plainInt;
    unsigned long long int cipherIntLong = cipherInt;
    unsigned long long int power = getPower(cipherIntLong, d);

    printf("%llu\n", power);

    return (int) plainInt;
}

int main(){
    decryptFile(1394, 3127, 2011);
}

我应该补充一点,教授没有提到使用大数字库,所以我确信我们很可能不应该使用一个来完成这项任务。

1 个答案:

答案 0 :(得分:1)

无符号64位整数的最大值为18,446,744,073,709,551,615

但是,1394^2011更多地围绕1.296 x 10^6323。这比无符号64位整数的最大值大7.02 x 10^6303倍。

TL; DR:使用BigInteger库,这是一个非常大的库。

严重的是,RSA可以计算如此大的功率的主要原因是因为RSA在模数下运行,所以如果我们使用Modular Exponentiation,我们需要更少的计算能力来达到结果。通过将明文提高到指数然后在最后应用模数来计算结果在计算上是不可行的。