我的"RSA Algorithm"代码不适用于所有数字



我写了这段代码,但它并不适用于所有数字。(RSA算法)

using namespace std;
int main () {
int x;
int p = 13;
int q = 11;
long n = p * q;
long φ = (p - 1) * (q - 1);
long e = φ - 1;
long d = φ + e;
cout<<"Plz enter a number.n";
cin>>x;
long y = pow (x,e);
long a = y % n;
long b = pow (a,d);
long c = b % n;
cout<<"Original = "<<x<<endl;
cout<<"Encrypted = "<<a<<endl;
cout<<"Decrypted = "<<c<<endl;
return 0;
}

对于某些数字,加密和解密显示相同的数字,对于较大的数字,它们显示随机数字。

简短的回答是,你不能真正使用pow进行加密或解密阶段,因为首先它是一个浮点函数,即使是整型参数的结果也不能保证是最好的返回值,转换为int可能会截断。

其次,你得到的数字很大,即使对于相当小的n = pq,这很可能是整型溢出,结果未定义。

有更快的方法来获得结果,但一种方法是自己计算功率,记住在RSA中它是模n

所以,与其

long y = pow(x, e);

后面跟着y % n,写成

long y = 1;
for (long i = 0; i < e; ++i){
y = y * e % n;
}

体面的RSA实现使用了更快的方法,但这对于理解该方法很有帮助。

同时,避免源代码中isalnum将返回false的任何字符。

(我没有仔细检查你的数学,特别是Carmichael totient函数,或者模乘法逆。)

最新更新