信息安全学实验一_第1页
信息安全学实验一_第2页
信息安全学实验一_第3页
信息安全学实验一_第4页
信息安全学实验一_第5页
已阅读5页,还剩16页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、信息安全学实验云南大学软件学院实 验 报 告课程: 信息安全学实验 任课教师: 专业: 学号: 姓名: 成绩: 实验1 古典密码算法一、 实验目的通过编程实现替代密码算法和置换密码算法,加深对古典密码体系的了解,为以后深入学习密码学奠定基础。二、 实验原理古典密码算法曾被广泛应用,大都比较简单。它的主要应用对象是文字信息,利用密码算法实现文字信息的加密和解密。其中替代密码和置换密码是具有代表性的两种古典密码算法。三、 实验环境PC机,C或C+编译环境四、 实验内容和步骤1、 根据实验原理部分对替代密码算法的介绍,同时查找和学习相关知识,自己创建明文信息,并选择一个密钥,编写替代密码算法的实现程

2、序,实现加密和解密操作。对于替换密码,在本实验分别实现了移位密码和维吉尼亚密码,其中维吉尼亚算法中能够对文本文件进行加密和解密操作。移位密码程序流程图:开始2输入密文c输入1或21输入密钥k输入明文m输入密钥kj=0cj=(cj-k-a+26)%26+aj+i=0mi=(mi+k-a)%26+ai+cj=0否否mi=00是是输出明文m输出密文c结束算法设计:实现加密的过程中,先输入明文m,明文以字符串的形式储存在数组中,再输入密钥k,密钥范围为1-25,加密函数encrypt对明文m中的字符进行逐个加密E(m)=(m+k)mod26。解密时先输入需要解密的密文c,密文以字符串的形式储存在数组中

3、,再输入相对应的密钥k,解密函数decrypt对密文c中的字符进行逐个解密D(c)=(c-k)mod26。该算法中时间复杂度为O(n)。测试结果截图: 维吉尼亚密码 程序流程图:开始2输入密文c输入1或21输入密钥k输入明文m输入密钥ki=0l=k的长度i=0j=0l=k的长度ci=(ci-kj-a+26)%26+a,i+,j+j=0mi=(mi+kj-a)%26+a,i+,j+否j<0是否j<l否ci=0是否mi=00是是输出明文m输出密文c结束算法设计:加密过程中,先输入明文m,明文以字符串的形式储存在数组中,再输入密钥k,维吉尼亚密码在移位密码的基础上增大了密钥空间,密钥以字

4、符串的形式储存于数组中,加密函数encrypt按照密钥的字符循环对明文m中的字符进行逐个加密。解密时先输入需要解密的密文c,密文以字符串的形式储存在数组中,再输入相对应的密钥k并储存在数组中,解密函数decrypt对密文c中的字符进行逐个解密。该算法中时间复杂度为O(n)。测试结果截图:对字符串加密:对文本文件加密: 2、 根据实验原理部分对置换密码算法的介绍,同时查找和学习相关知识,自己创建明文信息,并选择一个密钥,编写置换密码算法的实现程序,实现加密和解密操作。 该置换算法可以对文本文件进行加密解密操作。程序流程图:开始2输入密文c输入1或21输入密钥k输入明文m算出明文的行数列数并存入二

5、维数组输入密钥k算出明文的行数列数并存入二维数组算出反向置换函数对二维数组中的密文进行两次列置换算出置换函数将二维数组中的字符串放入一维数组对二维数组中的明文进行两次列置换将二维数组中的字符串放入一维数组输出明文m输出密文c结束算法设计:实现置换密码加密过程,先输入明文m,明文以字符串的形式储存在数组中,再输入密钥k,密钥以字符串的形式储存于数组中,若明文不能被密钥整除,则在明文后随机添加字母使其能够被密钥整除。对密钥字符串进行冒泡排序,根据密钥中字母得出置换函数f,将明文m存入二维数组,可以选择需要进行置换的次数,进行置换得到密文。解密时先输入需要解密的密文c,密文以字符串的形式储存在数组中

6、,再输入相对应的密钥k并储存在数组中,以加密相同的方式进行逆操作得到明文。测试结果截图:对字符串加密:对文本文件加密:明文末尾为加密时随机添加的字母。五、 问题及总结1、 回答问题:试分析两种密码算法的安全性,以及如何改进。答:实验指导书中的替换密码为移位密码,移位密码的安全性较低,产生移位的可能性只有25种,可以通过穷举的方式破译密码。在移位密码的基础上改进的替换密码,将26个字母都由其他的字母代替,一一对应产生密码表,这种替换密码有26!种可能的替换方式,用穷举法无法破译,但是根据语言学各个英文字母出现的频率可以破译。在该实验中实现的第二种替换密码是维吉尼亚密码,安全性有较大的提升,其密钥

7、空间增大,每个字母移位的长度不同,也使字母出现频率趋于平衡,密钥长度越长则密码越安全,破解该密码的要点是知道密钥的长度。破译该实验中置换密码的切入点是明文的长度,可以根据明文的长度猜测密钥长度,密钥长度应为明文长度的约数,再对序列采用穷举即可破译,加强置换密码安全性可对明文多次置换,或想替换加密后置换加密。2、 本次实验的体会总结。1、 通过本次实验,对古典密码的两种基本加密方式有了比较深入的了解。2、 对加密和密码分析有了一定的概念。3、 了解了密码学在信息安全中的重要性。六、 附件移位密码:#include <stdio.h>#include <string.h>v

8、oid enc(char a, int key)/*加密*/int i;for (i = 0; ai != '0' i+)ai = (ai - 'a' + key) % 26 + 'a'void encrypt()char plain100;int enkey;printf("* encrypt *nn");printf("Please input the plaintext: ");getchar();gets_s(plain, 100);printf("Please input the key

9、 use to encrypt the plaintext: ");scanf_s("%d", &enkey);enc(plain, enkey);printf("The ciphertext is : %sn", plain);printf("n*n");void dec(char a, int key)/*解密*/int i;for (i = 0; ai != '0' i+)ai = (ai - 'a' - key + 26) % 26 + 'a'void decr

10、ypt()char cipher100;int dekey;printf("* decrypt *nn");printf("Please input the ciphertext: ");getchar();gets_s(cipher, 100);printf("Please input the key use to decrypt the ciphertext: ");scanf_s("%d", &dekey);dec(cipher, dekey);printf("The plaintext i

11、s : %sn", cipher);printf("n*n");void main()int num;printf("* substitution *nn");printf("*n");while (1)printf("Press 1 or 2 to choose encrypt or decrypt:n1.encryptn2.decryptn");scanf_s("%d", &num);switch (num)case 1:encrypt();break;case 2:dec

12、rypt();break;default:break;维吉尼亚密码:#include <stdio.h>#include <string.h>#include <stdlib.h>void enc(char arr, char k)/*加密*/int len = strlen(k);int key, i, j = 0;for (i = 0; arri != '0' i+)if (arri != ' ')if (j > len - 1)j = 0;key = kj - 'a'arri = (arri + k

13、ey - 'a') % 26 + 'a'j+;void encrypt()char plain100, enkey20, ch;printf("* encrypt *nn");loop:printf("Choose f to encrypt a file or s to encrypt a string:");getchar();ch = getchar();if (ch = 'f')/*文件加密*/FILE *fp;char filename20;input:printf("Please inp

14、ut the file u wannna encrypt: ");getchar();gets_s(filename, 20);errno_t err;if (err = fopen_s(&fp, filename, "r+") != 0)printf("Cannot open the file!n");goto input;fgets(plain, 100, fp);printf("Please input the key use to encrypt the file: ");gets_s(enkey, 20);

15、enc(plain, enkey);rewind(fp);fputs(plain, fp);fclose(fp);printf("nThe encryption has done,please check the file!n");else if (ch = 's')/*字符串加密*/printf("Please input the plaintext: ");getchar();gets_s(plain, 100);printf("Please input the key use to encrypt the plaintex

16、t: ");gets_s(enkey, 20);enc(plain, enkey);printf("nThe ciphertext is : %sn", plain);elsegoto loop;printf("n*n");void dec(char arr, char k)/*解密*/int len = strlen(k);int key, i, j = 0;for (i = 0; arri != '0' i+)if (arri != ' ')if (j > len - 1)j = 0;key = kj

17、- 'a'arri = (arri - key - 'a' + 26) % 26 + 'a'j+;void decrypt()char cipher100, dekey20, ch;printf("* decrypt *nn");loop:printf("Choose f to decrypt a file or s to decrypt a string:");getchar();ch = getchar();if (ch = 'f')/*文件解密*/FILE *fp;char filen

18、ame20;input:printf("Please input the file u wannna decrypt: ");getchar();gets_s(filename, 20);errno_t err;if (err = fopen_s(&fp, filename, "r+") != 0)printf("Cannot open the file!n");goto input;fgets(cipher, 100, fp);printf("Please input the key use to encrypt

19、the file: ");gets_s(dekey, 20);dec(cipher, dekey);rewind(fp);fputs(cipher, fp);fclose(fp);printf("nThe decryption has done,please check the file!n");else if (ch = 's')/*字符串解密*/printf("Please input the ciphertext: ");getchar();gets_s(cipher, 100);printf("Please i

20、nput the key use to decrypt the ciphertext: ");gets_s(dekey, 20);dec(cipher, dekey);printf("nThe plaintext is : %sn", cipher);elsegoto loop;printf("n*n");void main()int num;printf("* vigenere *nn");printf("*n");while (1)printf("Press 1 or 2 to choose

21、 encrypt or decrypt:n1.encryptn2.decryptn");scanf_s("%d", &num);switch(num)case 1:encrypt();break;case 2:decrypt();break;default:exit(0);break;置换密码:#include <stdio.h>#include <string.h>#include <stdlib.h>#include <time.h>void swap(char key, int i, int j)int

22、 t = keyi;keyi = keyj;keyj = t;void bubble(char key, int col)/*冒泡排序*/int i, j;for (i = 0; i < col; i+)for (j = col - 1; j > i; j-)if (keyi > keyj)swap(key, i, j);void match(char key, char k, int f, int col)/*计算置换函数*/int i, j;for (i = 0; i < col; i+)for (j = 0; j < col; j+)if (keyi = k

23、j)fi = j;void trans(char mid20, char a20, int f, int row, int col)/*列置换*/int i, j;for (i = 0; i < row; i+)for (j = 0; j < col; j+)midij = aifj;a = mid;void enc(char arr, char key)/*加密*/char a2020, mid2020, enk20;int i, j, cnt, m = 0, n = 0, k = 0, f20;int col = strlen(key);int len = strlen(arr

24、);if (len % col != 0)k = col - (len % col);srand(unsigned)time(0);j = len;for (i = 0; i < k; i+)arrj = (rand() % 26) + 'a'j+;arrj = '0'int row = (len + k) / col;for (i = 0; i < col; i+)enki = keyi;for (i = 0; i < row; i+)for (j = 0; j < col; j+)aij = arrm;m+;bubble(key, c

25、ol);match(key, enk, f, col);printf("Please input the count of exchange u wanna make: ");scanf_s("%d", &cnt, 1);for (i = 0; i < cnt; i+)trans(mid, a, f, row, col);for (j = 0; j < col; j+)for (i = 0; i < row; i+)arrn = aij;n+;void encrypt()char plain100, enkey20, ch;pr

26、intf("* encrypt *nn");loop:printf("Choose f to decrypt a file or s to decrypt a string:");getchar();ch = getchar();if (ch = 'f')/*文件加密*/FILE *fp;char filename20;input:printf("Please input the file u wanna decrypt: ");getchar();gets_s(filename, 20);errno_t err;if

27、 (err = fopen_s(&fp, filename, "r+") != 0)printf("Cannot open the file!");goto input;fgets(plain, 100, fp);printf("Please input the key use to encrypt the file: ");gets_s(enkey, 20);enc(plain, enkey);rewind(fp);fputs(plain, fp);fclose(fp);printf("nThe decryptio

28、n has done,please check the file!n");else if (ch = 's')/*字符串加密*/printf("Please input the plaintext: ");getchar();gets_s(plain, 100);printf("Please input the key use to decrypt the ciphertext: ");gets_s(enkey, 20);enc(plain, enkey);printf("nThe plaintext is : %sn

29、", plain);elsegoto loop;printf("n*n");void dec(char arr, char key)/*解密*/char a2020, mid2020, dek20;int i, j, cnt, m = 0, n = 0, f20;int col = strlen(key);int row = strlen(arr) / col;for (i = 0; i < col; i+)deki = keyi;for (j = 0; j < col; j+)for ( i = 0; i < row; i+)aij = arr

30、m;m+;bubble(key, col);match(dek, key, f, col);printf("Please input the count of exchange u wanna make: ");scanf_s("%d", &cnt, 1);for (i = 0; i < cnt; i+)trans(mid, a, f, row, col);for (i = 0; i < row; i+)for (j = 0; j < col; j+)arrn = aij;n+;void decrypt()char cipher100, dekey20, ch;printf("* decrypt *nn");loop:printf("Choose f to decrypt a file or s to decrypt a string:");getchar();ch = getchar();if (ch = 'f')/*文件解密*/FILE *fp;char filename20;input:printf("Please input the

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论