我写了一个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));
}
答案 0 :(得分:1)
一个问题是unsigned long long
可能只有64位,中间件result*base
和base*base
很容易在modpow
函数中溢出64位。这里需要一个__int128
中间类型(如果您的编译器支持它)。
另一个问题是RSA仅适用于明文/ cipphertext值,这些值映射到不是p或q的多个整数。如果选择的是明文是p或q的倍数,则解密将失败。这对于实际(大)模量来说不是问题,因为随机地击中p或q的倍数的可能性是天文数字小(它与仅给出公钥的猜测私钥的几率大致相同)。
第一个问题可能是导致你悲痛的原因。