【问题标题】:RSA Decryption Produces Wrong ResultRSA 解密产生错误结果
【发布时间】:2020-03-03 05:07:17
【问题描述】:

我正在尝试实施 RSA 加密,但每当实施解密部分时,我都会得到错误的答案。

加密之前的所有内容都给了我正确的值:n 是 187,phi 是 160,e 是 3,私钥 d 是 107,密文 c 是 183。然后,我首先计算 c^d(给出me -9223372036854775808) 然后对该结果执行 mod(n) 以获得 -162(假设解密)。

我认为错误出现在 c^d 部分,但我无法确定出了什么问题。任何帮助,将不胜感激。

int main()
{
    long p = 11;
    long q = 17;
    long n = p * q;

    double phi = (p-1) * (q-1);
    int e = 3;

    while(e < phi) {
        if(GCD(e, phi) == 1) break; //GCD is a function that returns the GCD
        else e++;
    }

    int k = 2;
    // private key computation
    double d = (1+(k*phi))/e;

    double msg = 72;

    long c = pow(msg, e);
    // c mod(n)
    c %= n;

    long decr = pow(c, d); 
    decr %= n;

    return 0;
}

【问题讨论】:

  • 使用GMP,RSA并不意味着使用小模数。此外,常见的方法是选择 e 而不是选择素数。
  • 当你说选择 e 然后选择素数时,我上面的方法有什么不同吗?我选择 e 然后选择最接近的互质数。
  • e 通常被选为费马素数,以便它包含更少的位以减少计算量。不过,这是另一个故事,因为它可以发动力量攻击。你选择的素数比 e

标签: c++ encryption rsa


【解决方案1】:

您可以使用以下代码计算模数(O(n) 复杂度)

//Compute a^b mod n
int powermod(int a, int b, int n) {
    int result = 1;
    for (int i=1;i<=b;++i) {
       result *= (a%n);
       result %= n;
    }
    return result%n;
}

您可以通过与计算指数模类似的方式修改快速功率。它使用以下公式

a^b mod n = (a mod n)^b mod n

【讨论】:

  • 感谢您的回复。我想知道函数中 int b 在哪里使用?
  • 感谢您的指出。我更正了代码。 b 是指数。
猜你喜欢
  • 2014-05-14
  • 2015-07-13
  • 2018-10-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多