实验一 加密与解密

一、实验目的

1.提高对加密与解密原理的认识

2.提高对信息隐藏原理的认识

3.学会使用加密与隐藏软件

4.了解口令破解基本方法;

5.体会设置安全口令的重要意义

二、实验要求

使用任意高级语言做出给文本文件加、解密的软件.

三、实验重点、难点

1.Easy code boy plus的使用

2.能熟练运用Lophtcrack、Aoxppr、Apdfprp、Mailhack等

四、实验学时

2学时

五、实验内容

1、凯撒密码实现、维吉尼亚表加密、DES

2、加密与隐藏软件的使用

3、利用破解密码软件破解口令

六、注意事项

Easy code boy plus可以将不同类型的文件作为寄主文件,将各种文件隐藏到不同类型的文件中。为了减少实验时间,实验破解用的密码可以选得简单一些。如1234。

七、实验步骤:

任务一、参考教科书有关内容,掌握凯撒加密方法,自行设计密钥.编制程序。

密码术可以大致别分为两种:即换位和替代,当然也有两者结合的更复杂的方法。在换位中字母不变,位置改变;替代中字母改变,位置不变。

将替代密码用于军事用途的第一个文件记载是恺撒著的《高卢记》。恺撒描述了他如何将密信送到正处在被围困、濒临投降的西塞罗。其中罗马字母被替换成希腊字母使得敌人根本无法看懂信息。苏托尼厄斯在公元二世纪写的《恺撒传》中对恺撒用过的其中一种替代密码作了详细的描写。恺撒只是简单地把信息中的每一个字母用字母表中的该字母后的第三个字母代替。这种密码替换通常叫做凯撒移位密码,或简单的说,凯撒密码。 凯撒密码是将每一个字母向前推移K位。如K=3,则它的每一个明文字符都由其右边第三个(模26)字符代换如将字母A换作字母D,将字母B换作字母E。

如有这样一条指令: RETURN TO ROME

用恺撒密码加密后就成为: UHWXUA WR URPH

如果这份指令被敌方截获,也将不会泄密,因为字面上看不出任何意义。

这种加密方法还可以依据移位的不同产生新的变化,如将每个字母左19位,就产生这样一个明密对照表:

明: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

密:T U V W X Y Z A B C D E F G H I J K L M N O P Q R S

暴力破解: 使用从1-25的密钥依次解密密文,看看得出来的结果是怎样的。

参考资料: 尽管苏托尼厄斯仅提到三个位置的恺撒移位,但显然从1到25个位置的移位我们都可以使用, 因此,为了使密码有更高的安全性,单字母替换密码就出现了。

如: 明码表 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

密码表 Q W E R T Y U I O P A S D F G H J K L Z X C V B N M

明文 F O R E S T 密文 Y G K T L Z

只需重排密码表二十六个字母的顺序,允许密码表是明码表的任意一种重排,密钥就会增加到四千亿亿亿多种,我们就有超过4×1027种密码表。破解就变得很困难。 如何破解包括恺撒密码在内的单字母替换密码?

方法:字母频度分析

尽管我们不知道是谁发现了字母频度的差异可以用于破解密码。但是9世纪的科学家阿尔·金迪在《关于破译加密信息的手稿》对该技术做了最早的描述。“如果我们知道一条加密信息所使用的语言,那么破译这条加密信息的方法就是找出同样的语言写的一篇其他文章,大约一页纸长,然后我们计算其中每个字母的出现频率。我们将频率最高的字母标为1号,频率排第2的标为2号,第三标为3号,依次类推,直到数完样品文章中所有字母。然后我们观察需要破译的密文,同样分类出所有的字母,找出频率最高的字母,并全部用样本文章中最高频率的字母替换。第二高频的字母用样本中2号代替,第三则用3号替换,直到密文中所有字母均已被样本中的字母替换。” 以英文为例,首先我们以一篇或几篇一定长度的普通文章,建立字母表中每个字母的频度表。

在分析密文中的字母频率,将其对照即可破解。虽然设密者后来针对频率分析技术对以前的设密方法做了些改进,比如说引进空符号等,目的是为了打破正常的字母出现频率。但是小的改进已经无法掩盖单字母替换法的巨大缺陷了。到16世纪,最好的密码破译师已经能够破译当时大多数的加密信息。局限性: 短文可能严重偏离标准频率,加入文章少于100个字母,那么对它的解密就会比较困难。

1、开发工具:

DEV

2、代码编制:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
凯撒:

\#include <stdio.h>

int main()

{

char P[100];/*定义明文长度*/

char C[100];/*定义密文长度*/

int K=3,i;

printf("Please input Plaintext:\n"); /*输入明文*/

gets(P); /* 接受明文*/



for(i=0;P[i]!='\0';i++) { /*逐个判断字母的大小*/

if(P[i]>='a'&&P[i]<='z') /*小写字母 */

C[i]=(P[i]-'a'+K)%26+'a';

else if(P[i]>='A'&&P[i]<='Z')/*大写字母 */

C[i]=(P[i]-'A'+K)%26+'A';

else C[i]=' ';/*如果不是字母,转换为空格*/

}



printf("The Ciphertext is :\n%s\n",C);/*输出密文*/

// getch();

return 0;

}

1、程序结构化,用函数分别实现

2、对文件的加密,解密输出到文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
#include<stdio.h>

#include<conio.h>



void menu()/*菜单,1.加密 2.解密 3.退出*/

{

//clrscr();

printf("\n===============================================================================");

printf("\n1.Encrypt the file");

printf("\n2.Decrypt the file");

printf("\n3.Quit\n");

printf("===============================================================================\n");

printf("Please select a item:");

return;

}



char encrypt(char ch,int n)/*加密函数,把字符向右循环移位n*/

{

while(ch>='A'&&ch<='Z')

{

return ('A'+(ch-'A'+n)%26);

}

while(ch>='a'&&ch<='z')

{

return ('a'+(ch-'a'+n)%26);

}

return ch;

}





main()

{

int i,n;

char ch0,ch1;

FILE *in,*out;

char infile[10],outfile[10];



//textbackground(RED);

//textcolor(LIGHTGREEN);

//clrscr();



menu();

ch0=getch();



while(ch0!='3')

{

if(ch0=='1')

{

// clrscr();

printf("\nPlease input the infile:");

scanf("%s",infile);/*输入需要加密的文件名*/



if((in=fopen(infile,"r"))==NULL)

{

printf("Can not open the infile!\n");

printf("Press any key to exit!\n");

getch();

// exit(0);

}



printf("Please input the key:");

scanf("%d",&n);/*输入加密密码*/



printf("Please input the outfile:");

scanf("%s",outfile);/*输入加密后文件的文件名*/



if((out=fopen(outfile,"w"))==NULL)

{

printf("Can not open the outfile!\n");

printf("Press any key to exit!\n");

fclose(in);

getch();

// exit(0);

}



while(!feof(in))/*加密*/

{

fputc(encrypt(fgetc(in),n),out);

}



printf("\nEncrypt is over!\n");

fclose(in);

fclose(out);

// sleep(1);

}



if(ch0=='2')

{

// clrscr();

printf("\nPlease input the infile:");

scanf("%s",infile);/*输入需要解密的文件名*/



if((in=fopen(infile,"r"))==NULL)

{

printf("Can not open the infile!\n");

printf("Press any key to exit!\n");

getch();

// exit(0);

}



printf("Please input the key:");

scanf("%d",&n);/*输入解密密码(可以为加密时候的密码)*/



n=26-n;



printf("Please input the outfile:");

scanf("%s",outfile);/*输入解密后文件的文件名*/



if((out=fopen(outfile,"w"))==NULL)

{

printf("Can not open the outfile!\n");

printf("Press any key to exit!\n");

fclose(in);

getch();

// exit(0);

}



while(!feof(in))

{

fputc(encrypt(fgetc(in),n),out);

}

printf("\nDecrypt is over!\n");

fclose(in);

fclose(out);

// sleep(1);

}





//clrscr();



// printf("\nGood Bye!\n");

//sleep(3);







getch();

}

}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
/*移位法:*/

#include <stdio.h>

#include <stdlib.h>

char *Encrypt(char *pwd,int key) /*加密*/

{

for(int i=0;*(pwd+i)!='\0';i++)

{

if(*(pwd+i)>='a'&&*(pwd+i)<='z')

*(pwd+i)=(*(pwd+i)-'a'+key)%26+'a';

else if(*(pwd+i)>='A'&&*(pwd+i)<='Z')

*(pwd+i)=(*(pwd+i)-'A'+key)%26+'A';

}

return pwd;

}



char *Decrypt(char *pwd,int key) /*解密*/

{

for(int i=0;*(pwd+i)!='\0';i++)

{

if(*(pwd+i)>='a'&&*(pwd+i)<='z')

{

if(*(pwd+i)-'a'>=key%26)

*(pwd+i)=*(pwd+i)-key%26;

else *(pwd+i)='z'-(key%26-(*(pwd+i)-'a'))-1;

}

else if(*(pwd+i)>='A'&&*(pwd+i)<='Z')

{

if(*(pwd+i)-'A'>=key%26)

*(pwd+i)=*(pwd+i)-key%26;

else *(pwd+i)='Z'-(key%26-(*(pwd+i)-'A'))-1;

}

}
return pwd;

}



int main()

{

char *pwd;

int key;

pwd=(char*)malloc(sizeof(char));

printf("Input your password:");

gets(pwd);

printf("Input a key:");

scanf("%d",&key);



printf("The Ciphertext is:");

printf("%s\n",Encrypt(pwd,key));

}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
/*替换法:*/



#include <stdio.h>

#include <stdlib.h>

#include <string.h>

void table(char *keyword) /*筛选密钥(去重复去空格)*/

{

int i,j,k;

for(i=0;*(keyword+i)!='\0';i++)

​ {

for(j=i;*(keyword+j)!='\0';j++)

​ {

if(i!=j)

if(*(keyword+i)==*(keyword+j)||*(keyword+j)==' ')

​ {

for(k=j;*(keyword+k)!='\0';k++)

​ *(keyword+k)=*(keyword+k+1);

​ j--;

​ }

​ }

​ }

}



void newTab(char *keyword) /*生成密钥表*/

{

char ch;

int i;

int t;

for(t=0;*(keyword+t)!='\0';t++);



for(ch='a';ch<='z';ch++)

​ {

for(i=0;*(keyword+i)!=ch;i++)

​ {

if(*(keyword+i)=='\0')

​ {

​ *(keyword+t)=ch;

​ t++;

break;

​ }

​ }

​ }

​ *(keyword+t)='\0';

}





char *Ciphertext(char *keyword,char *Plaintext) /*按密码表加密*/

{

char ch;

int i,j;

for(i=0;*(Plaintext+i)!='\0';i++)

​ {

for(ch='a',j=0;ch<='z';ch++,j++)

​ {

if(*(Plaintext+i)==ch)

​ {

​ *(Plaintext+i)=*(keyword+j);

break;

​ }

​ }

​ }

return Plaintext;

}



char *Decrypt(char *keyword,char *Plaintext) /*解密*/

{

char ch;

int i,j;

for(i=0;*(Plaintext+i)!='\0';i++)

​ {

for(ch='a',j=0;*(keyword+j)!='\0';ch++,j++)

​ {

if(*(Plaintext+i)==*(keyword+j))

​ {

​ *(Plaintext+i)=ch;

break;

​ }

​ }

​ }

return Plaintext;

}



int main()

{

char *keyword,*Plaintext,*tmp=NULL;

​ keyword=(char*)malloc(sizeof(char));

​ Plaintext=(char*)malloc(sizeof(char));



printf("Input key word:"); /*输入欲用密钥*/

​ gets(keyword);

printf("Input Plaintext:"); /*输入要转换的明文*/

​ gets(Plaintext);



​ table(keyword); /*去空格去重复*/

​ newTab(keyword); /*生成密码表*/



​ tmp=Ciphertext(keyword,Plaintext); /*对应着密码表生成密文*/

puts(tmp); /*输出密文*/

puts(Decrypt(keyword,tmp)); /*解密输出*/

}

3、运行效果:

凯撒密码

img

1、程序结构化,用函数分别实现

2、对文件的加密,解密输出到文件

img

img

/移位法:/

img

/替换法:/

img

任务二、加密与隐藏软件的使用

\1. 加密文件

2.解密文件

3.生成随机密码

4.生成可自解密文件

5.文件隐藏与恢复

6.伪装文件夹

1.加密文件

img

img

img

2.解密文件

img

img

3.生成随机密码

https://suijimimashengcheng.bmcx.com/

img

4.生成可自解密文件

img

5.文件隐藏与恢复

img

img

img

6.伪装文件夹

img

img

任务三、利用破解密码软件破解口令

1.破解Windows7系统密码

2.破解Office文档密码

3.破解PDF文档密码

2.破解Office文档密码

img

3.破解PDF文档密码

http://app.xunjiepdf.com/pdfaddpwd/

img

解密成功

img

八、实验小结(100字左右)

在本次实验中了解熟悉了各种加密算法,对加密算法有了更加深刻的理解,后学习了加密工具,了解了加密工具的使用,学会了伪装文件、机密文件、机密pdf 体会到信息安全的重要性。在今后做项目中,要多加注意信息的加密,本次实验受益匪浅,期待下一次的实验,在课后我也会都加学习了解加密代码,感谢老师。