加密
计算和编程实现
1. 古典加密方法中的棋盘密码如下: 请写出明文
4 6 7 8 1 5 2 9 0 3
6 a b c d e f g h i j
3 k l m n o p q r s t
9 u v w x y z ? ! , .
明文—
密文—893197643961913194…
代码:
#include <iostream>
#include <string>
using namespace std;
void main(){
char k[4][11]={
{' ','4','6','7','8','1','5','2','9','0','3'},
{'6','a','b','c','d','e','f','g','h','i','j'},
{'3','k','l','m','n','o','p','q','r','s','t'},
{'9','u','v','w','x','y','z','?','!',',','.'}};
for(int i=0;i<4;i=i++)
{for(int j=0;j<11;j=j++)
{cout<<k[i][j];}
cout<<endl;}
cout<<endl;
char s[]="";
int temp1=0;
int temp2=0;
cout<<"请输入密文(数字组成):";
cin>>s;
cout<<endl<<"明文为:";
for(int i=0;i<strlen(s);i=i+2)
{
for(int j=1;j<4;j++){
if(s[i]==k[j][0]) {temp1=j;break;}
else temp1=0;
}
for(int p=1;p<11;p++){
if(s[i+1]==k[0][p]) {temp2=p;break; }
else temp2=0;
}
cout<<k[temp1][temp2];
}
system("pause");
}
运行结果:

2. 描述RSA算法加密原理,并设计密钥、设计密文、恢复明文。已知p=11, q=37 (明文:xidianuniversity,字母的数值要么按其在字母表中的顺序或者使用ASCII码)。
答: RSA算法运用了数论中的Euler定理,即a、r是两个互素的正整数,则az=1(mod r),其中z 为与r 互素且不大于r 的正整数的个数(即Euler函数)。而RSA算法选用一个合数(该合数为两个大素数的乘积),而不是选用一个大素数作为其模数r。
代码:
#include <iostream>
#include <string>
using namespace std;
int gongyueshu(int num1,int num2);
void main(){
cout<<"请输入两个素数p和q:";
int p,q,d,e;
char m[]="";
int mimi[32];
cin>>p>>q;
cout<<endl;
int n=p*q;
int z=(p-1)*(q-1);
for(int i=1;i<1000;i++)
{
if(gongyueshu(z,i)==1)
{
d=i;
}
}
for(int i=1;i<1000;i++){
if(i*d%z==1)
{
e=i;
}
}
cout<<"公开密钥("<<e<<","<<n<<")"<<endl;
cout<<"私有密钥("<<d<<","<<n<<")"<<endl;
cout<<"使用ASCII码"<<endl;
cout<<"请输入明文:";
cin>>m;
cout<<"密文:";
for(int i=0;i<strlen(m);i++)
{
int k=m[i];
int yushu=(k^e)%n;
cout<<yushu;
}
cout<<endl;
cout<<"请输入密文:";
cin>>mimi[32];
cout<<"明文:";
for(int i=0;i<32;i=i+2)
{
int k=mimi[i]*10+mimi[i+1];
char r=(k^d)%n;
cout<<r;
}
system("pause");
}
//求两个数的最大公约数
int gongyueshu(int num1,int num2){
int a,b,temp;
if(num1<num2)/*交换两个数,使大数放在num1上*/
{
temp=num1;
num1=num2;
num2=temp;
}
a=num1;b=num2;
while(b!=0)/*利用辗除法,直到b为0为止*/
{
temp=a%b;
a=b;
b=temp;
}
return a;
}
运行结果:


浙公网安备 33010602011771号