我的RSA实现有什么问题?

Whats wrong with my RSA implementation

本文关键字:问题 什么 RSA 实现 我的      更新时间:2023-10-16

我写了一个RSA加密的小实现,但它没有给出正确的结果,有时在使用其他值为p &问(启动)。这里有什么问题吗?

    #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: %llXnEncrypted: %llXnDecrypted: %llX",c,en,modpow(en,d,m));
}

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

另一个问题是RSA仅适用于映射到非p或q的整数的明文/密文值。如果您选择的明文是p或q的倍数,则解密将失败。这不是现实(大)模的问题,因为随机击中p或q的倍数的可能性非常小(这与仅给定公钥猜测私钥的机会大致相同)。

第一个问题可能是什么让你悲伤。