当前位置:文档之家› 古典密码实验一

古典密码实验一

古典密码实验一
古典密码实验一

一、实验名称古典密码算法

二、实验目的

通过编程实现经典的代替密码算法和置换密码,包括移位密码、维吉尼亚密码、周期置换密码、列置换密码,加深对代替技术的了解,为现代分组密码实验奠定基础。

三、实验环境(实验所使用的器件、仪器设备名称及规格)

运行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 为密文字母在字母表中对应的位置数。相应的,移位密码的解密过程可以表示为:m = (c - k) mo

d 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…k d-1

加密时,首先将用户密钥进行周期扩展(周期为d),扩展后的无限字母序列称为工作密钥,记为K = K0K1…K i…其中K i = K i mod d ,i=0,1,…

当d=1 时,维吉尼亚密码就是移位密码。对于含有l 个字母的明文,维吉尼亚加密过程可以表示为:c i = (m i+K i ) mod n 其中,M = m0m1…m i…m l-1 为明文,C = c0c1…c i…c l-1 为密文,K = K0K1…K i…K l-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

ngim enhc udij nfai onda anfg ngog

密文:ngimenhcudijnfaiondaanfgngog

解密密钥:4312(3421 的逆置换)

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)

{

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)

{

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)

{

case 'y': //若知道密钥则直接经行解密

{

printf("Please Input the ColKey:\n");

gets(k);

//获取密钥

fix(c,strlen(k));

Coldecrypt(p,c,k);

//调用函数

printf("Plaintext:\n%s\n",p);

}break;

case 'n': //不知道密钥则对文本进行字母统计分析{

printf("Then I can't help you!\n");

};break;

default:{printf("ERROR\n");}

}

}

//列置换置换密码解密调用

int Colencrypt(char* plain,char* cipher,char* key)

{

int i,r,T,n,j;

char temp[MAXSIZE];

i=0;

T=strlen(key);

while(plain[i]!='\0')

{

r=i%T;

cipher[i]=plain[i-r+(key[r]-'0')-1];

i++;

}

cipher[i]='\0';

n=strlen(cipher)/strlen(key);

for(i=0;i

{

for(j=0;j

{

temp[i]=cipher[T*j+i%T];

}

}

temp[strlen(cipher)]='\0';

return CRYPT_OK;

}

//列置换置换密码加密算法

int Coldecrypt(char* plain,char* cipher,char* key) {

int i,r,T,n,j;

char temp[MAXSIZE];

i=0;

T=strlen(key);

while(cipher[i]!='\0')

{

r=i%T;

plain[i]=cipher[i-r+(key[r]-'0')-1];

i++;

}

plain[i]='\0';

n=strlen(plain)/strlen(key);

for(i=0;i

{

for(j=0;j

{

temp[i]=plain[T*j+i];

}

}

temp[strlen(plain)]='\0';

plain=temp;

return CRYPT_OK;

}

//列置换置换密码解密算法

//移位密码

int ShiftEncrypt(char* plain,char* cipher,int key); //移位密码加密算法

int ShiftDecrypt(char* plain,char* cipher,int key); //移位密码解密算法void ShiftCipherEncrypt(); //移位密码加密调用void ShiftCipherDecrypt(); //移位密码解密调用void ShiftCipher(); //移位密码模块调用

void ShiftCipher()

{

int op=0;

while(1)

{

fflush(stdin);

printf("_This_is_Shift_Cipher_Process_________________________\n");

printf("1 for encrypt,2 for decrypt:");

scanf("%d",&op);

getchar();

switch(op)

{

case 1:{ShiftCipherEncrypt();}break;

case 2:{ShiftCipherDecrypt();}break;

default:{printf("Error Input\n");}

}

}

}

//移位密码模块调用

void ShiftCipherEncrypt()

{

char p[MAXSIZE],c[MAXSIZE];

int key=0;

//定义变量

printf("Please Input the Plaintext:\n");

gets(p);

printf("Please Input the ShiftKey:\n");

scanf("%d",&key);

//获取必要信息

ShiftEncrypt(p,c,key);

//调用函数

printf("Chipertext:\n%s\n",c);

getchar();

}

//移位密码加密调用

void ShiftCipherDecrypt()

{

char p[MAXSIZE],c[MAXSIZE],flag;

int key=0;

int i;

//定义变量

printf("Please Input the Ciphertext:\n");

gets(c);

printf("Do You Know the Key? y/n:");

fflush(stdin);

scanf("%c",&flag);

getchar();

switch(flag)

{

case 'y':

{

printf("Please Input the ShiftKey[0-26]:\n");

scanf("%d",&key);

//获取必要信息

ShiftDecrypt(p,c,26-key);

//调用函数

printf("Plaintext:\n%s\n",p);

getchar();

}break;

case 'n':

{

for(i=25;i>0;i--)

{

ShiftDecrypt(p,c,i);

printf("Plaintext Shift By %2d is: %s\n",26-i,p);

}

};break;

default:{printf("ERROR\n");}

}

}

//移位密码解密调用

int ShiftEncrypt(char* plain,char* cipher,int key)

{

int i=0;

while(plain[i]!='\0')

{

if(plain[i]>='A'&&plain[i]<='Z')

{

cipher[i]=(plain[i]+key-'A')%26+'A';

}

else

{

if(plain[i]>='a'&&plain[i]<='z')

{

cipher[i]=(plain[i]+key-'a')%26+'a';

}

else

cipher[i]=plain[i];

}

i++;

}

cipher[i]='\0';

return CRYPT_OK;

}

//移位密码加密算法

int ShiftDecrypt(char* plain,char* cipher,int key)

{

int i=0;

while(cipher[i]!='\0')

{

if(cipher[i]>='A'&&cipher[i]<='Z')

{

plain[i]=(cipher[i]-'A'+key)%26+'A';

}

else

{

if(cipher[i]>='a'&&cipher[i]<='z')

{

plain[i]=(cipher[i]-'a'+key)%26+'a';

}

else

{plain[i]=cipher[i];}

}

i++;

}

plain[i]='\0';

return CRYPT_OK;

}

//移位密码解密算法

//弗吉尼亚密码

int Vigenereencrypt(char* plain,char* cipher,char* key); //弗吉尼亚密码加密算法int Vigeneredecrypt(char* plain,char* cipher,char* key); //弗吉尼亚密码解密算法void VigenereCipherEncrypt(); //弗吉尼亚密码加密调用

void VigenereCipherDecrypt(); //弗吉尼亚密码解密调用

void VigenereCipher(); //弗吉尼亚密码模块调用

void Static(char* c); //密文字母频率统计模块

void VigenereCipher()

{

int op=0;

while(1)

{

fflush(stdin);

printf("__This_is_Vigenere_Cipher_Process_____________________\n");

printf("1 for encrypt,2 for decrypt:");

scanf("%d",&op);

getchar();

switch(op)

{

case 1:{VigenereCipherEncrypt();}break;

case 2:{VigenereCipherDecrypt();}break;

default:{printf("Error Input\n");}

}

}

}

//弗吉尼亚密码模块调用

void VigenereCipherEncrypt()

{

char p[MAXSIZE],c[MAXSIZE],k[MAXSIZE];

//定义变量

printf("Please Input the Plaintext:\n");

gets(p);

fflush(stdin);

printf("Please Input the VigenereKey:(low case)\n");

gets(k);

//获取必要信息

Vigenereencrypt(p,c,k);

//调用函数

printf("Chipertext:\n%s",c);

getchar();

}

//弗吉尼亚密码加密调用

void VigenereCipherDecrypt()

{

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)

{

case 'y': //若知道密钥则直接经行解密

{

printf("Please Input the VigenereKey:\n");

gets(k);

//获取密钥

Vigeneredecrypt(p,c,k);

//调用函数

printf("Plaintext:\n%s\n",p);

}break;

case 'n': //不知道密钥则对文本进行字母统计分析

{

Static(c);

};break;

default:{printf("ERROR\n");}

}

}

//弗吉尼亚密码解密调用

int Vigenereencrypt(char* plain,char* cipher,char* key)

{

int i=0;

int T;

T=strlen(key);

printf("%d",T);

while(plain[i]!='\0')

{

if(plain[i]>='A'&&plain[i]<='Z')

{

cipher[i]=(plain[i]+key[i%T]-'A'-'a')%26+'A';

}

else

{

if(plain[i]>='a'&&plain[i]<='z')

{

cipher[i]=(plain[i]+key[i%T]-'a'-'a')%26+'a';

}

else

cipher[i]=plain[i];

}

i++;

}

cipher[i]='\0';

return CRYPT_OK;

}

//弗吉尼亚密码加密算法

int Vigeneredecrypt(char* plain,char* cipher,char* key)

{

int i=0;

int T;

int abc[26];

T=strlen(key);

while(cipher[i]!='\0')

{

if(cipher[i]>='A'&&cipher[i]<='Z')

{

plain[i]=(cipher[i]-'A'+26-(key[i%T]-'a'))%26+'A';

}

else

{

if(cipher[i]>='a'&&cipher[i]<='z')

{

plain[i]=(cipher[i]-'a'+26-(key[i%T]-'a'))%26+'a';

}

else

{plain[i]=cipher[i];}

}

i++;

}

plain[i]='\0';

return CRYPT_OK;

}

//弗吉尼亚密码解密算法

void Static(char* c)

{

int i,temp;

int abc[27]={0};

i=0;

temp=0;

while(c[i]!='\0')

{

if(c[i]>='A'&&c[i]<='Z')

{temp=c[i]-'A';}

else

{

if(c[i]>='a'&&c[i]<='z')

{

temp=c[i]-'a';

}

else

{

temp=26;

}

}

abc[temp]++;

i++;

}

for(i=0;i<26;i++)

{

printf("%c:%d\n",i+'A',abc[i]);

}

printf("Other:%d\n",abc[26]);

printf("That's all I can do for you. \n");

}

//密文字母频率统计模块

//周期置换密码

int Cycleencrypt(char* plain,char* cipher,char* key); //周期置换密码加密算法

int Cycledecrypt(char* plain,char* cipher,char* key); //周期置换密码解密算法void CycleCipherEncrypt(); //周期置换密码加密调用

void CycleCipherDecrypt(); //周期置换密码解密调用

void CycleCipher(); //周期置换密码模块调用

int fix(char* m,int T); //字符串补齐修正

void CycleCipher()

{

int op=0;

while(1)

{

fflush(stdin);

printf("__This_is_Cycle_Cipher_Process_____________________\n");

printf("1 for encrypt,2 for decrypt:");

scanf("%d",&op);

getchar();

switch(op)

{

case 1:{CycleCipherEncrypt();}break;

case 2:{CycleCipherDecrypt();}break;

default:{printf("Error Input\n");}

}

}

}

//周期置换密码模块调用

void CycleCipherEncrypt()

{

char p[MAXSIZE],c[MAXSIZE],k[MAXSIZE];

//定义变量

printf("Please Input the Plaintext:\n");

gets(p);

fflush(stdin);

printf("Please Input the CycleKey:(连续整数序周期)\n");

gets(k);

//获取明文&密钥

fix(p,strlen(k));

//补齐空格

Cycleencrypt(p,c,k);

//调用加密函数

printf("Chipertext:\n%s",c);

getchar();

}

//周期置换密码加密调用

void CycleCipherDecrypt()

{

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)

{

case 'y': //若知道密钥则直接经行解密

{

printf("Please Input the CycleKey:\n");

gets(k);

//获取密钥

fix(c,strlen(k));

Cycledecrypt(p,c,k);

//调用函数

printf("Plaintext:\n%s\n",p);

}break;

case 'n': //不知道密钥则对文本进行字母统计分析{

printf("Then I can't help you!\n");

};break;

default:{printf("ERROR\n");}

}

}

//周期置换密码解密调用

int Cycleencrypt(char* plain,char* cipher,char* key) {

int i,r,T;

i=0;

T=strlen(key);

while(plain[i]!='\0')

{

r=i%T;

cipher[i]=plain[i-r+(key[r]-'0')-1];

i++;

}

cipher[i]='\0';

return CRYPT_OK;

}

//周期置换密码加密算法

int Cycledecrypt(char* plain,char* cipher,char* key) {

int i,r,T;

i=0;

T=strlen(key);

while(cipher[i]!='\0')

{

r=i%T;

plain[i]=cipher[i-r+(key[r]-'0')-1];

i++;

}

plain[i]='\0';

return CRYPT_OK;

}

//周期置换密码解密算法

int fix(char* m,int T)

{

int i,max;

i=strlen(m);

if(i%T==0)

{return i/T;}

else

{

max=(i/T+1)*T;

while(i

{

m[i]=' ';

i++;

}

m[i]='\0';

return max;

}

}

七、实验过程与分析

实验二 古典密码

实验2 古典密码 1.实验目的 (1)了解古典密码中的基本加密运算。 (2)了解几种典型的古典密码体制。 (3)掌握古典密码的统计分析方法。 2.实验内容 (1)古典密码体制 ①简单移位加密(单表代换) 该加密方法中,加密时将明文中的每个字母向前推移K位。经典恺撒密码加密变换就是这种变换,取k=3。 步骤1:打开CAP4软件,并加载实验一附带的“mw.txt”,如图2-1所示。 图2-1加载文件

步骤2:采用恺撒加密方法手工加密“mw.txt”;打开CAP4菜单栏“Cipher”菜单项选择“simple shift”选项,并选择移位值“shift value”为3,加密步骤1中加载的文件,如图2-2所示。 图2-2 参数设置 图2-3加密文件

步骤3:比较二者的加密结果是否相同。 步骤4:点击CAP4软件中的“Simple analysis”下的“shift”键,观察恺撒加密法的可能密钥值,并分析其攻击的难度,如图2-4所示。 图2-4密钥分析 ②仿射密码加密(单表代换) 在仿射密码加密(affine cipher)中,字母表中的字母被赋予一个数字,例如,a=0,b=1,c=2,…,z=25.仿射密码加密法的密钥为0~25之间的数字对(a,b)。a与26的最大公约数必须为1,这就是说能整除a和26的数只有1.现在假设m为明文字母的数字,而c为密文字母的数字,那么,这两个数字之间有如下关系: c=(am+b)(mod 26) m=a-1(c-b)(mod 26) 其中,(mod 26)的操作是:除以26,得其余数。 例如,选取密钥为(7,3)。因为7与26互素,也就是只有公约数1,所以(7,3)可以作为仿射密码的加密钥。将“hot”转换成数字7、14、19,利用仿射等式生成: c(H)=(7×7+3) mod 26=52 mod 26=0,即为字母“a“。 c(O)=(7×14+3) mod 26=101 mod 26=23,即为字母“x“. c(T)=(7×19+3) mod 26=136 mod 26=6,即为字母”g”. 这样,对于这个密钥,”hot”变成了“axg“.

密码学实验报告模板总结模板计划模板.doc

密码学应用与实践课程实验报告 实验 1:实现 DES密码体制 一、实验目的 1.编写程序实现 DES的加、解 密:1)编程构造 DES的密钥; 2)应用上述获得的密钥将一段英文或文件进行加、解密。 2.用 DES算法实现口令的安全 二、实验内容 1.DES原理 DES综合运用了置换,代换,移位多种密码技术,是一种乘积密码。在算法结构上采用迭代 结构,从而使其结构清晰,调理清楚,算法为对合运算,便于实现,运行速度快。DES使用了初始置换IP 和 IP-1 各一次(相应的置换看算法描述图表)置换P16 次,安排使用这 3 个置换的目的是把数据彻底打乱重排。选择置换 E 一方面把数据打乱重排,另一方面把32 位输入扩展为48 位,算法中除了S- 盒是非线性变换外,其余变换均为显示变换,所以保密 的关键是选择S- 盒。符合以下 3 条准则: (1)对任何一个 S- 盒而言,没有任何线性方程式等价于此S-盒的输出输入关系,即是S- 盒是非线性函数。 (2)改变 s- 盒的任何一位输入,都会导致两位以上的输出改变,即满足" 雪崩效应 " 。(3)当固定某一个位的输入时,S- 盒的 4 个出位之间,其中0 和 1 的个数之差小。这个准 则的本质是数据压缩,把四位输入压缩为 4 位输出。选择 S-盒函数的输入中任意改变数位, 其输出至少变化两位。因为算法中使用了16 次迭代,大大提高了保密性。 2.DES算法由加密、解密和子密钥的生成三部分组成 1)加密 DES算法处理的数据对象是一组64 比特的明文串。设该明文串为m=m1m2m64 (mi=0 或 1) 。明文串经过64 比特的密钥K 来加密,最后生成长度为64 比特的密文E。其加密过程图示如下:

古典密码学实验

一、实验背景与目的 通过实现简单的古典密码算法,理解密码学的相关概念如明文(plaintext)、密文(ciphertext)、加密密钥(encryption key)、解密密钥(decryption key)、加密算法(encryption algorithm)、解密算法(decryption algorithm)等。 二、实验环境 Visual C++6.0 三、实验内容 (1)用C\C++语言实现仿射变换(Affine)加/解密算法;2) (2)用C\C++语言实现统计26个英文字母出现的频率的程序; (3)利用仿射变换加/解密程序对一段较长的英文文章进行加密,再利用统计 软件对明文和密文中字母出现的频率进行统计并作对比,观察有什么规 律。 其中a, b为密钥, 25 , 0≤ ≤b a ,且gcd(a, 26)=1 实验要求:加/解密程序对任意满足条件的a、b都能够处理。仿射变换: 加密: ()26 mod , b am m E c b a + = = 解密: ()()26 mod 1 , b c a c D m b a - = =- 四、实验原理 一个仿射变换对应于一个矩阵和一个向量的乘法,而仿射变换的复合对应于普通的矩阵乘法,只要加入一个额外的行到矩阵的底下,这一行全部是0除了最右边是一个1,而列向量的底下要加上一个1。仿射变换原理在基于MQ问题的多变元公钥密码中,公钥一般是方程组,但是这种没有处理的方程组很容易受到插值法的攻击,例如:首先在q元有限域上选取个变量以及个变量。构造方程组:这里面公钥信息方程组就是:其中是明文信息,而则是密文。可以看出这样的公钥信息很容易受到插值法的攻击,下面使用仿射将

密码学实验指导

密码学实验指导

目录 实验一凯撒密码算法实验 1 实验二维吉利亚密码算法实验 5 实验三普莱费尔密码算法实验 9 实验四 IDEA密码算法实验 17 实验五 BCH纠错编码算法任务书 27

实验一凯撒密码算法实验 1 实验目的 通过实验熟练掌握凯撒密码算法,学会凯撒密码算法程序设计,提高C++程序设计能力。 2 实验学时:2 实验类别:验证实验■综合性实验□设计性实验□ 3 实验环境 软件环境Windows Xp/Windows 2000 Visual c++/Turbo c++ 3.0 硬件系统Pentium 4 3.0G 512MRAM 计算机等 4 算法原理 按照a~z依次对应0~25编码,变量K存放密钥-正整数。变量M存放一明文字符ASCII码,变量C存放M中的数据经加密后得到的一密文字符的ASCII码。 加密算法:C≡(M+K)mod 26,如此继续下去,实现逐个字符进行加密。 5 实验步骤与内容 1)编写程序 2)编辑录入 3)记录调试及进行情况 4)程序结构说明文档 5)程序使用说明文档 6 思考密钥K的有效的最小取值范围 7 实验总结与体会 8 要求提交完整的实验报告 9 参考程序代码 #include #include using namespace std; //获取密钥函数getKey()

int getKey() { int key; cout<<"请输入密钥:"; cin>>key; return key; } //将明文中的字符全部转化为大写的函数change() void change(char s[]) { int i; for(i=0;i96&&s[i]<122) s[i] = s[i]-32; } } //判断输入的明文格式是否有误的函数getError() //有误则返回0,否则就返回1 int getError(char s[]) { int i,error; for(i=0;i65&&s[i]<=82)||(s[i]>96&&s[i]<=122)) { error = 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 = L 2.置换密码 置换密码算法的原理是不改变明文字符,只将字符在明文中的排列顺序改变,从而实现明文信息的加密。置换密码有时又称为换位密码。 矩阵换位法是实现置换密码的一种常用方法。它将明文中的字母按照给的顺序安排在一个矩阵中,然后用根据密钥提供的顺序重新组合矩阵中字母,从而形成密文。例如,明文为attack begins at five,密钥为cipher,将明文按照每行6列的形式排在矩阵中,形成如下形式: a t t a c k b e g i n s

实验一 古典密码-Vigernere算法

实验一古典密码-Vigenere算法 班级:学号:姓名: 一、实验目的 1、理解简单加密算法的原理; 2、掌握Vigenere密码的原理,完成Vigenere密码加解密程序的编写; 3、通过实验,加深对古典密码体制的了解,掌握对字符进行灵活处理的方法。 二,实验要求 根据Vigenere密码的原理编写程序,对输入的符号串能够根据设置的密钥分别正确实现Vigenere加密和解密功能。 三,实验过程及内容 源程序 #include "stdio.h" #include "string.h" #define BUF_MAX 100 static int square[27][27]; //密钥统一转换为大写字母 void UpperKey(char key[]) { int key_length = strlen(key); for(int i = 0; i < key_length; i++) { if (key[i] >= 'a' && key[i] <= 'z') { key[i] -= 32; } } } //Vigenere加密 void VigenereEncrypt(char word[], char key[]) { char text[BUF_MAX]; int key_length = strlen(key);

int word_length = strlen(word); int i, j, k; for(i = 0; i < word_length; i++) { j = i % key_length; if (word[i] >= 'a' && word[i] <= 'z') { k = word[i] - 'a'; k = (k + key[j] - 'A') % 26; text[i] = k + 'a'; } else if (word[i] >= 'A' && word[i] <= 'Z') { k = word[i] - 'A'; k = (k + key[j] - 'A') % 26; text[i] = k + 'A'; } else { text[i] = word[i]; } } text[i] = '\0'; printf("Encrypt string:"); puts(text); } //Vigenere解密 void VigenereDecript(char en_word[], char key[]) { char word[BUF_MAX]; int key_length = strlen(key); int word_length = strlen(en_word); int i, j, k; for(i = 0; i < word_length; i++) { j = i % key_length; if (en_word[i] >= 'a' && en_word[i] <= 'z')

密码学实验报告总结

密码学实验报告(本文档为Word版本,下载后可自由编辑) 项目名称:××××××××× 项目负责人:××× 联系电话:××××× 编制日期:×××××

密码学实验报告 实验目的:掌握Caesar密码加密解密原理,并利用VC++编程实现。 实验内容:Caesar密码的加密原理是对明文加上一个密钥(偏移值)而得到密文。假设密钥为3,那么字母“a”对应的ASCII码为97,加上3得100正好是字母“d”的ASCII码值, 实验说明:加密实现的两种方式,只限定英文字母(区分大小写),加密时,根据明文字符是小(大)写字母,采用加密运算: 密文字符=“a”或“A”+(明文字符-“a”或“A”+password%26+26)%26 如果输入其他字符,则直接原样输出,不作处理 可以是任意字符 加密时,我们不做任何区分,直接利用Caesar密码算法 密文字符=明文字符+password 解密反之。 实验结果: void CCaesarDlg::OnButton1() //加密按钮 { UpdateData(TRUE); //从界面上的输入的值传入成员变量 m_crypt=m_plaintxt; //密文进行初始化,它与明文的长度是相同的 for(int i=0;i=48&&m_plaintxt.GetAt(i)<=57) //如果输入的字符是数字 { m_crypt.SetAt(i,'0'+(m_plaintxt.GetAt(i)-'0'+m_password%10 +10)%10);

现代密码学-古典密码实验报告

现代密码学 实 验 报 告 院系:理学院 班级:信安二班 姓名: 学号:

前言 密码学(Cryptology)是研究秘密通信的原理和破译秘密信息的方法的一门学科。密码学的基本技术就是对数据进行一组可逆的数学变换,使未授权者不能理解它的真实含义。密码学包括密码编码学(Cryptography)和密码分析学(Cryptanalyst)两个既对立又统一的主要分支学科。研究密码变化的规律并用之于编制密码以保护信息安全的科学,称为密码编码学。研究密码变化的规律并用之于密码以获取信息情报的科学,称为密码分析学,也叫密码破译学。 密码学在信息安全中占有非常重要的地位,能够为信息安全提供关键理论与技术。密码学是一门古老而深奥的学问,按其发展进程,经历了古典密码和现代密码学两个阶段。现代密码学(Modern Cryptology)通常被归类为理论数学的一个分支学科,主要以可靠的数学方法和理论为基础,为保证信息的机密性、完整性、可认证性、可控性、不可抵赖性等提供关键理论与技术。

古典密码算法实验 在密码编码体制中有两种基本也是古老的编码体制一直沿用至今,它们是代替密码和置换密码,其历史悠久并且是现代密码体制的基本组成部分,在密码学中占有重要地位。古典密码是密码学发展的一个阶段,也是近代密码学产生的渊源,一般把Shannon 在1949 年发表“保密系统的通信理论”之前的时期称为古典密码时期。尽管古典密码大多比较简单,一般可用手工或机械方式实现,且都可用统计分析方法破译,目前已很少采用。但是,古典密码所采用的代替技术和置换技术仍然是现代分组密码算法设计的基础,了解它们的设计原理,有助于理解、设计和分析现代密码。 一、实验目的 通过编程实现经典的代替密码算法和置换密码,包括移位密码、维吉尼亚密码、周期置换密码、列置换密码,加深对代替技术的了解,为现代分组密码实验奠定基础。 二、实验原理 代替(Substitution)是古典密码中基本的处理技巧,就是将明文字母由其他字母表中

古典加密实验报告

古典密码算法 一、实验目的 学习常见的古典密码学算法,通过编程实现替代密码算法和置换密码算法,加深对古典密码体制的了解,为深入学习密码学奠定基础。 二、实验要求 分析替代密码算法和置换密码算法的功能需求,详细设计实现替代密码算法和置换密码算法的数据结构和流程,给出测试用例和测试步骤,得出测试和结论。替代密码算法和置换密码算法的实现程序必须提供加密和解密两个接口: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++; } } } 具体加密见下图:

古典密码

实验1: 古典密码 一、实验名称和性质 二、实验目的 掌握古典密码体制中的基本加密解密运算,如加法密码、仿射密码等,几种典型的古典密码体制,如Hill体制,以及关于这些古典密码体制的一些破译方法。 三、实验的软硬件环境要求 硬件环境要求: 单机,无需上Internet网。 使用的软件名称、版本号以及模块: 使用Matlab,版本6.0或以上。 四、知识准备 前期要求掌握的知识: Matlab编程 实验相关理论或原理: 古典密码的基本加密解密运算,几种典型古典密码的加密解密算法。 实验流程: 五、实验要求和注意事项 1.完成给出的程序中标有“-----------------------”部分的编程。 2.参照例子的做法,完成实验题目。要求给出完整的过程,包括程序,实验结果。 六、实验步骤和内容 1.基本的加密解密运算 例1. 使用加法密码(或称为移位密码)获得密文kddkmu,尝试所有的可能性来解密它。解:编写allshift程序,调用该程序 allshift('kddkmu') 运行结果为 kddkmu leelnv mffmow nggnpx ohhoqy piiprz qjjqsa rkkrtb sllsuc tmmtvd unnuwe voovxf wppwyg

xqqxzh yrryai zsszbj attack 是列表上出现的唯一单词,所以它就是明文buubdl cvvcem dwwdfn exxego fyyfhp gzzgiq haahjr ibbiks jccjlt function y = allshift(x); % This function displays all of the shifts of the message x for j=0:25, ------------ ; disp(z); end function y = shift(x,b); % This function performs the shift encryption function % y = x + b mod 26 % We assume that x is a text string and b is a number % The result is kept in text representation xnum=text2int(x); -----------------------; y=int2text(ynum); function y = text2int (x) % This function takes the letter in the string x and converts % it to an integer. % The convention for this function is % a --> 0 % b --> 1 % and so on... if ( (x < 'a') | (x > 'z') ), error('Text character out of range a-z'); end; y=x - 'a'; %It helps to know Matlab tricks

杭电密码学DES密码实验介绍

课程实验报告 课程密码学实验 学院通信工程学院 专业信息安全 班级14083611 学号14084125 学生姓名刘博 实验名称DES密码实验 授课教师胡丽琴

DES密码实验 一、实验要求: 1、了解分组密码的起源与涵义。 2、掌握DES密码的加解密原理。 3、用Visual C++实现DES密码程序并输出结果。 二、实验内容: 1、1949年,Shannon发表了《保密系统的通信理论》,奠定了现代密码学的基础。他还指出混淆和扩散是设计密码体制的两种基本方法。扩散指的是让明文中的每一位影响密文中的许多位,混淆指的是将密文与密钥之间的统计关系变得尽可能复杂。而分组密码的设计基础正是扩散和混淆。在分组密码中,明文序列被分成长度为n的元组,每组分别在密钥的控制下经过一系列复杂的变换,生成长度也是n的密文元组,再通过一定的方式连接成密文序列。 2、DES是美国联邦信息处理标准(FIPS)于1977年公开的分组密码算法,它的设计基于Feistel对称网络以及精心设计的S盒,在提出前已经进行了大量的密码分析,足以保证在当时计算条件下的安全性。不过,随着计算能力的飞速发展,现如今DES已经能用密钥穷举方式破解。虽然现在主流的分组密码是AES,但DES的设计原理仍有重要参考价值。在本实验中,为简便起见,就限定DES 密码的明文、密文、密钥均为64bit,具体描述如下: 明文m是64bit序列。 初始密钥K是64 bit序列(含8个奇偶校验bit)。 子密钥K1, K2…K16均是48 bit序列。 轮变换函数f(A,J):输入A(32 bit序列), J(48 bit序列),输出32 bit序列。 密文c是64 bit序列。 1)子密钥生成: 输入初始密钥,生成16轮子密钥K1, K2 (16) 初始密钥(64bit)经过置换PC-1,去掉了8个奇偶校验位,留下56 bit,接着分成两个28 bit的分组C0与D0,再分别经过一个循环左移函数LS1,得到C1与D1,连成56 bit数据,然后经过置换PC-2,输出子密钥K1,以此类推产生K2至K16。

信息安全 实验五 古典密码算法

实验五古典密码算法 实验目的: 通过编程实现替代密码算法和置换密码算法,加深对古典密码体制的了解,为深入学习密码学奠定基础。 实验环境: 运行Windows 或Linux 操作系统的PC 机,具有gcc(Linux)、VC(Windows)等C 语言编 译环境。 实验原理: 古典密码算法曾被广泛应用,大都比较简单,使用手工和机械操作来实现加密和解密。它的主要应用对象是文字信息,利用密码算法进行文字信息的加密和解密。下面介绍两种常见的具有代表性的古典密码算法,以帮助读者对密码算法建立一个初步的印象。 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=5,则按照上式计算出来的 密文为L,计算过程如下: E(8)=(m+k) mod n=(8+5) mod 26=13=I 2. 置换密码 置换密码算法的原理是不改变明文字符,只将字符在明文中的排列顺序改变,从而实现 明文信息的加密。置换密码有时又称为换位密码。 矩阵换位法是实现置换密码的一种常用方法。它将明文中的字母按照给定的顺序安排在 一个矩阵中,然后根据密钥提供的顺序重新组合矩阵中的字母,从而形成密文。例如,明文为attack begins at five,密钥为cipher,将明文按照每行6 个字母的形式排在矩阵中,形成如 下形式: a t t a c k b e g i n s a t f i v e 根据密钥cipher 中各字母在字母表中出现的先后顺序,给定一个置换:

密码学实验报告

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

信息安全 实验一 古典密码算法C语言

信息安全实验报告 课程名称: _ 专业:计算机科学与技术 _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 #include #include #define N 500 int 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;i96&&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)

密码学实验报告AESRSA

华北电力大学 实验报告| | 实验名称现代密码学课程设计 课程名称现代密码学 | | 专业班级:学生姓名: 学号:成绩: 指导教师:实验日期:

[综合实验一] AES-128加密算法实现 一、实验目的及要求 (1)用C++实现; (2)具有16字节的加密演示; (3)完成4种工作模式下的文件加密与解密:ECB, CBC, CFB,OFB. 二、所用仪器、设备 计算机、Visual C++软件。 三. 实验原理 3.1、设计综述 AES 中的操作均是以字节作为基础的,用到的变量也都是以字节为基础。State 可以用4×4的矩阵表示。AES 算法结构对加密和解密的操作,算法由轮密钥开始,并用Nr 表示对一个数据分组加密的轮数(加密轮数与密钥长度的关系如表2所示)。AES 算法的主循环State 矩阵执行1 r N 轮迭代运算,每轮都包括所有 4个阶段的代换,分别是在规范中被称为 SubBytes(字节替换)、ShiftRows(行位移变换)、MixColumns(列混合变换) 和AddRoundKey ,(由于外部输入的加密密钥K 长度有限,所以在算法中要用一个密钥扩展程序(Keyexpansion)把外部密钥 K 扩展成更长的比特串,以生成各轮的加密和解密密钥。最后执行只包括 3个阶段 (省略 MixColumns 变换)的最后一轮运算。 表2 AES 参数 比特。

3.2、字节代替(SubBytes ) AES 定义了一个S 盒,State 中每个字节按照如下方式映射为一个新的字节:把该字节的高4位作为行值,低4位作为列值,然后取出S 盒中对应行和列的元素作为输出。例如,十六进制数{84}。对应S 盒的行是8列是4,S 盒中该位置对应的值是{5F}。 S 盒是一个由16x16字节组成的矩阵,包含了8位值所能表达的256种可能的变换。S 盒按照以下方式构造: (1) 逐行按照升序排列的字节值初始化S 盒。第一行是{00},{01},{02},…,{OF}; 第二行是{10},{l1},…,{1F}等。在行X 和列Y 的字节值是{xy}。 (2) 把S 盒中的每个字节映射为它在有限域GF(k 2)中的逆。GF 代表伽罗瓦域,GF(82) 由一组从0x00到0xff 的256个值组成,加上加法和乘法。 ) 1(] [2)2(3488++++= x x x x X Z GF 。{00}被映射为它自身{00}。 (3) 把S 盒中的每个字节记成),,,,,,,,(012345678b b b b b b b b b 。对S 盒中每个字节的每位 做如下变换: i i i i i i c b b b b b i b ⊕⊕⊕⊕⊕='++++8mod )7(8mod )6(8mod )5(8mod )4( 上式中i c 是指值为{63}字节C 第i 位,即)01100011(),,,,,,,,(012345678=c c c c c c c c c 。符号(')表示更新后的变量的值。AES 用以下的矩阵方式描述了这个变换: ?? ? ?? ? ? ? ? ? ??? ? ????????????+???????????????????????????????????????? ????????????=??????????????????????????0110001111111000011111000011111000011111100011111100011111100011111100017654321076543210b b b b b b b b b b b b b b b b 最后完成的效果如图:

密码学实验----

《密码学与信息安全》实验报告 专业 班级 姓名 学号 2015年 6 月 5 日

实验一古典密码实验 1实验目的 1.理解代替密码学加密过程 2.理解置换密码学加密过程 2实验内容 1.手动完成Caesar密码 2.Caesar加密 3.Caesar密码分析 4.单表置换密码 5.单表置换密码分析 3实验过程 本练习主机A、B为一组,C、D为一组,E、F为一组。 首先使用“快照X”恢复Windows系统环境。 1.手动完成Caesar密码 (1)在实验原理部分我们已经了解了Caesar密码的基本原理,那么请同学们写出当 密钥k=3时,对应明文:data security has evolved rapidly的密文:data security has evolved rapidly 。 (2)进入实验平台,单击工具栏中的“密码工具”按钮,启动密码工具,在向导区点 击“Caesar密码”。在明文输入区输入明文:data security has evolved rapidly。 将密钥k调节到3,查看相应的密文,并与你手动加密的密文进行比较。 请根据密钥验证密文与明文对应关系是否正确。 2.Caesar加密 (1)进入“加密解密”|“Caesar密码”视图,在明文输入区输入明文(明文应为英 文),单击“加密”按钮进行加密。 请将明文记录在这里:I am a stident 。 (2)调节密钥k的微调按钮或者对照表的移位按钮,选择合适的密钥k值,并记下该密钥k值用于同组主机的解密。加密工作完成后,单击“导出”按钮将密文默认导出到Caesar共享文件夹(D:\Work\Encryption\Caesar\)中,默认文件名为Caesar密文.txt。 (3)通知同组主机接收密文,并将密钥k通告给同组主机。 6 (4)单击“导入”按钮,进入同组主机Work\Encryption\Caesar目录(同组主机IP\Work\Encryption\Caesar),打开Caesar密文.txt。 (5)调节密钥k的微调按钮或对照表的移位按钮,将k设为同组主机加密时的密钥k 值,这时解密已经成功。请将明文写出:I am a stident 。 (6)将解密后的明文与同组主机记录的明文比较,请对比明文是否相同。 3.Caesar密码分析 (1)本机进入“密码工具”|“加密解密”|“Caesar密码”,在明文输入区输入明文(要求明文有一定的意义以便让同组主机分析)。 请将明文记录在这里:I am a stident 。 (2)调节密钥k的微调按钮或者对照表的移位按钮,选择合适的密钥k值完成Caesar 加密,单击“导出”按钮,将密文默认导出到Caesar共享文件夹中。 (3)通告同组主机(不要通告密钥值k)密文已经放在共享文件夹中,让同组主机获 取密文。 (4)单击“导入”按钮将同组主机Caesar密文导入。

实验一 古典密码-Vigernere算法实验-2017

实验一古典密码-Vigenere算法 一、实验目的 1、理解简单加密算法的原理; 2、掌握Vigenere密码的原理,完成Vigenere密码加解密程序的编写; 3、通过实验,加深对古典密码体制的了解,掌握对字符进行灵活处理的方法。 二、实验预习提示 1、多表代换密码 多表代换密码是指以一系列(两个以上)代换表一次对明文消息空间中的明文消息元素进行代换的加密方法。如果代换序列为非周期的无限序列,即对每个明文字母都采用不同的代换表(或密钥)进行加密,则相应的密码称为一次一密钥密码。 一次一密钥密码是理论上唯一不可破译的密码,可称为是无条件安全的。如果一个密码体制被称为是无条件安全的,即是指即便提供无穷的计算资源,密码分析者也无法攻破该密码体制。如果一个密码体制被称为是计算安全的,则是指密码分析者根据可利用的资源无法攻破该密码体制。 由于一次一密钥密码需要的密钥量和明文消息长度相同,因而难以广泛使用。为了减少密钥量,在实际应用中多采用周期多表代换密码,即代换表个数有限,重复地使用。典型的多表代换密码包括维吉尼亚(Vigenere)密码、博福特(Beaufort)密码、滚动密钥(running-key)密码、弗纳姆(Vernam)密码和转轮(rotor machine)密码等。 2、Vigenere密码概述 Vigenere密码译为维吉尼亚密码或维热纳尔密码,维吉尼亚密码曾多次被发明。该方法最早记录在吉奥万?巴蒂斯塔?贝拉索(Giovan Battista Bellaso)于1553年所著的书《吉奥万?巴蒂斯塔?贝拉索先生的密码》(意大利语:La cifra del. Sig. Giovan Battista Bellaso)中。然而,后来在19世纪时被误传为是法国外交官布莱斯?德?维吉尼亚(Blaise De Vigenère)所创造,因此现在被称为“维吉尼亚密码”。 3、Vigenere密码 Vigenere密码是使用一系列恺撒密码组成密码字母表的加密算法,属于多表密码的一种简单形式。在一个恺撒密码中,字母表中的每一字母都会作一定的偏移,而Vigenere密码则是由一些偏移量不同的恺撒密码组成。为了生成密码,需要使用表格法。这一表格包括了26行字母表,每一行都由前一行向左偏移一位得到,相当于将26个恺撒密表合成一个,如表 2.2.1所示。具体使用哪一行字母表进行编译是基于密钥进行的,在过程中会不断地变换。 表2.2.1 维吉尼亚密码表

古典密码实验一

一、实验名称古典密码算法 二、实验目的 通过编程实现经典的代替密码算法和置换密码,包括移位密码、维吉尼亚密码、周期置换密码、列置换密码,加深对代替技术的了解,为现代分组密码实验奠定基础。 三、实验环境(实验所使用的器件、仪器设备名称及规格) 运行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 为密文字母在字母表中对应的位置数。相应的,移位密码的解密过程可以表示为:m = (c - k) mo d n 移位密码的一个典型代表就是凯撒密码(Ceaser Cipher),它是k=3 时的移位密码。使用英文字母表的撒密码的加(解)密可以表示为:m = (c + 3) mod 26 m = (c - 3) mod 26,例如, 明文:attacks at nine am

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