当前位置:文档之家› 密码学实验报告

密码学实验报告

《—现代密码学—》实验指导书适用专业:计算机科学与技术江苏科技大学计算机科学学院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的加密方法。

二、实验内容序列密码RC4。

三、实验原理、方法和手段RC4首先进行S表的初始化:(1),0255i S i i =≤≤;(2)用密钥填充另一个256字节的数组K ,如果密钥长度小于256字节,则依次重复填充,直至填满这个数组。

(3)J =0;(4)对于I =0到255,重复以下步骤① (mod 256)I I J J S K =++;② 交换I S 和J S 。

RC4对下面(1)~(5)循环后,得出密钥流的一个字节z 。

(1)0,0I J ==;(2)1(mod 256)I I =+(3)(mod 256)I J J S =+(4)交换I S 和J S ;(5)I J t S S =+;(6)t z S =.四、实验组织运行要求本实验采用集中授课形式,每个同学独立完成上述实验要求。

五、实验条件每人一台计算机独立完成实验,有如下条件:(1)硬件:微机;(2)软件:VC++6.0、VC++.Net 2005。

六、实验步骤(1)将各函数编写完成;(2)在主函数中调用各函数,实现加密和解密。

七、实验报告实验报告主要包括实验目的、实验内容、实验原理、源程序及结果。

线性移位寄存器:#include<stdio.h>#include<math.h>char InputKey[4]; //输入的4位密钥字符int InitKey[32]; //密钥转化成的32位0或1的序列int Bit[8]; //明文中单个字符的位序列(通过for使Bit数组改变,逐一表示各个字符)int LFSRKey[32];char Out[2]; //每个字符加密后通过2位16进制表示char Info[1000]; //需要加密的明文,最多1000位,当然可以修改该值使之更大int tempInfo[1000]; //明文字符对应的Ascii值int InfoLength; //实际明文长度char Cipher[2000]; //密文// ( 32,7,5,3,2,1,0 )void KeyToBit(); // 把初始密钥转化成位序列void LFSR(); // LFSR序列加密void Output16(); // 把二进制转化为16进制void InfoToBit(int j); // 把输入的明文转化成位序列main(){int i,j ;char ans ;while ( 1 ){printf("\n*********************************************************** ****\n\n");printf("Please input the InitKey :\n"); // 输入四个字符作为初始密钥,老师要求:goodfor ( i=0 ; i<4 ; i++ )scanf("%c",&InputKey[i]);KeyToBit();printf("\nPlease input the Information encrypted ( End with \" # \") :\n"); // 输入需要加密的明文,以#作为结束符for ( i=0 ; i<1000 ; i++ ){scanf("%c",&Info[i]); // 记录输入的明文tempInfo[i] = Info[i] ; // 将Ascii值同步附给tempInfoif ( Info[i] == '#' ){InfoLength = i ;break ; // 遇到#则停止读取}}printf("\n*********************************************************** ****\n\n");printf("The Cipher is :\n");for ( i=0,j=0 ; i<InfoLength ; i++ ){InfoToBit(i); // 每个明文字符单独转化为8bit位序列,保存到Bit[8]LFSR(); // 加密Cipher[j] = Out[0] ;printf("%c",Cipher[j]);Cipher[j+1] = Out[1] ;printf("%c",Cipher[j+1]);j = j + 2 ;}printf("\n*********************************************************** ****\n\n");printf("Continue? y/n ? \n ");getchar(); // 消除前面输入的字符对本次输入的影响scanf("%c",&ans);getchar();if ( ans == 'n' ) // 按n不继续测试break ;}}void KeyToBit(){int i,j,r;for ( i=0 ; i<4 ; i++ ){r = InputKey[i] ;for ( j=0 ; j<8 ; j++ )Bit[j] = 0 ; // 每个密钥序列初始化为全0,避免上一次转化保存到Bit数组给本次转化的影响。

相关主题