古典密码附截图和C++代码
时间:2025-03-09
时间:2025-03-09
古典密码 密码学
实验一 实现一个多表古典加密和解密程序
计算机学院 信安08-3班 柴婷婷 08083708
一、实验目的:
掌握多表古典加密方法。
二、实验要求:
能用高级语言实现古典加密方法。
三、实验内容:
多表古典加密方法主要有Playfair体制、Vigenere体制、Beaufor体制、Vernam体制和Hill体制,用高级语言实现其中一种体制的加密和解密算法。
四、实验过程:
1、Vigenere加密解密:
维吉尼亚密码引入了“密钥”的概念,即根据密钥来决定用哪一行的密表来进行替换,以此来对抗字频统计。
#include <iostream>
#include <string>
using namespace std;
const int N=26;
char
v[N][N]={{'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'}}; int number(char x)//把行号字母对应到数字
{
char y='a';
for(int i=0;i<N;i++)
{
if(x==(y+i)) return i;
}
}
void encryption(string m,string k)//加密
{
cout<<"明文:";
cin>>m;
cout<<"密钥:";
cin>>k;
int mlen,klen;
mlen=m.length();
klen=k.length();
char *p,*q,*t;//明文,初始密钥,密钥串。把string换成char
古典密码 密码学
p=new char[m.length()+1];
strcpy(p,m.c_str());
q=new char[k.length()+1];
strcpy(q,k.c_str());
t=new char[m.length()+1];
int j=0;
for(int i=0;i<mlen;i++)
{
t[i]=q[j];
j++;
j=j%klen;
}//生成密钥
cout<<"密文:";
for(i=0;i<mlen;i++)
cout<<v[number(t[i])][number(p[i])];
cout<<endl;
}
void disencryption(string c,string k)//解密
{
cout<<"密文:";
cin>>c;
cout<<"密钥:";
cin>>k;
int clen,klen;
clen=c.length();
klen=k.length();
char *p,*q,*t;//密文,初始密钥,密钥串。把string换成char
p=new char[c.length()+1];
strcpy(p,c.c_str());
q=new char[k.length()+1];
strcpy(q,k.c_str());
t=new char[c.length()+1];
int j=0;
for(int i=0;i<clen;i++)
{
t[i]=q[j];
j++;
j=j%klen;
}//生成密钥
cout<<"明文:";
for(i=0;i<clen;i++)
for(int j=0;j<N;j++)
if(v[number(t[i])][j]==p[i]) {cout<<char(j+97);break;}
cout<<endl;
古典密码 密码学
}
int main()
{
for(int i=1;i<N;i++)
{
for(int j=0;j<N;j++)
{
v[i][j]=v[i-1][(j+1)%N];
}//方阵初始化
}
cout<<"欢迎使用Vigenere加密!"<<endl<<endl;
cout<<"请选择要进行的操作"<<endl;
int flag;
do{
cout<<"1.加密2.解密3.结束:"<<endl;
cin>>flag;
string m,k;
if(flag==1)encryption(m,k);
else if(flag==2) disencryption(m,k);
else if(flag!=1&&flag!=2&&flag!=3) cout<<"输入错误,请重新输入!";
}while(flag!=3);
return 0;
}
运行结果:
2、Playfair 加解密
古典密码 密码学
算法描述:Playfair密码出现于1854年,它依据一个5*5的正方形组成的密码表来编写,密码表里排列有25个字母。如果一种语言字母超过25个,可以去掉使用频率最少的一个。英语中z使用最少,可以去掉它。法语一般去掉w或k,德语则是把i和j合起来当成一个字母看待。英语中z使用最少,可以去掉它。
加密描述:第一步是编制密码表。在这个5*5的密码表中,共有5行5列字母。第一列(或第一行)是密钥,其余按照字母顺序。密钥是一个单词或词组,若有重复字母,可将后面重复的字母去掉。当然也要把使用频率最少的字母去掉。
第二步整理明文。将明文每两个字母组成一对。如果成对后有两个相同字母紧挨或最后一个字母是单个的,就插入一个字母X。
对明文加密规则如下:
1 若p1 p2在同一行,对应密文c1 c2分别是紧靠p1 p2 右端的字母。其中第一列被看做是最后一列的右方。如,按照前表,ct对应oc
2 若p1 p2在同一列,对应密文c1 c2分别是紧靠p1 p2 下方的字母。其中第一行被看做是最后一行的下方。
3 若p1 p2不在同一行,不在同一列,则c1 c2是由p1 p2确定的矩形的其他两角的字母(至于横向替换还是纵向替换要事先约好,或自行尝试)。如,按照前表,wh对应tk或kt。
对密文解密规则如下:
1 若c1 c2在同一行,对应明文p1 p2分别是紧靠c1 c2 左端的字母。其中最后一列被看做是第一列的左方。
2 若c1 c2在同一列,对应明文p1 p2分别是紧靠c1 c2 上方的字母。其中最后一行被看做是第一行的上方。
3 若c1 c2不在同一行,不在同一列,则p1 p2是由c1 c2确定的矩形的其他两角的字母。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define NUM 1000
古典密码 密码学
int main()
{
int i,j,k=0,m,n,temp=0,length;
char key[NUM],voa[26];
char table[5][5];
char word[NUM];
printf("欢迎使用playfair加密!");
printf("密钥: ");
scanf("%s",key);
length=strlen(key);
for(i=0;i<length;i++)
{
if(key[i]=='j')
key[i]='i';
}
for(i=0; …… 此处隐藏:4803字,全部文档内容请下载后查看。喜欢就下载吧 ……
上一篇:磁盘调度算法三个java