谁能给可以编译的源代码??
C++实现DES算法和RSA算法???
答案:1 悬赏:70 手机版
解决时间 2021-05-03 15:44
- 提问者网友:萌卜娃娃
- 2021-05-03 08:51
最佳答案
- 五星知识达人网友:长青诗
- 2021-05-03 10:15
#include<iostream.h>
#include <stdlib.h>
#include<math.h>
#include<String.h>
int r; //公开模数
int sk; //私人密钥
int pk; //公开密钥
int Euler;//欧拉函数
int check(int x)
{
for(int i=2;i<=x-1;i++)
{
if(x%i==0) break;
}
if(i==x) return 1;
else return 0;
}
void produceSS()
{
int p,q;
int flag=0;
int n=0;
cout<<"输入值不要太大,防止溢出!"<<endl;
while(flag==0)
{
if(n>0) cout<<"p应为素数,请重新输入!"<<endl;
cout<<"请输入素数p:";
cin>>p;
flag=check(p);
n++;
}
flag=0;
n=0;
while(flag==0)
{
if(n>0) cout<<"q应为素数,请重新输入!"<<endl;
cout<<"请输入素数q:";
cin>>q;
flag=check(q);
n++;
}
r=p*q;
cout<<"公开模数:r="<<r<<endl;
Euler=(p-1)*(q-1);
cout<<"欧拉函数:Euler="<<Euler<<endl;
}
int gcd(int x,int y)
{
int a=x;
int b=y;
int z;
b++;
do
{
b--;
x=a;
y=b;
while(x%y!=0)
{
z=x%y;
x=y;
y=z;
}
}while(z>1);
return b;
}
int trAsc(int s,int a[]) //转为二进制数
{
int x=s;
int n=0;
while(x!=0)
{
a[n]=x%2;
x=x/2;
n++;
}
return n;
}
int pfc(int x,int key) //平方乘
{
int a[13];
int m=trAsc(key,a); //二进制位数
int c=1;
for(int i=m-1;i>=0;i--)
{
c=c*c%r;
if(a[i]==1) c=c*x%r;
}
return c;
}
int producePk()
{
int a1=sk;
int r1=r;
int q1, p1;
int b1=0;
int b2=1;
int b3;
do{
cout<<a1<<endl;
p1=r1/a1;
q1=r1%a1;
b3=b1-b2*p1;
b1=b2;
b2=b3;
r1=a1;
a1=q1;
}while(a1!=1);
return abs(b2);
}
void produceKey()
{
int k;
int n=0;
int flag=0;
int b1=0;
int b2=1;
int a,c,q,p;
cout<<"初始密钥应小于欧拉函数:"<<r<<endl;
cout<<"请输入初始密钥:";
cin>>sk;
sk++;
do
{
sk--;
sk=abs(sk);
sk=gcd(Euler,sk);
b1=0;
b2=1;
a=sk;
c=Euler;
do
{
q=c/a;
p=c%a;
pk=b1-b2*q;
c=a;
a=p;
b1=b2;
b2=pk;
}while (p!=1);
pk=abs(pk);
a=pfc(8,sk);
c=pfc(a,pk);
} while(c!=8); //加密、解密正确判断
cout<<"私人密钥:sk="<<sk<<endl;
cout<<"公开密钥:pk="<<pk<<endl;
}
void Encryption() //加密
{
int Express;
int flag=1;
while(flag)
{
cout<<"明文编码应小于公开模数r:"<<r<<endl;
cout<<"请输入要加密的明文编码(十进制数):";
cin>>Express;
if(Express>r)
cout<<"明文编码应大于公开模数,请重新输入!"<<endl;
else flag=0;
}
cout<<"sk="<<sk<<endl;
cout<<"原编码为:"<<Express;
Express=pfc(Express,sk);
cout<<"密文为:"<<Express<<endl;
}
void Decrypt()//减密
{
int Express;
int flag=1;
while(flag)
{
cout<<"密文编码应小于公开模数r:"<<r<<endl;
cout<<"请输入要加密的密文编码(十进制数):";
cin>>Express;
if(Express>r)
cout<<"密文编码应大于公开模数,请重新输入!"<<endl;
else flag=0;
}
cout<<"pk="<<pk<<endl;
cout<<"原编码为:"<<Express;
Express=pfc(Express,pk);
cout<<"明文为:"<<Express<<endl;
}
void main()
{
int flag=1;
int step;
int n;
while(flag)
{
cout<<"1.产生素数"<<endl;
cout<<"2.产生密钥"<<endl;
cout<<"3.加密"<<endl;
cout<<"4.解密"<<endl;
cout<<"5.退出"<<endl;
cout<<"请输入您的操作(1,2,3,4或5):";
cin>>step;
switch(step)
{
case 1:produceSS();
break;
case 2:produceKey();
break;
case 3:Encryption();
break;
case 4:Decrypt();
break;
case 5:exit(0);
break;
}
}
}
此程序可以直接运行!
运行结果:
1.产生素数
2.产生密钥
3.加密
4.解密
5.退出
请输入您的操作(1,2,3,4或5):1
输入值不要太大,防止溢出!
请输入素数p:47
请输入素数q:61
公开模数:r=2867
欧拉函数:Euler=2760
1.产生素数
2.产生密钥
3.加密
4.解密
5.退出
请输入您的操作(1,2,3,4或5):2
初始密钥应小于欧拉函数:2867
请输入初始密钥:167
私人密钥:sk=167
公开密钥:pk=1223
1.产生素数
2.产生密钥
3.加密
4.解密
5.退出
请输入您的操作(1,2,3,4或5):3
明文编码应小于公开模数r:2867
请输入要加密的明文编码(十进制数):123
sk=167
原编码为:123密文为:1770
1.产生素数
2.产生密钥
3.加密
4.解密
5.退出
请输入您的操作(1,2,3,4或5):4
密文编码应小于公开模数r:2867
请输入要加密的密文编码(十进制数):1770
pk=1223
原编码为:1770明文为:123
1.产生素数
2.产生密钥
3.加密
4.解密
5.退出
请输入您的操作(1,2,3,4或5):5
#include <stdlib.h>
#include<math.h>
#include<String.h>
int r; //公开模数
int sk; //私人密钥
int pk; //公开密钥
int Euler;//欧拉函数
int check(int x)
{
for(int i=2;i<=x-1;i++)
{
if(x%i==0) break;
}
if(i==x) return 1;
else return 0;
}
void produceSS()
{
int p,q;
int flag=0;
int n=0;
cout<<"输入值不要太大,防止溢出!"<<endl;
while(flag==0)
{
if(n>0) cout<<"p应为素数,请重新输入!"<<endl;
cout<<"请输入素数p:";
cin>>p;
flag=check(p);
n++;
}
flag=0;
n=0;
while(flag==0)
{
if(n>0) cout<<"q应为素数,请重新输入!"<<endl;
cout<<"请输入素数q:";
cin>>q;
flag=check(q);
n++;
}
r=p*q;
cout<<"公开模数:r="<<r<<endl;
Euler=(p-1)*(q-1);
cout<<"欧拉函数:Euler="<<Euler<<endl;
}
int gcd(int x,int y)
{
int a=x;
int b=y;
int z;
b++;
do
{
b--;
x=a;
y=b;
while(x%y!=0)
{
z=x%y;
x=y;
y=z;
}
}while(z>1);
return b;
}
int trAsc(int s,int a[]) //转为二进制数
{
int x=s;
int n=0;
while(x!=0)
{
a[n]=x%2;
x=x/2;
n++;
}
return n;
}
int pfc(int x,int key) //平方乘
{
int a[13];
int m=trAsc(key,a); //二进制位数
int c=1;
for(int i=m-1;i>=0;i--)
{
c=c*c%r;
if(a[i]==1) c=c*x%r;
}
return c;
}
int producePk()
{
int a1=sk;
int r1=r;
int q1, p1;
int b1=0;
int b2=1;
int b3;
do{
cout<<a1<<endl;
p1=r1/a1;
q1=r1%a1;
b3=b1-b2*p1;
b1=b2;
b2=b3;
r1=a1;
a1=q1;
}while(a1!=1);
return abs(b2);
}
void produceKey()
{
int k;
int n=0;
int flag=0;
int b1=0;
int b2=1;
int a,c,q,p;
cout<<"初始密钥应小于欧拉函数:"<<r<<endl;
cout<<"请输入初始密钥:";
cin>>sk;
sk++;
do
{
sk--;
sk=abs(sk);
sk=gcd(Euler,sk);
b1=0;
b2=1;
a=sk;
c=Euler;
do
{
q=c/a;
p=c%a;
pk=b1-b2*q;
c=a;
a=p;
b1=b2;
b2=pk;
}while (p!=1);
pk=abs(pk);
a=pfc(8,sk);
c=pfc(a,pk);
} while(c!=8); //加密、解密正确判断
cout<<"私人密钥:sk="<<sk<<endl;
cout<<"公开密钥:pk="<<pk<<endl;
}
void Encryption() //加密
{
int Express;
int flag=1;
while(flag)
{
cout<<"明文编码应小于公开模数r:"<<r<<endl;
cout<<"请输入要加密的明文编码(十进制数):";
cin>>Express;
if(Express>r)
cout<<"明文编码应大于公开模数,请重新输入!"<<endl;
else flag=0;
}
cout<<"sk="<<sk<<endl;
cout<<"原编码为:"<<Express;
Express=pfc(Express,sk);
cout<<"密文为:"<<Express<<endl;
}
void Decrypt()//减密
{
int Express;
int flag=1;
while(flag)
{
cout<<"密文编码应小于公开模数r:"<<r<<endl;
cout<<"请输入要加密的密文编码(十进制数):";
cin>>Express;
if(Express>r)
cout<<"密文编码应大于公开模数,请重新输入!"<<endl;
else flag=0;
}
cout<<"pk="<<pk<<endl;
cout<<"原编码为:"<<Express;
Express=pfc(Express,pk);
cout<<"明文为:"<<Express<<endl;
}
void main()
{
int flag=1;
int step;
int n;
while(flag)
{
cout<<"1.产生素数"<<endl;
cout<<"2.产生密钥"<<endl;
cout<<"3.加密"<<endl;
cout<<"4.解密"<<endl;
cout<<"5.退出"<<endl;
cout<<"请输入您的操作(1,2,3,4或5):";
cin>>step;
switch(step)
{
case 1:produceSS();
break;
case 2:produceKey();
break;
case 3:Encryption();
break;
case 4:Decrypt();
break;
case 5:exit(0);
break;
}
}
}
此程序可以直接运行!
运行结果:
1.产生素数
2.产生密钥
3.加密
4.解密
5.退出
请输入您的操作(1,2,3,4或5):1
输入值不要太大,防止溢出!
请输入素数p:47
请输入素数q:61
公开模数:r=2867
欧拉函数:Euler=2760
1.产生素数
2.产生密钥
3.加密
4.解密
5.退出
请输入您的操作(1,2,3,4或5):2
初始密钥应小于欧拉函数:2867
请输入初始密钥:167
私人密钥:sk=167
公开密钥:pk=1223
1.产生素数
2.产生密钥
3.加密
4.解密
5.退出
请输入您的操作(1,2,3,4或5):3
明文编码应小于公开模数r:2867
请输入要加密的明文编码(十进制数):123
sk=167
原编码为:123密文为:1770
1.产生素数
2.产生密钥
3.加密
4.解密
5.退出
请输入您的操作(1,2,3,4或5):4
密文编码应小于公开模数r:2867
请输入要加密的密文编码(十进制数):1770
pk=1223
原编码为:1770明文为:123
1.产生素数
2.产生密钥
3.加密
4.解密
5.退出
请输入您的操作(1,2,3,4或5):5
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯