古典密码附截图和C++代码

时间: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字,全部文档内容请下载后查看。喜欢就下载吧 ……

古典密码附截图和C++代码.doc 将本文的Word文档下载到电脑

    精彩图片

    热门精选

    大家正在看

    × 游客快捷下载通道(下载后可以自由复制和排版)

    限时特价:7 元/份 原价:20元

    支付方式:

    开通VIP包月会员 特价:29元/月

    注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
    微信:fanwen365 QQ:370150219