古典密码实验报告
- 格式:doc
- 大小:268.00 KB
- 文档页数:25
古典加密实验报告古典密码算法一、实验目的学习常见的古典密码学算法,通过编程实现替代密码算法和置换密码算法,加深对古典密码体制的了解,为深入学习密码学奠定基础。
二、实验要求分析替代密码算法和置换密码算法的功能需求,详细设计实现替代密码算法和置换密码算法的数据结构和流程,给出测试用例和测试步骤,得出测试和结论。
替代密码算法和置换密码算法的实现程序必须提供加密和解密两个接口:int encrypt()和int decrypt()。
当加密或者解密成功时返回CRYPT_OK,失败时返回CRYPT_ERROR。
三、实验原理古典密码算法曾被广泛应用,大都比较简单,使用手工和机械操作来实现加密和解密。
它的主要应用对象是文字信息,利用密码算法实现文字信息的加密和解密。
下面介绍两种算法:替代密码和置换密码。
1.替代密码的原理是使用替代法进行加密,就是将明文由其它的字母、数字或符合所代替后形成密文。
这里每个明文字母对应的密文字母可能是一个,也可能是多个。
接收者对密文进行逆向替换即可得到明文。
2.置换密码算法的原理是不改变明文字符,而是按照某一规则重新排列消息中的比特或字符顺序,才而实现明文信息的加密。
置换密码有时又称为换位密码。
我实验过程中替代密码是单表替换,用字母的下一个字母代替:for(j = 0; j < i; j++){if(96 < Mingwen[j]&&Mingwen[j] < 123){Miwen[j] = 'a' + (Mingwen[j] - 'a' + 1) % 26;}else{Miwen[j] = 'A' + (Mingwen[j] - 'A' + 1) % 26;}}置换加密主要是对密钥进行整理,还有就是动态分配二维数组,将明文和密文填充置的过程,换密码关键代码如下:for(a = 0; a < k; a++){for(b = 0; b < hang; b++){Miwen[i] = p[b][ord[j]];i++;}j++;}for(a = 0; a < 26; a++){for(b = 0; b < k; b++){if(key1[b] == alphatable[a]){ord[b] = ind++;}}}具体加密见下图:详细加密代码见附件。
实验一古典密码—单表代换【实验目的】理解代换密码的基本思想理解移位密码、仿射密码等算法的原理掌握上述各个算法的输入输出格式和密钥格式掌握上述各个算法的加解密过程和实现方法【实验原理】代换密码体制的一般定义为M=C=K=Z26,其中M为明文空间、C为密文空间、K为密钥空间、Z26为26个整数(对应26个英文字母)组成的空间;要求26个字母与模26的剩余类集合{0,1,2,…,25}建立一一对应的关系。
一、移位密码移位密码的加密实现上就是将26个英文字母向后循环移动k位,其加解密可分别表示为:c=E k(m)=m+k(mod 26)m=D k(c)=c-k(mod 26)其中,m、c、k是满足0≤m,c,k≤25的整数。
二、乘法密码乘法密码是通过对字母等间隔抽取以获得密文,其加解密可分别表示如下:-1c=mk(mod 26)m=ck(mod26)其中,m、c、k是满足0≤m,c,k≤25,且gcd(k,26)=1的整数。
三、仿射密码仿射密码的加密是一个线性变换,将移位密码和乘法密码相结合,其加解密可分别表示为:C=E a,b(m)=am+b(mod 26)M=D a,b(C)=a-1(c-b)(mod 26)其中:a、b是密钥,是满足0≤a,b≤25和gcd(a,26)=1的整数,即a和26互素;a-1的逆元,即a•a-1≡1 mod 2【实验环境】ISES客户端Microsoft CLR Debugger 2005或其它调试器【实验内容】通过运算器工具实现移位密码、乘法密码、仿射密码对各个算法的加解密进行扩展实验和算法跟踪【实验步骤】此处以移位密码为例说明,乘法密码、仿射密码可参照完成。
一、加解密计算(一) 加密(1) 参照实验原理,在明文栏输入所要加密的明文,在密钥栏输入相应的密钥,如下图1.1-2所示。
图 1.1-2(2) 点击“加密”按钮,在密文文本框内就会出现加密后的密文,如图1.1-3所示。
实验1-古典密码算法一、实验目的通过编程实现替代密码算法和置换密码算法,加深对古典密码体系的了解,为以后深入学习密码学奠定基础。
二、实验原理古典密码算法曾被广泛应用,大都比较简单。
它的主要应用对象是文字信息,利用密码算法实现文字信息的加密和解密。
其中替代密码和置换密码是具有代表性的两种古典密码算法。
1、替代密码替代密码算法的原理是使用替代法进行加密,就是将明文中的字符用其他字符替代后形成密文。
例如,明文字母a、b、c、d,用D、E、F、G做对应替换后形成密文。
最早的替代密码是由Julius Caesar 发明的Caesar (恺撒)密码,又叫循环移位密码。
它的加密过程可以表示为下面的函数:E(m) = (m+k ) mod n其中,m为明文字母在字母表中的位置数;n为字母表中的字母个数;k为密钥;E(m)为密文字母在字母表中对应的位置数。
例如,对于明文字母H,其在字母表中的位置数为8,设k=4,则按照上式计算出来的密文为L,计算过程如下:E(8) = (m+k ) mod n = (8+4 ) mod 26 = 12 = L 解密算法是:m = D(L) =(L-k)mod 262、置换密码置换密码算法的原理是不改变明文字符,只将字符在明文中的排列顺序改变,从而实现明文信息的加密。
置换密码又称为换位密码。
矩阵换位法是实现置换密码的一种常用方法。
它将明文中的字母按照给定的顺序安排在一个矩阵中,然后又根据密钥提供的顺序重新组合矩阵中的字母,从而形成密文。
例如,明文为 attack begins at five ,密钥为 cipher ,将明文按照每行6个字母的形式排在矩阵中,形成如下形式:a t t a c kb e g i n sa t f i v e根据密钥 cipher 中各字母在字母表中出现的先后顺序,得到给定的一个置换:f = 1 4 5 3 2 6因此有:密钥: 1 4 5 3 2 6明文: a t t a c kb e g i n sa t f i v e根据上面的置换,将原有矩阵中的字母按照第1列、第4列、第5列、第3列、第2列、第6列的顺序排列、则有下面的形式:a a c t t kb i n g e sa i v f t e从而得到密文:abatgftetcnvaiikse其解密过程是根据密钥的字母数作为列数,将密文按照列、行的顺序写出,再根据由密钥给出的矩阵置换产生新的矩阵,从而恢复明文。
《—现代密码学—》实验指导书适用专业:计算机科学与技术江苏科技大学计算机科学学院2011年11 月实验一古典密码实验学时:2学时实验类型:验证实验要求:必修一、实验目的编程实现古典密码的加解密方法。
二、实验内容(1)移位密码的加密和解密函数。
(2)仿射密码的加密和解密函数。
(3)维吉尼亚密码的加密和解密函数。
三、实验原理、方法和手段(1)移位密码对于明文字符x ,加密密钥k ,加密方法为,1,2,,25y x k k =+= 解密方法为,1,2,,25x y k k =-= (2)仿射密码对于明文字符x ,加密密钥(,)a b ,加密方法为,gcd(,26)1,1,2,,25y ax b a b =+==解密方法为1()x a y b -=-(3)维吉尼亚密码选取密钥字Key ,将明文按照密钥字长度分组,将明文与密钥字对应字符相加并对26求余,即为密文字符。
i i i y x k =+解密过程为i i i x y k =-四、实验组织运行要求本实验采用集中授课形式,每个同学独立完成上述实验要求。
五、实验条件每人一台计算机独立完成实验,有如下条件:(1)硬件:微机;(2)软件:VC++6.0、VC++.Net 2005。
六、实验步骤(1)将各函数编写完成;(2)在主函数中调用各函数,实现加密和解密。
七、实验报告实验报告主要包括实验目的、实验内容、实验原理、源程序及结果。
移位密码加密:#include<stdio.h>#define n 3 //移位位数void change(char string[]){int i;for(i=0;string[i]!='\0';i++){if(string[i]>='a'&&string[i]<='z')string[i]=(string[i]+n>='z'?string[i]+n-26:string[i]+n); }}void main(){char str[100];printf("请输入一段明文");gets(str);change(str);printf("密文为:\n");puts(str);}移位密码解密:#include<stdio.h>#define n 3 //移位位数void change(char string[]){int i;for(i=0;string[i]!='\0';i++){if(string[i]>='a'&&string[i]<='z')string[i]=(string[i]+n<'a'?string[i]-n+26:string[i]-n); }}void main(){char str[100];printf("请输入一段密文");gets(str);change(str);printf("明文为:\n");puts(str);}仿射密码加密:#include<stdio.h>void fun( char a[],int x,int y) {int i;for(i=0;a[i]!='\0';i++){a[i]=(x*(a[i]-97)+y)%26+97;}}main(){char string[100];int x,y;printf("输入");gets(string);printf("请输入密钥");scanf("%d,%d",&x,&y);printf("明文:%s\n",string);fun(string,x,y);printf("密文为:%s\n",string); }仿射密码解密:#include<stdio.h>void fun( char a[],int x,int y) {int i;for(i=0;a[i]!='\0';i++){a[i]=(x*(a[i]-97)+y)%26+97;}}main(){char string[100];int x,y;printf("输入");gets(string);printf("请输入密钥");scanf("%d,%d",&x,&y);printf("密文:%s\n",string);fun(string,x,y);printf("明文:%s\n",string);}密码加密:#include<stdio.h>void change(char old[],char new1[][5]){ int i,j,t;char temp[20][5];t=strlen(old);for(i=t;i<(5-t%5)+t;i++) //将一维数组old每5个分成一组不足5位的用X 补充old[i]='x';for(i=t+(5-t%5);i<100;i++)old[i]='\0';for(i=0;i<20;i++) //将一维数组old转换成一个20*5的二维数组tempfor(j=0;j<5;j++)temp[i][j]=old[5*i+j];for(i=0;i<20;i++) //密文字母交换顺序{new1[i][0]=temp[i][1];new1[i][1]=temp[i][4];new1[i][2]=temp[i][3];new1[i][3]=temp[i][0];new1[i][4]=temp[i][2];}}main(){char old[100],new1[20][5];gets(old);change(old,new1);printf("%s",new1);}密码解密#include<stdio.h>void change(char old[],char new1[][5]){ int i,j,t;char temp[20][5];t=strlen(old);for(i=0;i<20;i++) //将一维数组old转换成一个20*5的二维数组tempfor(j=0;j<5;j++)temp[i][j]=old[5*i+j];for(i=0;i<20;i++) //密文字母交换顺序{new1[i][1]=temp[i][0];new1[i][4]=temp[i][1];new1[i][3]=temp[i][2];new1[i][0]=temp[i][3];new1[i][2]=temp[i][4];}}main(){char old[100],new1[20][5];gets(old);change(old,new1);printf("%s",new1);}实验二序列密码实验学时:2学时实验类型:验证实验要求:必修一、实验目的编程实现序列密码RC4的加密方法。
一、实验目的1. 了解经典密码学的基本原理和算法;2. 掌握古典密码的加密和解密方法;3. 通过编程实现古典密码的加密和解密过程;4. 体验古典密码的破解过程,加深对密码学原理的理解。
二、实验环境1. 操作系统:Windows 102. 编程语言:Python3.73. 开发工具:PyCharm三、实验内容本次实验主要涉及以下几种古典密码:1. 仿射密码2. 单表代替密码3. 维吉尼亚密码4. 移位密码1. 仿射密码(1)原理简介:仿射密码是一种单字母替换密码,加密公式为:Ci = (a pi + b) mod 26,其中,Ci 为密文,pi 为明文,a 和 b 为密钥。
(2)加密和解密代码实现:```pythondef encrypt(plain_text, a, b):cipher_text = ''for char in plain_text:if char.isalpha():cipher_text += chr(((ord(char.upper()) - ord('A') + a b) % 26) + ord('A'))else:cipher_text += charreturn cipher_textdef decrypt(cipher_text, a, b):plain_text = ''for char in cipher_text:if char.isalpha():plain_text += chr(((ord(char.upper()) - ord('A') - a b) % 26) + ord('A'))else:plain_text += charreturn plain_text```2. 单表代替密码(1)原理简介:单表代替密码是一种将明文中的每个字符映射到密文的密码,加密和解密过程是相反的。
密码学实验报告信息安全实验报告学号:学生姓名:班级:实验三密码学实验一、古典密码算法实验一、实验目的通过编程实现替代密码算法和置换密码算法,加深对古典密码体制的了解,为深入学习密码学奠定基础。
二、编译环境运行windows 或linux 操作系统的PC 机,具有gcc、VC 等C语言编译环境。
三、实验原理古典密码算法历史上曾被广泛应用,大都比较简单,使用手工和机械操作来实现加密和解密。
它的主要应用对象是文字信息,利用密码算法实现文字信息的加密和解密。
下面介绍两种常见的具有代表性的古典密码算法,以帮助读者对密码算法建立一个初步的印象。
1.替代密码替代密码算法的原理是使用替代法进行加密,就是将明文中的字符用其它字符替代后形成密文。
例如:明文字母a、b、c、d ,用D、E、F、G做对应替换后形成密文。
替代密码包括多种类型,如单表替代密码、多明码替代密码、多字母替代密码、多表替代密码等。
下面我们介绍一种典型的单表替代密码,恺撒密码,又叫循环移位密码。
它的加密方法,就是将明文中的每个字母用此字符在字母表中后面第k个字母替代。
它的加密过程可以表示为下面的函数:E= mod n其中:m 为明文字母在字母表中的位置数;n 为字母表中的字母个数;k 为密钥;E为密文字母在字母表中对应的位置数。
例如,对于明文字母H,其在字母表中的位置数为8,设k=4,则按照上式计算出来的密文为L:E = mod n = mod 26 = 12 = L2.置换密码置换密码算法的原理是不改变明文字符,只将字符在明文中的排列顺序改变,从而实现明文信息的加密。
置换密码有时又称为换位密码。
矩阵换位法是实现置换密码的一种常用方法。
它将明文中的字母按照给的顺序安排在一个矩阵中,然后用根据密钥提供的顺序重新组合矩阵中字母,从而形成密文。
例如,明文为attack begins at five,密钥为cipher,将明文按照每行6 列的形式排在矩阵中,形成如下形式: a ttack b e gins a tfive根据密钥cipher中各字母在字母表中出现的先后顺序,给定一个置换: 1 2 3 4 5 6 f =1 4 5 32 6根据上面的置换,将原有矩阵中的字母按照第 1 列,第 4 列,第5 列,第 3 列,第2列,第 6 列的顺序排列,则有下面形式: a a c t tk b i n g e s a I v f te从而得到密文:abatgftetcnvaiikse其解密的过程是根据密钥的字母数作为列数,将密文按照列、行的顺序写出,再根据由密钥给出的矩阵置换产生新的矩阵,从而恢复明文。
实验一古典密码(认识密码学)一、实验目的通过实现简单的古典密码算法,理解密码学的相关概念如明文(plaintext )、密文(ciphertext )、加密密钥(encryption key)、解密密钥(decryption key )、加密算法(encryption algorithm)、解密算法(decryption algorithm)等。
二、实验内容1.用C\C++语言实现仿射变换(Affine )加/解密算法;2.用C\C++语言实现统计26个英文字母出现的频率的程序;3.利用仿射变换加/解密程序对一段较长的英文文章进行加密,再利用统计软件对明文和密文中字母出现的频率进行统计并作对比,观察有什么规律。
放射变换:加密:()26mod ,b am m E c b a +== 解密:()()26mod 1,b c ac D m b a -==-其中a, b 为密钥,25,0≤≤b a ,且gcd(a, 26)=1三、实验要求加/解密程序对任意满足条件的a 、b 都能够处理。
四、实验步骤(1)统计26个英文字母出现的频率(源程序见附录)运行结果:(1)仿射变换加/解密程序对一段较长的英文文章进行加密运行结果:明文:密文:解密:实验二流密码(认识LFSR及流密码)一、实验目的通过实现简单的线性反馈移位寄存器(LFSR),理解LFSR的工作原理、本原多项式重要意义。
二、实验内容(1)利用C\C++语言实现LFSR(其中LFSR已给定);(2)通过不同初始状态生成相应的序列,并观察他们的周期有什么特点;(3)利用生成的序列对文本进行加/解密(按对应位作模2加运算)。
其中的LFSR为:三、实验结果及分析运行结果:明文:密文:解密:流密码(生成非线性序列)一、实验目的以LFSR序列为基础,生成非线性序列,并利用该序列对文件进行加密、解密。
二、实验内容1)利用C\C++实现Geffe序列生成器及J-K触发器;2)利用生成的非线性序列对文件进行加密、解密(按对应位作模2加运算)。
信息安全实验报告课程名称: _ 专业:计算机科学与技术 _2010_级_02班实验编号:实验项目_ 指导教师_ _姓名:闫斌学号: 2010012854 实验成绩:___实验一古典密码算法实验名称:古典密码算法实验类型: 设计性实验学时:4适用对象: 信息安全1.实验原理古典密码算法历史上曾被广泛应用,大都比较简单,使用手工和机械操作来实现加密和解密。
它的主要应用对象是文字信息,利用密码算法实现文字信息的加密和解密。
下面介绍两种常见的具有代表性的古典密码算法,以帮助读者对密码算法建立一个初步的印象。
2.实验目的通过变成实现替代密码算法和置换密码算法,加深对古典密码体质的了解,为深入学习密码学奠定基础。
3.实验环境运行windows或linux操作系统的pc机,具有gcc(linux)、VC(Windows)等C语言编译环境。
4.实验内容4.1替代密码算法4.1.1根据实验远离部分对替代密码算法的介绍,创建明文信息,并选择一个密钥k,编写替代密码算法的实现程序,实现加密和解密操作。
替代密码包括多种类型,如单表替代密码、多明码替代密码、多字母替代密码、多表替代密码等。
4.1.2替代密码算法的远离是使用替代法进行加密,就是将明文的字符用其他字符替代后形成密文。
例如字母a、b、c、d,用D、E、F、G做对应替换后形成密文。
4.1.3 代码#include<stdio.h>#include<math.h>#include<string.h>#define N 500int main(){/*--------------------------------*/int i=0,k,m,n,l;char str1[N],str2[N]; /*C=M+K...K is key...*/clrscr();/*--------------------------------*/printf("This is a code password program......\n");printf("Please input proclaimed in writing(M)::\n");gets(str1);/*输入要加密的明文M*/printf("Please input the key(K)(int)::\n");scanf("%d",&k);/*输入密钥K*/m=strlen(str1);/*测试明文的长度*/printf("The M length is %d\n",m);printf("\n *\n *\n *\n***\n *\n");printf("ciphertext(C) is ::\n\n");for(i=0;i<m;i++)/*加密的过程*/{n=(int)str1[i];/*将字符转换成ASCII*/if(str1[i]==' ')/*如果字符串中出现空格返回空格*/{printf(" ");str2[i]=str1[i];}else if(n>96&&n<123)/*对小写进行加密*/{n=(n-97+k)%26;if(n<0)n=26+n;l=(char)(n+97);printf("%c",l);str2[i]=l;}else if(n>64&&n<91)/*对大写进行加密*/{n=(n-65+k)%26;if(n<0)n=26+n;l=(char)(n+97);printf("%c",l);str2[i]=l;}}str2[i]='\0';/*--------------------------------*/printf("\n\nThe C length is %d",strlen(str2));printf("\n\n *\n *\n *\n***\n *\n");printf("When the ciphertext is '%s',\nThe password program is...::\n\n",str2);m=strlen(str2);for(i=0;i<m;i++)/*解密过程*/{n=(int)str2[i];/*将字符转换成ASCII*/if(str2[i]==' ')/*如果是空格,返回的也是空格*/{printf(" ");}else if(n>96&&n<123)/*对小写进行解密*/{n=(n-97-k)%26;if(n<0)n=26+n;l=(char)(n+97);printf("%c",l);}else if(n>64&&n<91)/*对大写进行解密*/{n=(n-65-k)%26;if(n<0)n=26+n;l=(char)(n+97);printf("%c",l);}}str1[i]='\0';getch();return 0;}4.1.4 运行结果4.2 置换密码4.2.1根据实验原理部分对置换密码算法的介绍,自己创建明文信息,并选择一个密钥,编写置换密码算法的实现程序,实现加密和解密操作。
应用密码学实验一古典密码一、实验目的学习常见的古典密码学算法,通过编程实现替代密码算法和置换密码算法,加深对古典密码体制的了解,为深入学习密码学奠定基础。
二、实验要求分析替代密码算法和置换密码算法的功能需求,详细设计实现替代密码算法和置换密码算法的数据结构和流程,给出测试用例和测试步骤,得出测试和结论。
三、实验原理古典密码算法曾被广泛应用,大都比较简单,使用手工和机械操作来实现加密和解密。
它的主要应用对象是文字信息,利用密码算法实现文字信息的加密和解密。
下面介绍两种常见的具有代表性的古典密码算法,以帮助读者对密码算法建立一个初步的印象。
1.替代密码替代密码的原理是使用替代法进行加密,就是将明文由其它的字母、数字或符合所代替后形成密文。
这里每个明文字母对应的密文字母可能是一个,也可能是多个。
接收者对密文进行逆向替换即可得到明文。
替代密码有五种表现形式:○1单表代替即简单替代密码或者称为单字母代替,明文字母表中的一个字符对应密文字母表中的一个字符。
这是所有加密中最简单的方法。
○2多表代替即由多个简单代替组成,也就是使用了两个或两个以上的代替表。
比如使用有5个简单代替表的代替密码,明文的第一个字母用第一个代替表,第二个字母用第二个表,第三个字母用第三个表,以此类推,循环使用这五张代替表。
多表代替密码由莱昂.巴蒂斯塔于1568年发明,著名的维吉尼亚密码和博福特密码均是多表代替密码。
关于单表替代密码——凯撒(Caesar)密码,又叫循环移位密码。
它的加密方法就是将明文中的每个字母用字母表中该字母后的第R个字母来替换,达到加密的目的。
它的加密过程可以表示为下面的函数:=+E m m k n()()modE m为其中,m为明文字母在字母表中的位置数;n为字母表中的字母个数;k为密钥;()密文字母在字母表中对应的位置数。
k=,则按照上式计算出来的密例如:对于明文字母H,其在字母表中的位置数为8,设4文为L,计算过程如下:=+=+==(8)()mod(84)mod2612E m k n L2.置换密码置换密码算法的原理是不改变明文字符,而是按照某一规则重新排列消息中的比特或字符顺序,才而实现明文信息的加密。
表密码算法c语⾔实验报告,⼤学密码学实验报告(含代码)试验1古典密码算法.doc...西华⼤学计算机系上机实践报告课程:级::名称:上机实践⽇期:2009-11-10上机实践编号:组:⽬的内容与根据对置换密码算法的介绍,⾃⼰创建明⽂信息,并选择⼀个密钥,编写替代密码算法的实现程序,实现加密和解密操作。
根据上述密码算法最后的实现程序提供加密和解密两个接⼝:int encrypt( ) 和int decrypt(). 当加密和解密成功时返回CRYPT_OK, 失败时返回CRYPT_ERROR.。
三、⽤环境Windows 或Linux 操作系统的PC机,具有GCC(Linux)、VC(Windows) 等C语⾔编译环境。
四#include "mycrypt.h"#ifdef YARROWconst struct _prng_descriptor yarrow_desc ={"yarrow",&yarrow_start,&yarrow_add_entropy,&yarrow_ready,&yarrow_read};int yarrow_start(prng_state *prng){int err;_ARGCHK(prng != NULL);/* these are the default hash/cipher combo used */#ifdef RIJNDAEL#if YARROW_AES==0prng->yarrow.cipher = register_cipher(&rijndael_enc_desc);#elif YARROW_AES==1prng->yarrow.cipher = register_cipher(&aes_enc_desc);#elif YARROW_AES==2prng->yarrow.cipher = register_cipher(&rijndael_desc);#elif YARROW_AES==3prng->yarrow.cipher = register_cipher(&aes_desc);#endif#elif defined(BLOWFISH)prng->yarrow.cipher = register_cipher(&blowfish_desc);#elif defined(TWOFISH)prng->yarrow.cipher = register_cipher(&twofish_desc);#elif defined(RC6)prng->yarrow.cipher = register_cipher(&rc6_desc);#elif defined(RC5)prng->yarrow.cipher = register_cipher(&rc5_desc);#elif defined(SAFERP)prng->yarrow.cipher = register_cipher(&saferp_desc);#elif defined(RC2)prng->yarrow.cipher = register_cipher(&rc2_desc);#elif defined(NOEKEON)prng->yarrow.cipher = register_cipher(&noekeon_desc);#elif defined(CAST5)prng->yarrow.cipher = register_cipher(&cast5_desc);#elif defined(XTEA)prng->yarrow.cipher = register_cipher(&xtea_desc);#elif defined(SAFER)prng->yarrow.cipher = register_cipher(&safer_sk128_desc);#elif defined(DES)prng->yarrow.cipher = register_cipher(&des3_desc);#elif#error YARROW needs at least one CIPHER#endifif ((err = cipher_is_valid(prng->yarrow.cipher)) != CRYPT_OK) { return err;}#ifdef SHA256prng->yarrow.hash = register_hash(&sha256_desc);#elif defined(。
云南大学软件学院实验报告姓名:张儒雅学号:20111120075专业:信息安全教师:金鑫一、实验目的通过编程实现替代密码算法和置换密码算法,加深对古典密码体系的了解,为以后深入学习密码学奠定基础。
二、实验原理古典密码算法曾被广泛应用,大都比较简单。
它的主要应用对象是文字信息,利用密码算法实现文字信息的加密和解密。
其中替代密码和置换密码是具有代表性的两种古典密码算法。
1、替代密码替代密码算法的原理是使用替代法进行加密,就是将明文中的字符用其他字符替代后形成密文。
例如,明文字母a、b、c、d,用D、E、F、G做对应替换后形成密文。
最早的替代密码是由Julius Caesar 发明的Caesar (恺撒)密码,又叫循环移位密码。
它的加密过程可以表示为下面的函数:E(m) = (m+k ) mod n其中,m为明文字母在字母表中的位置数;n为字母表中的字母个数;k为密钥;E(m)为密文字母在字母表中对应的位置数。
例如,对于明文字母H,其在字母表中的位置数为8,设k=4,则按照上式计算出来的密文为L,计算过程如下:E(8) = (m+k ) mod n = (8+4 ) mod 26 = 12 = L 解密算法是:m = D(L) =(L-k)mod 262、置换密码置换密码算法的原理是不改变明文字符,只将字符在明文中的排列顺序改变,从而实现明文信息的加密。
置换密码又称为换位密码。
矩阵换位法是实现置换密码的一种常用方法。
它将明文中的字母按照给定的顺序安排在一个矩阵中,然后又根据密钥提供的顺序重新组合矩阵中的字母,从而形成密文。
例如,明文为 attack begins at five ,密钥为 cipher ,将明文按照每行6个字母的形式排在矩阵中,形成如下形式:a t t a c kb e g i n sa t f i v e根据密钥 cipher 中各字母在字母表中出现的先后顺序,得到给定的一个置换:f = 14 5 3 2 6因此有:密钥: 1 4 5 3 2 6明文: a t t a c kb e g i n sa t f i v e根据上面的置换,将原有矩阵中的字母按照第1列、第4列、第5列、第3列、第2列、第6列的顺序排列、则有下面的形式:a a c t t kb i n g e sa i v f t e从而得到密文:abatgftetcnvaiikse其解密过程是根据密钥的字母数作为列数,将密文按照列、行的顺序写出,再根据由密钥给出的矩阵置换产生新的矩阵,从而恢复明文。
一、实验目的本次实验旨在让学生了解密码分析学的基本原理和方法,掌握密码分析的基本步骤,并能够运用所学知识对简单的加密算法进行破解。
通过实验,提高学生对密码分析学的认识和实际操作能力。
二、实验内容1. 实验背景密码分析学是研究密码的编制和破译的学科,其主要任务是分析密码系统的安全性,找出其弱点,从而提高密码系统的安全性。
本次实验将针对古典密码和现代密码进行分析。
2. 实验步骤(1)古典密码分析①移位密码分析:选取一组明文和密钥,通过编写程序实现移位密码的加密和解密操作,观察并分析加密结果。
②维吉尼亚密码分析:选取一组明文和密钥,通过编写程序实现维吉尼亚密码的加密和解密操作,观察并分析加密结果。
③周期置换密码分析:选取一组明文和密钥,通过编写程序实现周期置换密码的加密和解密操作,观察并分析加密结果。
(2)现代密码分析①公钥密码分析:选取一组公钥和私钥,通过编写程序实现公钥密码的加密和解密操作,观察并分析加密结果。
②对称密码分析:选取一组密钥,通过编写程序实现对称密码的加密和解密操作,观察并分析加密结果。
3. 实验结果与分析(1)古典密码分析结果①移位密码:通过编写程序,我们可以观察到当密钥正确时,加密后的密文与明文之间的差异较大;当密钥错误时,加密后的密文与明文之间的差异较小。
②维吉尼亚密码:通过编写程序,我们可以观察到当密钥正确时,加密后的密文与明文之间的差异较大;当密钥错误时,加密后的密文与明文之间的差异较小。
③周期置换密码:通过编写程序,我们可以观察到当密钥正确时,加密后的密文与明文之间的差异较大;当密钥错误时,加密后的密文与明文之间的差异较小。
(2)现代密码分析结果①公钥密码:通过编写程序,我们可以观察到当公钥和私钥正确时,加密后的密文与明文之间的差异较大;当公钥和私钥错误时,加密后的密文与明文之间的差异较小。
②对称密码:通过编写程序,我们可以观察到当密钥正确时,加密后的密文与明文之间的差异较大;当密钥错误时,加密后的密文与明文之间的差异较小。
课程名称密码编码学实验实验名称古典密码算法实验目的及内容: 熟悉古典密码算法: 凯撒密码算法和维吉尼亚密码算法的编程实现, 加强对密码学的理解。
实验源代码:(1)凯撒密码算法#include<stdio.h>#include<stdlib.h>char *jiami(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 *jiemi(char *cpt,int key) //解密{for(int i=0;*(cpt+i)!='\0';i++){if(*(cpt+i)-'a'&&*(cpt+i)<='z'){if(*(cpt+i)-'a'>=key%26)*(cpt+i)=*(cpt+i)-key%26;else *(cpt+i)='z'-(key%26-(*(cpt+i)-'a'))+1;}else if(*(cpt+i)>='A'&&*(cpt+i)<='Z'){if(*(cpt+i)-'A'>=key%26)*(cpt+i)=*(cpt+i)-key%26;else *(cpt+i)='Z'-(key%26-(*(cpt+i)-'A'))+1;}}return cpt;}void main(){char *pwd;int key;char *cpt;pwd=(char*)malloc(sizeof(char));cpt=(char*)malloc(sizeof(char));printf("Input your password:");gets(pwd);printf("Input a key:");scanf("%d",&key);printf("The Cipertext is:");cpt=jiami(pwd,key);printf("%s\n",cpt);printf("The password is:");printf("%s\n",jiemi(cpt,key));}实验运行结果:维吉尼亚密码算法:#include <stdio.h>#include <iostream>#include <string>using namespace std;void encrypt(char *m, char *k, char *c) //加密算法{int i = 0,j=0;while(m[i] != '\0'){if(m[i] >= 'a' && m[i] <= 'z'){c[i] = (m[i] - 'a' + k[i%4] - 'a') % 26 + 'a';i++;}/*else{c[i] = (m[i] - 'A' + k[i%4] - 'A') % 26 + 'A';i++;} */}c[i] = '\0';}void main(){int ii = 1, jj,j;char m[100];char k[100];printf("输入密钥以#号结束:");for(j=0;k[j-1]!='#';j++){k[j]=getchar();}char c[100];printf("输入明文:");scanf("%s", m);encrypt(m, k, c);printf("输出密文: %s\n", c);}运行结果:。
实训四古典密码的加密与破译【实训目的】通过实训要求学生进一步了解古典密码学院里,掌握一种加密解密算法,学会用计算机语言编程的方法进行加密和解密。
【实训要求】了解古典密码原理;掌握RSA加密算法;掌握RSA解密算法;学会用一种语言编写加密解密程序。
【实训内容】1.选择一种计算机语言,并打开该语言编辑窗口2.在硬盘上创建一个子目录3.用C++语言编写古典密码的移位,置换等算法的加密和解密程序#include "stdafx.h"#include "Crpt.h"#include "CrptDlg.h"#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE[] = __FILE__;#endif// CAboutDlg dialog used for App Aboutclass CAboutDlg : public CDialog{public:CAboutDlg();// Dialog Data//{{AFX_DA TA(CAboutDlg)enum { IDD = IDD_ABOUTBOX };//}}AFX_DA TA// ClassWizard generated virtual function overrides//{{AFX_VIRTUAL(CAboutDlg)protected:virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support //}}AFX_VIRTUAL// Implementationprotected://{{AFX_MSG(CAboutDlg)//}}AFX_MSGDECLARE_MESSAGE_MAP()};CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD){//{{AFX_DATA_INIT(CAboutDlg)//}}AFX_DA TA_INIT}void CAboutDlg::DoDataExchange(CDataExchange* pDX){CDialog::DoDataExchange(pDX);//{{AFX_DA TA_MAP(CAboutDlg)//}}AFX_DA TA_MAP}BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)//{{AFX_MSG_MAP(CAboutDlg)// No message handlers//}}AFX_MSG_MAPEND_MESSAGE_MAP()// CCrptDlg dialogCCrptDlg::CCrptDlg(CWnd* pParent /*=NULL*/): CDialog(CCrptDlg::IDD, pParent){//{{AFX_DATA_INIT(CCrptDlg)m_strCt1 = _T("");m_strPt1 = _T("");m_iKey1 = 0;m_strCt2 = _T("");m_iKey2a = 0;m_iKey2b = 0;m_strPt2 = _T("");m_strKey3 = _T("");m_strPt3 = _T("");m_strCt3 = _T("");m_strPt4 = _T("");m_strKey4 = _T("");m_strCt4 = _T("");//}}AFX_DA TA_INIT// Note that LoadIcon does not require a subsequent DestroyIcon in Win32 m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);}void CCrptDlg::DoDataExchange(CDataExchange* pDX){CDialog::DoDataExchange(pDX);//{{AFX_DA TA_MAP(CCrptDlg)DDX_Text(pDX, IDC_CT1, m_strCt1);DDX_Text(pDX, IDC_PT1, m_strPt1);DDX_Text(pDX, IDC_KEY1, m_iKey1);DDX_Text(pDX, IDC_CT2, m_strCt2);DDX_Text(pDX, IDC_KEY2a, m_iKey2a);DDX_Text(pDX, IDC_KEY2b, m_iKey2b);DDX_Text(pDX, IDC_PT2, m_strPt2);DDX_Text(pDX, IDC_KEY3, m_strKey3);DDX_Text(pDX, IDC_PT3, m_strPt3);DDX_Text(pDX, IDC_CT3, m_strCt3);DDX_Text(pDX, IDC_PT4, m_strPt4);DDX_Text(pDX, IDC_KEY4, m_strKey4);DDX_Text(pDX, IDC_CT4, m_strCt4);//}}AFX_DA TA_MAP}BEGIN_MESSAGE_MAP(CCrptDlg, CDialog)//{{AFX_MSG_MAP(CCrptDlg)ON_WM_SYSCOMMAND()ON_WM_PAINT()ON_WM_QUERYDRAGICON()ON_BN_CLICKED(IDC_METH1, OnMeth1)ON_BN_CLICKED(IDC_KEY1SET, OnKey1set)ON_BN_CLICKED(IDC_E1, OnE1)ON_BN_CLICKED(IDC_D1, OnD1)ON_BN_CLICKED(IDC_CLEARPT1, OnClearpt1)ON_BN_CLICKED(IDC_CLEARCT1, OnClearct1)ON_BN_CLICKED(IDC_METH2, OnMeth2)ON_BN_CLICKED(IDC_KEY2SET, OnKey2set)ON_BN_CLICKED(IDC_E2, OnE2)ON_BN_CLICKED(IDC_D2, OnD2)ON_BN_CLICKED(IDC_CLEARPT2, OnClearpt2)ON_BN_CLICKED(IDC_CLEARCT2, OnClearct2)ON_BN_CLICKED(IDC_METH3, OnMeth3)ON_BN_CLICKED(IDC_KEY3SET, OnKey3set)ON_BN_CLICKED(IDC_E3, OnE3)ON_BN_CLICKED(IDC_D3, OnD3)ON_BN_CLICKED(IDC_CLEARPT3, OnClearpt3)ON_BN_CLICKED(IDC_CLEARCT3, OnClearct3)ON_BN_CLICKED(IDC_METH4, OnMeth4)ON_BN_CLICKED(IDC_KEY4SET, OnKey4set)ON_BN_CLICKED(IDC_E4, OnE4)ON_BN_CLICKED(IDC_D4, OnD4)ON_BN_CLICKED(IDC_CLEARPT4, OnClearpt4)ON_BN_CLICKED(IDC_CLEARCT4, OnClearct4)//}}AFX_MSG_MAPEND_MESSAGE_MAP()// CCrptDlg message handlersBOOL CCrptDlg::OnInitDialog(){CDialog::OnInitDialog();// Add "About..." menu item to system menu.// IDM_ABOUTBOX must be in the system command range.ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);ASSERT(IDM_ABOUTBOX < 0xF000);CMenu* pSysMenu = GetSystemMenu(FALSE);if (pSysMenu != NULL){CString strAboutMenu;strAboutMenu.LoadString(IDS_ABOUTBOX);if (!strAboutMenu.IsEmpty()){pSysMenu->AppendMenu(MF_SEPARATOR);pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);}}// Set the icon for this dialog. The framework does this automatically// when the application's main window is not a dialogSetIcon(m_hIcon, TRUE); // Set big iconSetIcon(m_hIcon, FALSE); // Set small icon// TODO: Add extra initialization herem_bJ1 = 0;m_bJ2 = 0;m_bJ3 = 0;m_bJ4 = 0;return TRUE; // return TRUE unless you set the focus to a control}void CCrptDlg::OnSysCommand(UINT nID, LPARAM lParam){if ((nID & 0xFFF0) == IDM_ABOUTBOX){CAboutDlg dlgAbout;dlgAbout.DoModal();}else{CDialog::OnSysCommand(nID, lParam);}}// If you add a minimize button to your dialog, you will need the code below// to draw the icon. For MFC applications using the document/view model,// this is automatically done for you by the framework.void CCrptDlg::OnPaint(){if (IsIconic()){CPaintDC dc(this); // device context for paintingSendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);// Center icon in client rectangleint cxIcon = GetSystemMetrics(SM_CXICON);int cyIcon = GetSystemMetrics(SM_CYICON);CRect rect;GetClientRect(&rect);int x = (rect.Width() - cxIcon + 1) / 2;int y = (rect.Height() - cyIcon + 1) / 2;// Draw the icondc.DrawIcon(x, y, m_hIcon);}else{CDialog::OnPaint();}}// The system calls this to obtain the cursor to display while the user drags// the minimized window.HCURSOR CCrptDlg::OnQueryDragIcon(){return (HCURSOR) m_hIcon;}void CCrptDlg::OnMeth1(){// TODO: Add your control notification handler code hereAfxMessageBox(" 移位密码介绍:\r 字母表用整数0 - 25来标识,密钥K 为整数,且取值空间为0到25\r 加密函数:x = x + k (mod 26)\r 解密函数:x = x - k (mod 26)\r 当K=3时,为凯撒密码\r 不识别空格", MB_ICONINFORMATION);}void CCrptDlg::OnKey1set(){// TODO: Add your control notification handler code hereUpdateData();m_bJ1 = 1;}void CCrptDlg::OnE1(){// TODO: Add your control notification handler code hereif (m_bJ1 == 0){AfxMessageBox("请检查是否设置了密钥或输入了明文");}else{UpdateData();int i = m_strPt1.GetLength();m_strCt1.Empty();for (int j = 0; j < i; j++){m_strCt1 += (m_strPt1[j] - 97 + m_iKey1) % 26 + 97; }UpdateData(FALSE);}}void CCrptDlg::OnD1(){// TODO: Add your control notification handler code hereif (m_bJ1 == 0){AfxMessageBox("请检查是否设置了密钥或输入了密文");}else{UpdateData();int i = m_strCt1.GetLength();m_strPt1.Empty();for (int j = 0; j < i; j++){if (m_strCt1[j] - 97 - m_iKey1 >= 0){m_strPt1 += (m_strCt1[j] - 97 - m_iKey1) % 26 + 97;}else{m_strPt1 += m_strCt1[j] + 26 - m_iKey1;}}UpdateData(FALSE);}}void CCrptDlg::OnClearpt1(){// TODO: Add your control notification handler code hereUpdateData();m_strPt1.Empty();UpdateData(FALSE);}void CCrptDlg::OnClearct1(){// TODO: Add your control notification handler code hereUpdateData();m_strCt1.Empty();UpdateData(FALSE);}void CCrptDlg::OnMeth2(){// TODO: Add your control notification handler code hereAfxMessageBox(" 仿射密码介绍:\r 字母表用整数0 - 25来标识,密钥对由a、b组成\r 整数a满足gcd(a, 26) = 1 \r 整数b的取值空间为0到25\r 加密函数:x = ax + b(mod 26)\r 解密函数:x = a*y - a*b (mod 26)\r 当a=1,b=3时,为凯撒密码\r 不识别空格", MB_ICONINFORMA TION);}void CCrptDlg::OnKey2set(){// TODO: Add your control notification handler code hereUpdateData();m_bJ2 = 1;}void CCrptDlg::OnE2(){// TODO: Add your control notification handler code hereif (m_bJ2 == 0){AfxMessageBox("请检查是否设置了密钥或输入了明文");}else{UpdateData();int i = m_strPt2.GetLength();m_strCt2.Empty();for (int j = 0; j < i; j++){m_strCt2 += ((m_strPt2[j] - 97) * m_iKey2a + m_iKey2b) % 26 + 97; }UpdateData(FALSE);}}void CCrptDlg::OnD2(){// TODO: Add your control notification handler code hereif (m_bJ2 == 0){AfxMessageBox("请检查是否设置了密钥或输入了密文");}else{UpdateData();int i = m_strCt2.GetLength();m_strPt2.Empty();int a = transt(m_iKey2a);for (int j = 0; j < i; j++){if (m_strCt2[j] - 97 - m_iKey2b < 0){m_strPt2 += ((m_strCt2[j] - 97 - m_iKey2b) * a + 26) % 26 + 97;}else{m_strPt2 += ((m_strCt2[j] - 97 - m_iKey2b) * a) % 26 + 97;}} UpdateData(FALSE);}}void CCrptDlg::OnClearpt2(){// TODO: Add your control notification handler code hereUpdateData();m_strPt2.Empty();UpdateData(FALSE);}void CCrptDlg::OnClearct2(){// TODO: Add your control notification handler code hereUpdateData();m_strCt2.Empty();UpdateData(FALSE);}void CCrptDlg::OnMeth3(){// TODO: Add your control notification handler code hereAfxMessageBox("维吉尼亚密码介绍:\r 首先确定密钥长度(本例中密钥只采取个位数字,所以取决于输入密钥的长度)如6\r 然后输入满足这个长度的向量,如K = (1,2,3,4,5,6)\r 加密:取明文第一个字母并将之移k1位,这里k1=1,第二个字母移k2位,k2=2,一旦到了密钥末尾,又从头开始\r 不识别空格", MB_ICONINFORMA TION);}void CCrptDlg::OnKey3set(){// TODO: Add your control notification handler code hereUpdateData();m_bJ3 = 1;}void CCrptDlg::OnE3(){// TODO: Add your control notification handler code hereif (m_bJ3 == 0){AfxMessageBox("请检查是否设置了密钥或输入了明文");}else{UpdateData();m_strCt3.Empty();int keylen = m_strKey3.GetLength();int ptlen = m_strPt3.GetLength();int i, j, m, n;i = ptlen / keylen;j = ptlen % keylen;for (n = 0; n < i; ++n){for (m = 0; m < keylen; ++m){if (m_strPt3[n * keylen + m] + m_strKey3[m] - 'a' > 'z'){m_strCt3 += m_strPt3[n * keylen + m] + m_strKey3[m] - 'a' - 26;}else{m_strCt3 += m_strPt3[n * keylen + m] + m_strKey3[m] - 'a';}}} for (m = 0; m < j; ++m){if (m_strPt3[n * keylen + m] + m_strKey3[m] - 'a' > 'z'){m_strCt3 += m_strPt3[n * keylen + m] + m_strKey3[m] - 'a' - 26;}else{m_strCt3 += m_strPt3[n * keylen + m] + m_strKey3[m] - 'a';}} UpdateData(FALSE);}}void CCrptDlg::OnD3(){// TODO: Add your control notification handler code hereif (m_bJ3 == 0){AfxMessageBox("请检查是否设置了密钥或输入了密文");}else{UpdateData();m_strPt3.Empty();int keylen = m_strKey3.GetLength();int ctlen = m_strCt3.GetLength();int i, j, m, n;i = ctlen / keylen;j = ctlen % keylen;for (n = 0; n < i; ++n){for (m = 0; m < keylen; ++m){if (m_strCt3[n * keylen + m] - m_strKey3[m] + 'a' < 'a'){m_strPt3 += m_strCt3[n * keylen + m] - m_strKey3[m] + 'a' + 26;}else{m_strPt3 += m_strCt3[n * keylen + m] - m_strKey3[m] + 'a';}}}for (m = 0; m < j; ++m){if (m_strCt3[n * keylen + m] - m_strKey3[m] + 'a' < 'a'){m_strPt3 += m_strCt3[n * keylen + m] - m_strKey3[m] + 'a' + 26;}else{m_strPt3 += m_strCt3[n * keylen + m] - m_strKey3[m] + 'a';}} UpdateData(FALSE);}}void CCrptDlg::OnClearpt3(){// TODO: Add your control notification handler code hereUpdateData();m_strPt3.Empty();UpdateData(FALSE);}void CCrptDlg::OnClearct3(){// TODO: Add your control notification handler code hereUpdateData();m_strCt3.Empty();UpdateData(FALSE);}void CCrptDlg::OnMeth4(){// TODO: Add your control notification handler code hereAfxMessageBox("换位密码介绍:\r 确定密钥长度,如5 \r 输入长度为5的0到4的整数序列,如14032作为密钥\r 将明文分成每5个字母一组,每组字母按照密钥进行换位\r 不识别空格", MB_ICONINFORMA TION);}void CCrptDlg::OnKey4set(){// TODO: Add your control notification handler code hereUpdateData();m_bJ4 = 1;}void CCrptDlg::OnE4(){// TODO: Add your control notification handler code hereif (m_bJ4 == 0){AfxMessageBox("请检查是否设置了密钥或输入了明文");}else{UpdateData();m_strCt4.Empty();int keylen = m_strKey4.GetLength();int ptlen = m_strPt4.GetLength();int i = ptlen / keylen;int j = ptlen % keylen;if (0 != j){for(int m = 0; m < keylen - j; ++m){m_strPt4 += 'x';}i++;}int n, m, k;for (n = 0; n < i; ++n){for (m = 0; m < keylen; ++m){for (k = 0; k < keylen; ++k){if (m_strKey4[k] == '0' + m){m_strCt4 += m_strPt4[n * keylen + k]}}}}UpdateData(FALSE);}}void CCrptDlg::OnD4(){// TODO: Add your control notification handler code hereif (m_bJ4 == 0){AfxMessageBox("请检查是否设置了密钥或输入了密文");}else{UpdateData();m_strPt4.Empty();int keylen = m_strKey4.GetLength();int ctlen = m_strCt4.GetLength();CString key;key.Empty();for (int e = 0; e < keylen; ++e){for (int f = 0; f < keylen; ++f){if (e == m_strKey4[f]){key += m_strKey4[f];}}}int i = ctlen / keylen;int j = ctlen % keylen;if (0 != j){AfxMessageBox("请检查密文格式是否正确");}else{int n, k;for (n = 0; n < i; ++n){for (k = 0; k < keylen; ++k){m_strPt4 += m_strCt4[n * keylen + m_strKey4[k] - '0'];}}} UpdateData(FALSE);}}void CCrptDlg::OnClearpt4(){// TODO: Add your control notification handler code hereUpdateData();m_strPt4.Empty();UpdateData(FALSE);}void CCrptDlg::OnClearct4(){// TODO: Add your control notification handler code hereUpdateData();m_strCt4.Empty();UpdateData(FALSE);}int CCrptDlg::transt(int a){if (1 == a){return 1;}else{int b, q, r, q0, x, x0, x1;r = 1;b = 26;x1 = 1;x0 = 0;q0 = -1;while (0 != r){q = b / a;r = b % a;x = q0 * (-1) * x0 + x1;q0 = q;x1 = x0;x0 = x;b = a;a = r;}return x;}}4.编写RSA算法的加密解密程序#include <iostream.h>#include <conio.h>#include <math.h>#include <stdlib.h>#include <string.h>int go(int k,char bk[16]);int Transform(int m,int k,int n);int gcd(int a,int b);int IsPrime(int a);go(int k,char bk[16]){int n = 0;while( k > 0) {bk[n] = k % 2;n++;k/= 2;}return k;}int Transform(int m,int k,int n){ long int r=1;char bk[16];go(k,bk);for(int i=15; i>=0; i--){ r=(r*r)%n;if (bk[i] ==1){ r=(r*m)%n; } }return r; }int gcd(int a,int b){ for(int i=2;i <=sqrt(a <b?a:b);i++)if ((a%i ==0)&&(b%i==0))return 0;return 1; }int IsPrime(int a){ for(int i=2;i <=sqrt(a);i++)if(a%i==0) return 0;return 1; }void main(){ int c,e,d,m,n,z,p,q;cout << "\t************简单RSA加密解密算法***********\n\n "; cout <<"请输入p: ";cin>> p;while(!IsPrime(p)){ cout << "您输入的p不是素数,请重新输入: "; cin>> p; }cout << "请输入q: ";cin>> q;while(!IsPrime(q)){ cout << "您输入的q不是素数,请重新输入: "; cin>> q; }cout << "\n由p和q求得n和ф(n) " <<endl;n=p*q;z=(p-1)*(q-1);cout << "n =" <<n << " and " << "ф(n) =" <<z <<endl; cout <<endl << "请输入e: ";cin>> e;while (!gcd(e,z)){ cout << "e应该和ф(n)互素: ";cin>> e; }cout << "求得解密密钥" ;d=1;while (((e*d)%z)!=1) d++;cout << "d =" << d << endl;cout <<endl << "请输入明文m: " ;cin>> m;while (m>=n||m<=0){ cout << "请重新输入明文m(0<m<"<<n<<")"; cin>> m; }cout << "求得密文为:";c=Transform(m,e,n);cout << "c =" <<c <<endl;cout <<endl << "请输入密文c: " ;cin>> c;cout << "求得明文为:" ;m=Transform(c,d,n);cout << "m =" <<m <<endl;getch(); }4.运行并调试改程序。
密码学实验1古典密码算法一(实验原理古典密码算法历史上曾被广泛应用,大都比较简单,使用手工和机械操作来实现加密和解密。
它的主要应用对象是文字信息,利用密码算法实现文字信息的加密和解密。
下面介绍两种常见的具有代表性的古典密码算法,以帮助读者对密码算法建立一个初步的印象。
1( 替代密码替代密码算法的原理是使用替代法进行加密,就是将明文中的字符用其它字符替代后形成密文。
例如:明文字母 a、b、c、d ,用 D、E、F、G做对应替换后形成密文。
替代密码包括多种类型,如单表替代密码、多明码替代密码、多字母替代密码、多表替代密码等。
下面我们介绍一种典型的单表替代密码,恺撒(caesar)密码,又叫循环移位密码。
它的加密方法,就是将明文中的每个字母用此字符在字母表中后面第 k个字母替代。
它的加密过程可以表示为下面的函数: E(m)=(m+k) mod n其中:m 为明文字母在字母表中的位置数;n 为字母表中的字母个数;k 为密钥;E(m)为密文字母在字母表中对应的位置数。
例如,对于明文字母 H,其在字母表中的位置数为 8,设 k=4,则按照上式计算出来的密文为 L:E(8) = (m+k) mod n = (8+4) mod 26 = 12 = L2( 置换密码置换密码算法的原理是不改变明文字符,只将字符在明文中的排列顺序改变,从而实现明文信息的加密。
置换密码有时又称为换位密码。
矩阵换位法是实现置换密码的一种常用方法。
它将明文中的字母按照给的顺序安排在一个矩阵中,然后用根据密钥提供的顺序重新组合矩阵中字母,从而形成密文。
例如,明文为 attack begins at five,密钥为 cipher,将明文按照每行 6 列的形式排在矩阵中,形成如下形式:a t t a c kb e g i n sa t f i v e根据密钥 cipher中各字母在字母表中出现的先后顺序,给定一个置换:1 2 3 4 5 6f =1 4 5 32 63 列,根据上面的置换,将原有矩阵中的字母按照第 1 列,第4 列,第5 列,第第 2列,第6 列的顺序排列,则有下面形式:a a c t t kb i n g e sa I v f t e从而得到密文:abatgftetcnvaiikse其解密的过程是根据密钥的字母数作为列数,将密文按照列、行的顺序写出,再根据由密钥给出的矩阵置换产生新的矩阵,从而恢复明文。
(此文档为word格式,下载后您可任意编辑修改!)《—现代密码学—》实验指导书适用专业:计算机科学与技术江苏科技大学计算机科学学院2011年11 月实验一古典密码实验学时:2学时实验类型:验证实验要求:必修一、实验目的编程实现古典密码的加解密方法。
二、实验内容(1)移位密码的加密和解密函数。
(2)仿射密码的加密和解密函数。
(3)维吉尼亚密码的加密和解密函数。
三、实验原理、方法和手段(1)移位密码对于明文字符,加密密钥,加密方法为解密方法为(2)仿射密码对于明文字符,加密密钥,加密方法为=+==y ax b a b,gcd(,26)1,1,2,,25解密方法为(3)维吉尼亚密码选取密钥字Key,将明文按照密钥字长度分组,将明文与密钥字对应字符相加并对26求余,即为密文字符。
解密过程为四、实验组织运行要求本实验采用集中授课形式,每个同学独立完成上述实验要求。
五、实验条件每人一台计算机独立完成实验,有如下条件:(1)硬件:微机;(2)软件:VC++6.0、VC++.Net 2005。
六、实验步骤(1)将各函数编写完成;(2)在主函数中调用各函数,实现加密和解密。
七、实验报告实验报告主要包括实验目的、实验内容、实验原理、源程序及结果。
移位密码加密:#include<stdio.h>#define n 3 //移位位数void change(char string[]){int i;for(i=0;string[i]!='\0';i++){if(string[i]>='a'&&string[i]<='z')string[i]=(string[i]+n>='z'?string[i]+n-26:string[i]+n); }}void main(){char str[100];printf("请输入一段明文");gets(str);change(str);printf("密文为:\n");puts(str);}移位密码解密:#include<stdio.h>#define n 3 //移位位数void change(char string[]){int i;for(i=0;string[i]!='\0';i++){if(string[i]>='a'&&string[i]<='z')string[i]=(string[i]+n<'a'?string[i]-n+26:string[i]-n); }}void main(){char str[100];printf("请输入一段密文");gets(str);change(str);printf("明文为:\n");puts(str);}仿射密码加密:#include<stdio.h>void fun( char a[],int x,int y){int i;for(i=0;a[i]!='\0';i++){a[i]=(x*(a[i]-97)+y)%26+97;}}main(){char string[100];int x,y;printf("输入");gets(string);printf("请输入密钥");scanf("%d,%d",&x,&y);printf("明文:%s\n",string);fun(string,x,y);printf("密文为:%s\n",string); }仿射密码解密:#include<stdio.h>void fun( char a[],int x,int y) {int i;for(i=0;a[i]!='\0';i++){a[i]=(x*(a[i]-97)+y)%26+97;}}main(){char string[100];int x,y;printf("输入");gets(string);printf("请输入密钥");scanf("%d,%d",&x,&y);printf("密文:%s\n",string);fun(string,x,y);printf("明文:%s\n",string);}密码加密:#include<stdio.h>void change(char old[],char new1[][5]){ int i,j,t;char temp[20][5];t=strlen(old);for(i=t;i<(5-t%5)+t;i++) //将一维数组old每5个分成一组不足5位的用X补充old[i]='x';for(i=t+(5-t%5);i<100;i++)old[i]='\0';for(i=0;i<20;i++) //将一维数组old转换成一个20*5的二维数组tempfor(j=0;j<5;j++)temp[i][j]=old[5*i+j];for(i=0;i<20;i++) //密文字母交换顺序{new1[i][0]=temp[i][1];new1[i][1]=temp[i][4];new1[i][2]=temp[i][3];new1[i][3]=temp[i][0];new1[i][4]=temp[i][2];}}main(){char old[100],new1[20][5];gets(old);change(old,new1);printf("%s",new1);}密码解密#include<stdio.h>void change(char old[],char new1[][5]){ int i,j,t;char temp[20][5];t=strlen(old);for(i=0;i<20;i++) //将一维数组old转换成一个20*5的二维数组tempfor(j=0;j<5;j++)temp[i][j]=old[5*i+j];for(i=0;i<20;i++) //密文字母交换顺序 {new1[i][1]=temp[i][0];new1[i][4]=temp[i][1];new1[i][3]=temp[i][2];new1[i][0]=temp[i][3];new1[i][2]=temp[i][4];}}main(){char old[100],new1[20][5];gets(old);change(old,new1);printf("%s",new1);}实验二序列密码实验学时:2学时实验类型:验证实验要求:必修一、实验目的编程实现序列密码RC4的加密方法。
古典密码与破译、实验目的及意义本实验主要涉及代数,利用模运算意义下的矩阵乘法、求逆矩阵、线性无关、线性空间与线性变换等概念和运算,学习古典密码体制的加密、解密和破译过程.二、实验内容I.Hill 2 加密;2.Hill 2 解密。
三、实验步骤1. 开启软件平台一一MATLAB,开启MATLAB编辑窗口;2•根据加密解密算法步骤编写M文件1. 保存文件并运行;2. 观察运行结果(数值或图形);3. 根据观察到的结果和体会写出实验报告。
四、实验要求与任务根据实验内容和步骤,完成以下实验,要求写出实验报告。
1. 实际问题(甲)的修正:按照甲方与乙方的约定,他们之间的密文通信采用Hill 2密码,密钥为二阶矩阵A="2 i且汉语拼音的26个字母以及空格(字2 4丿母A~Z的表值为1~26,空格的表值为0)与0〜26之间的整数建立——对应的关系,称之为字母的表值,试修正表1、表2以及附录中的程序,以给出模27 意义下矩阵可逆的判别方法和具体求法.2. 若将你姓名的拼音作为明文,例如:赵本山(ZHAO BEN SHAN,含空格),密钥等参见练习1,求其在模27意义下的Hill 2密文.3. 若将你姓名的拼音作为Hill 2密文,例如:赵本山(ZHAO BEN SHAN,含空格),密钥等参见练习1,求其在模27意义下的明文.五.程序代码及运行结果(经调试后正确的源程序)1.实际问题(甲)的修正:按照甲方与乙方的约定,他们之间的密文通信采用Hill 2密码,密钥为二阶矩阵A="2 i且汉语拼音的26个字母以及空格(字wilyes11 收集博客(与学习无关):.en/u/18102318022 4丿母A~Z的表值为1~26,空格的表值为0)与0〜26之间的整数建立——对应的关系,称之为字母的表值,试修正表1、表2以及附录中的程序,以给出模27 意义下矩阵可逆的判别方法和具体求法.表2可用①中程序求得:①求模27倒数表(prog1_MOD27.m) 程序代码:m=27;for a=1:mfor i=1:mif mod(a*i,m)==1fprintf('%d 的模%d 倒数是:%d\n',a,m,i);break; end;end;end运行结果:1的模27倒数是:12的模27倒数是:144的模27倒数是:75的模27倒数是:117的模27倒数是:48的模27倒数是:1710的模27倒数是:1911的模27倒数是:513的模27倒数是:2514的模27倒数是:216的模27倒数是:2217的模27倒数是:819的模27倒数是:1020的模27倒数是:2322的模27倒数是:1623的模27倒数是:2025的模27倒数是:1326的模27倒数是:26② 判断二阶矩阵在模27 意义下是否可逆,可逆则求其逆(prog1.m) 程序代码:m=27;aa=input(输入一个2X 2 的矩阵,格式:[all a12;a21 a22]:')while size(aa)~=[2 2]aa=input('输入一个2X2 的矩阵,格式:[all a12;a21 a22]:')enda=det(aa);bb=aa;if gcd(m,a)~=1disp(' 该矩阵不可逆')elsefor i=1:mif mod(a*i,m)==1antaa=i;break;endendastar=[aa(2,2) -aa(1,2);-aa(2,1) aa(1,1)]; invaa=mod(antaa*astar,m);disp(['原矩阵是::mat2str(aa),'它的逆矩阵(mod',num2str(m),')是:',mat2str(invaa)]) end 运行结果:输入一个2X2 的矩阵,格式:[a11 a12;a21 a22]:[1 2;0 4] aa =1 20 4原矩阵是:[1 2;0 4],它的逆矩阵(mod27)是:[1 13;0 7]2. 若将你姓名的拼音作为明文,例如:赵本山(ZHAO BEN SHAN ,含空格),密钥等参见练习1,求其在模27 意义下的Hill 2密文.程序代码:(prog2.m)m=27;enmat=[1 2;0 4];demat=[1 13;0 7];ZERO=64;c=[];en=[];fprintf(' 本组成员的姓名为吴亚山李杰赵传来,拼音为:\n') fprintf('WU YASHAN LI JIE ZHAO CHUAN LAI\n') fprintf(' 以[1 2;0 4]为密钥对此拼音串加密\n') astr=['WU YA SHAN LI JIE ZHAO CHUAN LAI'];an=double(astr);if mod(length(an),2)==1 an=[an,an(length(an))];endan=an-ZERO;for i=1:length(an)if an(i)==-32an(i)=0;end endc=reshape(an,2,length(an)/2); dn=mod(enmat*c,m);en=reshape(dn,1,length(an)); en=en+ZERO;for i=1:length(en) ifen(i)==64 en(i)=32;end end en=en(1: length(an));disp(['密文是:',char(en)])运行结果:本组成员的姓名为吴亚山李杰赵传来,拼音为: WU YA SHAN LIJIE ZHAO CHUAN LAI 以[1 2;0 4]为密钥对此拼音串加密密文是:KCWSA HEBBXUI AIE OEDFFLWCBBXUSI3. 若将你姓名的拼音作为Hill 2密文,例如:赵本山(ZHAO BEN SHAN ,含空格),密钥等参见练习1,求其在模27 意义下的明文.程序代码:(prog3.m) m=27;enmat=[1 2;0 4];demat=[1 13;0 7];ZERO=64;c=[];en=[];fprintf('本组成员的姓名为吴亚山李杰赵传来,拼音密文为:\n') fprintf('KCWSA HEBBXUI AIE OEDFFLWCBBXUSI\n') fprintf(' 以[1 13;0 7]为密钥对此拼音串密文解密\n') astr=['KCWSA HEBBXUI AIE OEDFFLWCBBXUSI']; an=double(astr);if mod(length(an),2)==1 an=[an,an(length(an))];end an=an-ZERO;for i=1:length(an) if an(i)==-32 an(i)=0;endend c=reshape(an,2,length(an)/2); dn=mod(demat*c,m);en=reshape(dn,1,length(an)); en=en+ZERO;for i=1:length(en) ifen(i)==64 en(i)=32;endenden=en(1: length(an));disp(['明文是:',char(en)])运行结果:本组成员的姓名为吴亚山李杰赵传来,拼音密文为: KCWSA HEBBXUI AIEOEDFFLWCBBXUSI 以[1 13;0 7]为密钥对此拼音串密文解密明文是:WU YA SHAN LI JIE ZHAO CHUAN LAI六.实验总结本实验主要涉及代数,利用模运算意义下的矩阵乘法、求逆矩阵、线性无关、线性空间与线性变换等概念和运算,学习古典密码体制的加密、解密和破译过程.实验中解决了如下问题:求模27 倒数表;判断二阶矩阵在模27意义下是否可逆,可逆则求其逆;求明文字符串在模27意义下的Hill 2密文;求密文字符串在模27意义下的Hill 2密文。
.. . …
. word. …
工程大学 实 验 报 告
实 验 名 称: 古典密码算法 班 级: 学 号: 姓 名: 实 验 时 间: 2014年4月 成 绩: 指 导 教 师:
实验室名称: 工程大学实验室与资产管理处 制 .. . …
. word. … .. . …
. word. …
一、实验名称 古典密码算法 二、实验目的 通过编程实现经典的代替密码算法和置换密码,包括移位密码、维吉尼亚密码、周期置换密码、列置换密码,加深对代替技术的了解,为现代分组密码实验奠定基础。
三、实验环境(实验所使用的器件、仪器设备名称及规格) 运行Windows 或Linux 操作系统的PC 机,具有gcc(Linux)、VC(Windows)等C 语言编译环境。
四、实验任务及其要求 (1)根据实验原理部分对移位密码的介绍,自己创建明文信息,并选择一个密钥,编 写移位密码的实现程序,实现加密和解密操作。 (2)根据实验原理部分对维吉尼亚密码的介绍,自己创建明文信息,并选择一个密钥, 编写维吉尼亚密码的实现程序,实现加密和解密操作。 (3)根据实验原理部分对周期置换密码的介绍,自己创建明文信息,并选择一个密钥, 编写周期置换密码的实现程序,实现加密和解密操作。 (4)根据实验原理部分对列置换密码的介绍,自己创建明文信息,并选择一个密钥, 编写列置换密码的实现程序,实现加密和解密操作。
五、实验设计(包括原理图、真值表、分析及简化过程、卡诺图、源代码等) 1. 移位密码 移位密码(Shift Cipher)是一种典型的单表替代密码,也称为加法密码。 移位密码的加密方法就是将明文中的每个字母用其在字母表后面的第 k 个字母替代,它的加密过程可以表示为: c = (m + k) mod n 其中,m 为明文字母在字母表中的位置数;n 为字母表中的字母总数;k 为密钥;c 为密文字母在字母表中对应的位置数。相应的,移位密码的解密过程可以 .. . …
. word. …
表示为: m = (c - k) mod n 移位密码的一个典型代表就是凯撒密码(Ceaser Cipher),它是k=3 时的移位密码。使用英文字母表的撒密码的加(解)密可以表示为:m = (c + 3) mod 26 m = (c - 3) mod 26,例如, 明文:attacks at nine am 密钥:3 加密:将明文分组对每一个密文字母,依英文字母表,用其右的第 3 个字母代替 密文: dwwdfnv dw qlqh dp 另外,使用凯撒密码加密后的密文“dwwdfnvdwilyhsp”,其明文为“attacks at five pm”。 2. 维吉尼亚密码 维吉尼亚密码(Vigenere Cipher)是一种多表代替密码,其本质是周期移位密码。 维吉尼亚密码的(用户)密钥为一含有d 个字母的有限字母序列k = k0k1…kd-1
加密时,首先将用户密钥进行周期扩展(周期为d),扩展后的无限字母序列称为
工作密钥,记为K = K0K1…Ki…其中Ki = Ki mod d ,i=0,1,… 当 d=1 时,维吉尼亚密码就是移位密码。对于含有l 个字母的明文,维吉尼亚加密过程可以表示为:ci = (mi+Ki ) mod n 其中,M = m0m1…mi…ml-1 为明文,C = c0c1…ci…cl-1 为密文,K = K0K1…Ki…Kl-1 为工作钥,n 为明文字母表的长度,l 为明文长度(含有字母的数目)。
例如,使用用户钥cat,对明文“vigenere cipher” 进行维吉尼亚加密。此时,n=26(对应英文字母表),用户钥c=3、a=0、t=19,得到的密文为“xizgnxtevkpagr”。 置换(Permutation)是古典密码中另一种基本的处理技巧,就是将明文中的字母重新排列,字母本身不变,只是改变其位置。置换密码(Substitution Cipher)就是使用置换法进行加解密的密码算法,也称为换位密码。置换密码的密钥是一个置换,它表示了明文字母在密文中出现的位置。例如,使用密钥π =(3421),对明文“ming”进行加密,得到的密文为“ngim”。 3. 周期置换密码 周期置换密码是将明文字母按一定长度 m 进行分组,把每个分组中的字母按1,2,…,m的一个置换π 重排位置次序来得到密文的一种加密方法。其中的密钥就是置换π,在π 的描述中包含了分组长度的信息。解密时,对密文字符按长度m 进行分组,并按π 的逆置换π −1
把每组字符重排位置次序来得到明文。例如,
明文:ming chen jiu dian fa dong fan gong 加密密钥:3421(i=1,2,3,4 的一个置换π (i) =3,4,2,1) 加密:将明文分组(4 个字母一组),然后根据加密密钥给定的置换,对每个明文分组进行置换 ming chen jiud ianf adon gfan gong .. . …
. word. …
ngim enhc udij nfai onda anfg ngog 密文:ngimenhcudijnfaiondaanfgngog 解密密钥:4312(3412 的逆置换) 4. 列置换密码 列置换密码也称为矩阵置换密码。其加解密方法如下:把明文字符以固定的宽度 m(分组长度)水平地(按行)写在一纸上,按1,2,…,m 的一个置换π交换列的位置次
序,再按垂直方向(即按列)读出即得密文。解密就是将密文按相同的宽度m 垂直在写在纸上,按置换π的逆置换π −1 交换列的位置次序,然后水平地读出得到明文。置换π就是密钥。例如, 明文:ming chen jiu dian fa dong fan gong 密钥:yu lan hua 加密:去掉密钥重复字母得 yulanh,得到密钥字母顺序653142 得出距阵列数为6,将明文按行填充距阵 按列(依顺序)写出距阵中的字母。 密文:giffg hddn0 njngn cuaa0 inano meiog (其中0 为无效字符) 解密:加密的逆过程
六、实验步骤 通过实验分析,将各个古典密码算法编写出来,然后编写一个主函数。调试,验证加密解密正确性。 #include #include #define CRYPT_OK 1 #define CRYPT_ERROR 0 #define MAXSIZE 100
void ShiftCipher(); void VigenereCipher(); void CycleCipher(); void ColCipher();
void main() { int op=0; while(1) { .. . …
. word. …
printf("Which Cipher would you want ?:1.Shift 2.Vig 3.Cyc 4.Col:\n"); scanf("%d",&op); fflush(stdin); switch(op) { case 1:{ShiftCipher();}break; case 2:{VigenereCipher();}break; case 3:{CycleCipher();}break; case 4:{ColCipher();}break; } }
} //主函数
//列置换置换密码 int Colencrypt(char* plain,char* cipher,char* key); //列置换置换密码加密算法 int Coldecrypt(char* plain,char* cipher,char* key); //列置换置换密码解密算法 void ColCipherEncrypt(); //列置换置换密码加密调用 void ColCipherDecrypt(); //列置换置换密码解密调用 void ColCipher(); //列置换置换密码模块调用 int fix(char* m,int T); //字符串补齐修正
void ColCipher() { int op=0; while(1) { fflush(stdin); printf("__This_is_Coloum_Cipher_Process____________________\n"); printf("1 for encrypt,2 for decrypt:"); scanf("%d",&op); getchar(); switch(op) { .. . …
. word. …
case 1:{ColCipherEncrypt();}break; case 2:{ColCipherDecrypt();}break; default:{printf("Error Input\n");} } } } //列置换置换密码模块调用 void ColCipherEncrypt() { char p[MAXSIZE],c[MAXSIZE],k[MAXSIZE]; //定义变量 printf("Please Input the Plaintext:\n"); gets(p); fflush(stdin); printf("Please Input the ColKey:(连续整数序列置换)\n"); gets(k); //获取明文&密钥 fix(p,strlen(k)); //补齐空格 Colencrypt(p,c,k); //调用加密函数 printf("Chipertext:\n%s",c); getchar(); } //列置换置换密码加密调用 void ColCipherDecrypt() { char p[MAXSIZE],c[MAXSIZE],k[MAXSIZE],flag,abc[27]; int i,temp; //定义变量 printf("Please Input the Ciphertext:\n"); gets(c); printf("Do You Know the Key? y/n:"); fflush(stdin); scanf("%c",&flag); getchar();
switch(flag)