我的RSA实施有什么问题

时间:2014-05-15 19:20:36

标签: c++ c encryption rsa

我写了一个RSA加密的小实现,但它没有给出正确的结果,有时当使用p&的其他值时,解密给出0。 q(素数)。这可能有什么问题?

    #include <stdio.h>
 #define uint unsigned long long
uint modpow(uint base,uint exp,uint modulus)
{
  base %= modulus;
  unsigned long long result = 1;
  while (exp > 0) {
    if (exp & 1) result = (result * base) % modulus;
    base = (base * base) % modulus;
    exp >>= 1;
  }

  return result;
}
uint modinv(uint a,uint p) {
    uint ex = p-2, result = 1;
    while (ex > 0) {
        if (ex % 2 == 1) {
            result = (result*a) % p;
        }
        a = (a*a) % p;
        ex /= 2;
    }
    return result;
}

int main()
{
    uint p = 4294967291;
    uint q = 1073741789;
    uint e = 3;
    uint m = p*q;
    uint phi = (p -1)*(q -1);
    uint d = modinv(e,phi);
    uint c = 0x41424344;
    uint en = modpow(c,e,m);
    printf("Encrypting: %llX\nEncrypted: %llX\nDecrypted: %llX",c,en,modpow(en,d,m));
}

1 个答案:

答案 0 :(得分:1)

一个问题是unsigned long long可能只有64位,中间件result*basebase*base很容易在modpow函数中溢出64位。这里需要一个__int128中间类型(如果您的编译器支持它)。

另一个问题是RSA仅适用于明文/ cipphertext值,这些值映射到不是p或q的多个整数。如果选择的是明文是p或q的倍数,则解密将失败。这对于实际(大)模量来说不是问题,因为随机地击中p或q的倍数的可能性是天文数字小(它与仅给出公钥的猜测私钥的几率大致相同)。

第一个问题可能是导致你悲痛的原因。