以下是我写的一份RSA算法加密和解密的代码,目前可能是加密部分出现了问题,解密出来的和需要传输的信息不一致,有无大佬指出错误,如果是其他部分的问题也欢迎提出,悬关不限,有用即关
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
random_device random;
int main();
bool isPrime(int x){
if(x<=1) return false;
for(int i=2;i<x;i++) if(x%i==0) return false;
return true;
}
ll p,q,N,T,E,D=1;//加密·要点生成
ll a;//加密
ll b;//解密
ll RSA_Single(ll x,ll E,ll N){
ll ans=x;
for(int i=1;i<E;i++){
ans*=x;
ans=ans%N;
if(ans==0) ans=N;
}
return ans;
}
void Encryption(){
while(1){
if(!isPrime(p)) p=3+(random()%5);
if(!isPrime(q)) q=3+(random()%5);
if(isPrime(p)&&isPrime(q)) break;
}
N=p*q;
T=(p-1)*(q-1);
while(1){
if((isPrime(E)&&((T%E)!=0))) break;
E++;
}
while(1){
if(((D*E)%T==1)&&(D!=E)) break;
D++;
}
cout<<"Something:\n秘钥生成:";
cout<<"\n公钥("<<E<<", "<<N<<")\n私钥("<<D<<", "<<N<<")\n";
//以上是生成必备的几个数字
cout<<"Attention:\n在使用过程中\n请把私钥告诉对方(保证只有对方知道)\n而公钥可以被任何人知道\n\n接下来请输入您要加密的内容\n请务必以数字形式呈现\n数之间以空格隔开\n之后点击“Enter”键程序会给出解密后的内容\n如您还需要解密操作\n再次按上述要求输入数字即可\n\n请输入:\n";
while(cin>>a) cout<<RSA_Single(a,E,N)<<' ';
}
void Deciphering(){
cout<<"Attention:\n请以“D N”的形式输入私钥\nD和N分别表示私钥的两个数字\n输入:";
int d,n;
scanf("%d %d",&d,&n);
cout<<"\n收到\n请输入加密后的内容\n请务必以数字形式呈现\n数之间以空格隔开\n之后点击“Enter”键程序会给出解密后的内容\n如您还需要解密操作\n再次按上述要求输入数字即可\n\n请输入:\n";
while(cin>>b) cout<<RSA_Single(b,d,n)<<' ';
}
int main(){
setlocale(LC_ALL,"chs");
cout<<"-RSA算法非对称加密-\n请保证您记录好您需要的信息\n如果您发现程序持续三秒以上不给予任何输出\n那么您需要重启程序\n\n请问您需要RSA的加密还是解密功能?\n1.加密 2.解密\n";
int choose;
cin>>choose;
if(choose==1) Encryption();
else if(choose==2) Deciphering();
return 0;
}