我写了这段代码,但它并不适用于所有数字。(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函数,或者模乘法逆。)