当前位置:文档之家› 信息安全古典密码之凯撒密码

信息安全古典密码之凯撒密码

信息安全古典密码之凯撒密码
信息安全古典密码之凯撒密码

《网络攻击与防御》

实验报告

计算机科学与技术学院

计算机系网络教研室制

一、实验目的

(1)编程实现凯撒加密、解密算法,理解密码学基础知识,初步建立密码学思维方式。

(2)通过不断增加凯撒解密难度,理解唯密文解密,提高解密性能。

二、实验环境

操作系统:Windows 10操作系统

软件工具:C++语言编译环境

三、实验内容与实验要求

(1)在允许输入密码条件下,编程实现凯撒密码加解密解密。要求:

①从一文本文件读入英文文章(明文或密文)。

②对读入内容加密或解密后写入另一文本文件。

(2)在不允许输入密码条件下,编程实现解密凯撒密码加密密文。要求绘制三种情况下解密程序流程图,说明不同解密程序存在的不足。程序需要计算、显示解密使用时间(单位:ms)。

①已知c1 =wklv lv d errn,求p1。(初级解密)

问:两次使用凯撒,能否正确解密?(字符串用凯撒加密后的结果再用凯撒加密一次。)

②已知c1 =go kbo cdenoxdc,或c1 =zh duh vwxghqwv,求p1。(中级解密)

③已知c1 =rxwvlgh wkh eleoh, wkhvh vla zrugv duh wkh prvw idprxv lq doo wkh olwhudwxuh ri wkh zruog. wkhb zhuh vsrnhq eb kdpohw zkhq kh zdv wklqnlqj dorxg, dqg wkhb duh wkh prvw idprxv zrugv lq vkdnhvshduh ehfdxvh kdpohw zdv vshdnlqj qrw rqob iru klpvhoi exw dovr iru hyhub wklqnlqj pdq dqg zrpdq. wr eh ru qrw wr eh, wr olyh ru qrw wr olyh, wr olyh ulfkob dqg dexqgdqwob dqg hdjhuob, ru wr olyh gxoob dqg phdqob dqg vfdufhob. d sklorvrskhu rqfh zdqwhg wr nqrz zkhwkhu kh zdv dolyh ru qrw, zklfk lv d jrrg txhvwlrq iru hyhubrqh wr sxw wr klpvhoi rffdvlrqdoob. kh dqvzhuhg lw eb vdblqj: "l wklqn, wkhuhiruh dp." ,求p1。(高级解密)对给定较长密文文件进行解密测试,测试结果填入表。

要求密文的内容不少于1000个英文单词,使用凯撒密码加密,加密密码保密。正确率=正确单词数/单词总数,智能程度:优秀(解密结果正确与否不需要人工判断)、一般。

四、实验过程与分析

(1)在允许输入密码条件下的实验结果。

从file1中读入明文,将密文存放在file2中

(2)在不允许输入密码条件下的实验结果

①在有单个字母的情况下,初级解密

②无单个字母下,中级解密,依次用1-25作为密钥。

③高级解密

初级解密:

中级解密:

高级解密:

五、实验结果总结

是一种最简单且最广为人知的加密技术。它是一种替换加密的技术,明文中的所有字母都在字母表上向后(或向前)按照一个固定数目进行偏移后被替换成密文。例如,当偏移量是3的时候,所有的字母A将被替换成D,B变成E,以此类推。使用时,加密者查找明文字母表中需要加密的消息中的每一个字母所在位置,并且写下密文字母表中对应的字母。需要解密的人则根据事先已知的密钥反过来操作,得到原来的明文。

源代码:

#include

#include

#include

#include

#include

#define N 1000

#define TARGET 0.065379

#define LIST_LEN 26

using namespace std;

const double p[LIST_LEN] = {0.082,0.015,0.028,0.042,0.127,

0.022,0.02, 0.061,0.07, 0.001,

0.008,0.04, 0.024,0.067,0.075,

0.019,0.001,0.06, 0.063,0.09,

0.028,0.01, 0.024,0.02, 0.001,0.001};

string dict[7] = {"we", "be", "to", "am", "you", "are", "the"};

void file_print(char *filename)

{ifstream infile;

char ch;

int i=0;

infile.open(filename, ios::in);

if(!infile)

{cout<<"open error!"<

exit(1);

}

while(infile.get(ch))

{cout<

}

cout<

infile.close();

}

int number(char *filename)

{ifstream infile;

char ch;

int i=0;

infile.open(filename, ios::in);

if(!infile)

{cout<<"open error!"<

exit(1);

}

while(infile.get(ch))

{

i++;

}

infile.close();

return i;

}

void Encrypt()

{ifstream infile;

ofstream outfile;

char ch, *code;

unsigned char str[N];

code=new char(2);

cout<<"明文为:"<

file_print("file1.txt");

int n = number("file1.txt");

infile.open("file1.txt", ios::in);

if(!infile)

{cout<<"open error!"<

exit(1);

}

cout<<"请输入一位英文字符密码:"<>code;

code[1]='\0';

//cout<

if(code[1]!='\0')

cout<<"输入错误,请输入一位英文字符:"<=65 && code[0]<=90)

{code[0] += 32;

}

for(int i=0;i

infile>>str[i];

}

outfile.open("file2.txt");

if(!outfile)

{cout<<"open error!"<

exit(1);

}

int key = code[0]-97;

cout<<"密钥为:"<

for(i=0;str[i]!=0;i++)

{if(str[i]>=65 && str[i]<=90)

str[i] += 32;

if(str[i]<97 || str[i]>122) continue; str[i]+=key;

if(str[i]>122)

{

str[i] -= 26;

}

outfile.put(str[i]);

}

infile.close();

outfile.close();

cout<<"密文为:"<

file_print("file2.txt");

}

void primary(char c)

{DWORD start_time = GetTickCount(); ifstream infile;

char ch;

unsigned char str[N];

infile.open("file3.txt", ios::in);

if(!infile)

{cout<<"open error!"<

exit(1);

}

for(int i=0;infile.get(ch);i++)

{str[i]=ch;

//cout<

}

int key = abs(c-'a');

//cout<

cout<<"密文为:"<

file_print("file3.txt");

int n = number("file3.txt");

//cout<

cout<<"明文为:"<

for(i=0;i

{if(str[i] == ' ')

{str[i] = 32;

cout<

}

if(str[i]<97 || str[i]>122)

cout<

else {

str[i] -= key;

if(str[i]<97) str[i] += 26;

cout<

}

}

cout<

infile.close();

DWORD end_time = GetTickCount();

cout << "解密时间为:" <

void Mediate_senior(unsigned char str[], int n)

{int key = 1;

int similar = 0;

for(int i=0;i

{if(str[i] == ' ')

{str[i] = 32;

cout<

}

if(str[i]<97 || str[i]>122)

cout<

else {

str[i] -= key;

if(str[i]<97) str[i] += 26;

cout<

}

}

}

void intermediate()

{DWORD start_time = GetTickCount();

ifstream infile;

char ch;

unsigned char str[N];

infile.open("file3.txt", ios::in);

if(!infile)

{cout<<"open error!"<

exit(1);

}

cout<<"密文为:"<

for(int i=0;infile.get(ch);i++)

{str[i]=ch;

cout<

}

cout<

for(int n=1;n<=25;n++)

{

cout<<"k="<

Mediate_senior(str, number("file3.txt"));

printf("\n");

}

DWORD end_time = GetTickCount();

cout << "解密时间为:" <

/*统计filename中字母出现频率,存放在数组q中*/

void count(const char filename[], double q[LIST_LEN])

{

int i, len = 0; /* len 为字母总个数约等于密文长度*/

FILE *fin = fopen(filename, "r");

char ch;

for (i = 0; i < LIST_LEN; i++) q[i] = 0;

while ((ch = fgetc(fin)) != EOF) {

if (isalpha(ch)) {

len++;

ch = tolower(ch);

q[ch-'a'] += 1;

}

}

fclose(fin);

for (i = 0; i < LIST_LEN; i++) q[i] /= len;

}

/*破解密钥key,并且将其中数组q存放密文字母出现频率*/

int analysis(const char filename[], double q[LIST_LEN])

{

int i, j, key = 0;

double eps = 1; /* eps 存储与TARGET最小差值*/

count(filename, q);

for (j = 0; j < LIST_LEN; j++) { /*变量j穷举密钥*/

double sum = 0, tem;

for (i = 0; i < LIST_LEN; i++) {

/* 求sum{p[i]*q[i+j]}之和 */

int t = (i+j) % 26;

sum += p[i] * q[t];

}

tem = fabs(sum-TARGET);

if (tem < eps) {

eps = tem; key = j;

}

}

return key:

}

void senior()

{ifstream infile;

char ch;

unsigned char str[N];

infile.open("file4.txt", ios::in); if(!infile)

{cout<<"open error!"<

exit(1);

}

for(int i=0;infile.get(ch);i++)

{str[i]=ch;

//cout<

}

double q[LIST_LEN];

int key = analysis("file4.txt", q); //cout<

file_print("file4.txt");

int n = number("file4.txt");

//cout<

for(i=0;i

{if(str[i] == ' ')

{str[i] = 32;

cout<

}

if(str[i]<97 || str[i]>122)

cout<

else {

str[i] -= key;

if(str[i]<97) str[i] += 26;

cout<

}

}

cout<

infile.close();

}

void main()

{cout<<"密码输入条件下:"<

Encrypt();

cout<<"无密码条件下解密:"<

ifstream infile;

char ch;

infile.open("file3.txt", ios::in);

if(!infile)

{cout<<"open error!"<

exit(1);

}

int count1=0, count2=0;

while(infile.get(ch))

{count1++;

//cout<

if(ch == ' ')

count1 = 0;

if(infile.peek() == ' ')

{if(count1 == 1)

{//cout<

cout<<"初级解密(不能出现一个字母的单词):"<

primary(ch);

break;

}

}

count2++;

}

if(count2 == number("file3.txt"))

{cout<<"中级解密:";intermediate();}

cout<<"高级解密:"<

DWORD start_time = GetTickCount();

senior();

DWORD end_time = GetTickCount();

cout << "解密时间为:" <

相关主题
文本预览
相关文档 最新文档