加密

计算和编程实现

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;

}

 

运行结果:

 

posted @ 2013-11-28 11:16  蓦然回首的包子  阅读(320)  评论(0)    收藏  举报