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

古典密码实验报告

哈尔滨工程大学

实验报告

实验名称:古典密码算法

班级:

学号:

姓名:

实验时间:2014年4月

成绩:

指导教师:

实验室名称:

哈尔滨工程大学实验室与资产管理处制

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

二、实验目的

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

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

运行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) 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…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(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)

{

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)

实验二 古典密码

实验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“.

实验报告_密码学

信息安全实验报告 学号: 学生姓名: 班级:

实验三密码学实验 一、古典密码算法实验 一、实验目的 通过编程实现替代密码算法和置换密码算法,加深对古典密码体制的了解,为深入学习密码学奠定基础。 二、编译环境 运行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=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 a t f i v e 根据密钥cipher中各字母在字母表中出现的先后顺序,给定一个置换: 1 2 3 4 5 6 f = 1 4 5 3 2 6 根据上面的置换,将原有矩阵中的字母按照第 1 列,第 4 列,第 5 列,第 3 列, 第2列,第 6 列的顺序排列,则有下面形式: a a c t t k b i n g e s a I v f t e 从而得到密文:abatgftetcnvaiikse 其解密的过程是根据密钥的字母数作为列数,将密文按照列、行的顺序写出,再根据由密钥给出的矩阵置换产生新的矩阵,从而恢复明文。 四、实验内容和步骤 1、根据实验原理部分对替代密码算法的介绍,自己创建明文信息,并选择 一个密钥k,编写替代密码算法的实现程序,实现加密和解密操作。 2、根据实验原理部分对置换密码算法的介绍,自己创建明文信息,并选择一个密钥,编写置换密码算法的实现程序,实现加密和解密操作。 五、总结与思考 记录程序调试过程中出现的问题,分析其原因并找出解决方法。记录最终实现的程序执行结果。

密码学报告

实验一 古典密码(认识密码学) 一、实验目的 通过实现简单的古典密码算法,理解密码学的相关概念如明文(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 a c 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为: 三、实验结果及分析 运行结果: 明文: 密文: 解密:

古典密码的实验报告

古典密码的实验报告 古典密码的实验报告 引言: 密码学作为一门古老而又神秘的学科,一直以来都吸引着人们的兴趣。在古代,人们用各种各样的密码来保护重要信息的安全性。本实验旨在通过实际操作, 探索古典密码的加密原理和破解方法,从而深入了解密码学的基本概念和应用。 一、凯撒密码 凯撒密码,又称移位密码,是最简单的一种古典密码。其原理是通过将明文中 的每个字母按照一定的规则进行移位,得到密文。在本实验中,我们选择了一 个简单的凯撒密码进行破解。 首先,我们选择了一段明文:“HELLO WORLD”,并将其按照凯撒密码的规则进 行移位,假设移位数为3,则得到密文:“KHOOR ZRUOG”。接下来,我们尝试 使用暴力破解的方法来还原明文。 通过尝试不同的移位数,我们发现当移位数为3时,得到的明文与原文完全一致。这表明我们成功地破解了凯撒密码,并还原了原始的明文。 二、维吉尼亚密码 维吉尼亚密码是一种基于多个凯撒密码组合而成的密码算法。其原理是通过使 用不同的移位数对明文进行加密,从而增加了密码的复杂度。 在本实验中,我们选择了一段明文:“CRYPTOGRAPHY”,并使用维吉尼亚密码 进行加密。我们选择了一个关键词“KEY”作为加密密钥。首先,我们将关键词“KEY”重复至与明文长度相同,得到“KEYKEYKEYKEYK”。然后,将明文中的每个 字母与关键词中对应位置的字母进行凯撒密码的移位操作。

经过加密后,我们得到了密文:“LXFOPVEFRNHR”。接下来,我们尝试使用破 解方法来还原明文。 通过尝试不同的关键词和移位数的组合,我们发现当关键词为“KEY”且移位数为 3时,得到的明文与原文完全一致。这表明我们成功地破解了维吉尼亚密码, 并还原了原始的明文。 三、栅栏密码 栅栏密码是一种基于换位操作的密码算法。其原理是通过将明文中的字母按照 一定的规则进行重新排列,得到密文。 在本实验中,我们选择了一段明文:“HELLO WORLD”,并使用栅栏密码进行加密。我们选择了栅栏的高度为3。首先,我们将明文按照栅栏的高度进行分组,得到: H O L W R D E L O L 然后,将每一列的字母按照从上到下的顺序排列,得到密文:“HOWELRDLO”。接下来,我们尝试使用破解方法来还原明文。 通过尝试不同的栅栏高度,我们发现当栅栏高度为3时,得到的明文与原文完 全一致。这表明我们成功地破解了栅栏密码,并还原了原始的明文。 结论: 通过本次实验,我们深入了解了古典密码的加密原理和破解方法。凯撒密码、 维吉尼亚密码和栅栏密码都是古典密码中常见且简单的加密算法。然而,随着 现代密码学的发展,这些古典密码已经不再安全可靠。在实际应用中,我们需 要使用更加复杂和安全的现代密码算法来保护重要信息的安全性。

古典密码实验报告

哈尔滨工程大学 实验报告 实验名称:古典密码算法 班级: 学号: 姓名: 实验时间:2014年4月 成绩: 指导教师: 实验室名称: 哈尔滨工程大学实验室与资产管理处制

一、实验名称古典密码算法 二、实验目的 通过编程实现经典的代替密码算法和置换密码,包括移位密码、维吉尼亚密码、周期置换密码、列置换密码,加深对代替技术的了解,为现代分组密码实验奠定基础。 三、实验环境(实验所使用的器件、仪器设备名称及规格) 运行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 为密文字母在字母表中对应的位置数。相应的,移位密码的解密过程可以

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

实验一古典密码-Vigernere算法实验-2022 一、实验目的 1、理解简单加密算法的原理; 2、掌握Vigenere密码的原理,完成Vigenere密码加解密程序的编写; 3、通过实验,加深对古典密码体制的了解,掌握对字符进行灵活处 理的方法。二、实验预习提示 1、多表代换密码 多表代换密码是指以一系列(两个以上)代换表一次对明文消息空间 中的明文消息元素进行代换的加密方法。如果代换序列为非周期的无限序列,即对每个明文字母都采用不同的代换表(或密钥)进行加密,则相应 的密码称为一次一密钥密码。 一次一密钥密码是理论上唯一不可破译的密码,可称为是无条件安全的。如果一个密码体制被称为是无条件安全的,即是指即便提供无穷的计 算资源,密码分析者也无法攻破该密码体制。如果一个密码体制被称为是 计算安全的,则是指密码分析者根据可利用的资源无法攻破该密码体制。 由于一次一密钥密码需要的密钥量和明文消息长度相同,因而难以广 泛使用。为了减少密钥量,在实际应用中多采用周期多表代换密码,即代 换表个数有限,重复地使用。典型的多表代换密码包括维吉尼亚(Vigenere)密码、博福特(Beaufort)密码、滚动密钥(running-key)密码、弗纳姆(Vernam)密码和转轮(rotormachine)密码等。 2、Vigenere密码概述

Vigenere密码译为维吉尼亚密码或维热纳尔密码,维吉尼亚密码曾 多次被发明。该方法最早记录在吉奥万巴蒂斯塔贝拉索(GiovanBattitaBellao)于1553年所著的书《吉奥万巴蒂斯塔贝拉索先 生的密码》(意大利语:Lacifradel.Sig.GiovanBattitaBellao)中。然而,后来在19世纪时被误传为是法国外交官布莱斯德维吉尼亚(BlaieDeVigenère)所创造,因此现在被称为“维吉尼亚密码”。 3、Vigenere密码 Vigenere密码是使用一系列恺撒密码组成密码字母表的加密算法, 属于多表密码的一种简单形式。在一个恺撒密码中,字母表中的每一字母 都会作一定的偏移,而Vigenere密码则是由一些偏移量不同的恺撒密码 组成。为了生成密码,需要使用表格法。这一表格包括了26行字母表, 每一行都由前一行向左偏移一位得到,相当于将26个恺撒密表合成一个,如表2.2.1所示。具体使用哪一行字母表进行编译是基于密钥进行的,在 过程中会不断地变换。 表2.2.1维吉尼亚密码表 例如,假设明文为:ATTACKATDAWN 选择某一关键词并重复而得到密钥,如关键词为LEMON时,密钥为:LEMONLEMONLE 对于明文的第一个字母A,对应密钥的第一个字母L,于是使用表格 中L行字母表进行加密,得到密文第一个字母L。类似地,明文第二个字 母为T,在表格中使用对应的E行进行加密,得到密文第二个字母某。以 此类推,可以得到: 明文:ATTACKATDAWN密钥:LEMONLEMONLE密文:L某FOPVEFRNHR

密码学实验报告

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

密码学实验1古典密码算法

密码学实验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 a t f i v e 根据密钥 cipher中各字母在字母表中出现的先后顺序,给定一个置换: 1 2 3 4 5 6 f = 1 4 5 3 2 6 3 列,根据上面的置换,将原有矩阵中的字母按照第 1 列,第 4 列,第 5 列,第第 2列,第 6 列的顺序排列,则有下面形式: a a c t t k b i n g e s a I v f t e 从而得到密文:abatgftetcnvaiikse 其解密的过程是根据密钥的字母数作为列数,将密文按照列、行的顺序写出,再根据由密钥给出的矩阵置换产生新的矩阵,从而恢复明文。二(实验目的通过编程实现替代密码算法和置换密码算法,加深对古典密码体制的了解,为深入学习密码学奠定基础。 三(实验环境 运行 windows 或 linux 操作系统的 PC 机,具有 gcc(linux)、VC(windows)等 C语言编译环境。

数学建模实验报告古典密码与破译

古典密码与破译 一、实验目的及意义 本实验主要涉及代数,利用模运算意义下的矩阵乘法、求逆矩阵、线性无关、线性空间与线性变换等概念和运算,学习古典密码体制的加密、解密和破译过程. 二、实验内容 1.Hill2加密; 2.Hill2解密。 三、实验步骤 1. 开启软件平台——MA TLAB,开启MA TLAB编辑窗口; 2. 根据加密解密算法步骤编写M文件 1.保存文件并运行; 2.观察运行结果(数值或图形); 3.根据观察到的结果和体会写出实验报告。 四、实验要求与任务 根据实验内容和步骤,完成以下实验,要求写出实验报告。 1. 实际问题(甲) 的修正:按照甲方与乙方的约定,他们之间的密文通信采 用Hill2 密码,密钥为二阶矩阵 12 04 A ?? = ? ?? 且汉语拼音的26 个字母以及空格(字 母A~Z 的表值为1~26,空格的表值为0)与0~26 之间的整数建立一一对应的关系,称之为字母的表值,试修正表1、表2 以及附录中的程序,以给出模27 意义下矩阵可逆的判别方法和具体求法. 2. 若将你姓名的拼音作为明文,例如:赵本山(ZHAO BEN SHAN,含空格),密钥等参见练习1,求其在模27 意义下的Hill2密文. 3. 若将你姓名的拼音作为Hill2密文,例如:赵本山(ZHAO BEN SHAN,含空格),密钥等参见练习1,求其在模27 意义下的明文. 五. 程序代码及运行结果(经调试后正确的源程序) 1.实际问题(甲) 的修正:按照甲方与乙方的约定,他们之间的密文通信采 用Hill2 密码,密钥为二阶矩阵 12 04 A ?? = ? ?? 且汉语拼音的26 个字母以及空格(字 wilyes11收集博客(与学习无关):https://www.doczj.com/doc/3c19207185.html,/u/1810231802

古典密码算法实验原理

一.Kaiser(恺撒)密码 Kaiser密码是传统的代替加密法,当没有发生加密(即没有发生移位)之前,其置换表如1-1-1所示。 表1-1-1 加密时每一个字母向前推移k位,例如k=5,置换表如1-1-2所示。 表1-1-2 于是对明文:data security has evolved rapidly 可以得到密文:IFYF XJHZWNYD MFX JATQAJI WFUNIQD 若令26个字母分别对应整数 0 ~ 25,如表 1-1-3所示。 表1-1-3

则Kaiser加密变换实际上是 c = (m + k) mo d 26 其中m是明文对应的数据,c是与明文对应的密文数据,k是加密用的参数,也称为密钥。 很容易得到相应的Kaiser解密变换是: m = D(c) = (c – k) mod 26 例如明文:data security 对应的数据序列: 3 0 19 0 18 4 2 20 17 8 19 24 k = 5 时得到密文序列: 8 5 24 5 23 9 7 25 22 13 24 3 对应的密文为: I F Y F X J H Z W N Y D 二.单表置换密码 单表置换密码也是一种传统的代替密码算法,在算法中维护着一个置换表,这个置换表记录了明文和密文的对照关系。当没有发生加密(即没有发生置换)之前,其置换表如 1-1-4所示。 表1-1-4 在单表置换算法中,密钥是由一组英文字符和空格组成的,称之为密钥词组,例如当输入密钥词组:I LOVE MY COUNTRY后,对应的置换表如表 1-1-5所示。

表1-1-5 在表1-1-5中 ILOVEMYCUNTR 是密钥词组 LOVE MY COUNTRY 略去前面已出现过的字符O和Y依次写下的。后面ABD……WXZ则是密钥词组中未出现的字母按照英文字母表顺序排列成的,密钥词组可作为密码的标志,记住这个密钥词组就能掌握字母加密置换的全过程。 这样对于明文:data security has evolved rapidly,按照表1-1-5的置换关系,就可以得到密文:VIKI JEOPHUKX CIJ EQDRQEV HIFUVRX。

古典密码学实验

一、实验背景与目的 通过实现简单的古典密码算法,理解密码学的相关概念如明文(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元有限域上选取个变量以及个变量。构造方程组:这里面公钥信息方程组就是:其中是明文信息,而则是密文。可以看出这样的公钥信息很容易受到插值法的攻击,下面使用仿射将

古典密码实验报告

古典密码实验报告 古典密码实验报告 一、引言 密码学作为一门古老而又神秘的学科,一直以来都吸引着人们的兴趣。在古代,人们为了保护重要信息的安全,发明了各种各样的古典密码。本实验旨在通过 实际操作,了解并研究几种古典密码的原理和加密解密过程。 二、凯撒密码 凯撒密码是最简单的一种古典密码,它的原理是通过将明文中的每个字母按照 一定的偏移量进行替换,从而得到密文。在实验中,我们选择了一个简短的明 文“HELLO”,并将其加密成了密文“KHOOR”。 通过对比明文和密文,我们可以发现,凯撒密码的加密过程非常简单,只需要 将明文中的每个字母按照一定的偏移量进行替换即可。然而,凯撒密码的安全 性非常低,因为偏移量很容易被破解。 三、维吉尼亚密码 维吉尼亚密码是一种基于凯撒密码的改进密码,它引入了一个密钥序列,通过 不同的偏移量来加密明文。在实验中,我们选择了一个较长的明文“CRYPTOGRAPHY”,并使用密钥序列“KEY”进行加密。 维吉尼亚密码的加密过程相对复杂一些,需要根据密钥序列的长度,对明文中 的每个字母选择不同的偏移量进行替换。通过使用密钥序列“KEY”,我们将明文“CRYPTOGRAPHY”加密成了密文“DWUMQVQWUH”. 维吉尼亚密码相较于凯撒密码,提高了加密的复杂度和安全性。然而,它的密 钥序列仍然可能被破解,因此在实际应用中需要更复杂的密码算法。

四、栅栏密码 栅栏密码是一种将明文按照一定规则排列后再读取的密码算法。在实验中,我们选择了一个较短的明文“HELLO WORLD”,并使用栅栏数为3进行加密。 栅栏密码的加密过程非常简单,只需要将明文按照栅栏数进行排列,然后按照从上到下、从左到右的顺序读取即可。通过使用栅栏数为3,我们将明文“HELLO WORLD”加密成了密文“HWEOLLLROD”. 栅栏密码的加密过程简单快捷,但是它的安全性也很低。由于栅栏数有限,密文很容易被破解。 五、结论 通过本次实验,我们对凯撒密码、维吉尼亚密码和栅栏密码进行了实际操作和研究。这些古典密码虽然简单易懂,但是安全性较低,容易被破解。 在现代密码学中,人们已经发展出了更加复杂和安全的密码算法,如DES、AES 等。这些密码算法通过引入更多的数学原理和计算复杂度,提高了密码的安全性。 然而,随着计算机技术的发展和量子计算的崛起,传统的密码算法也面临着新的挑战。因此,我们需要不断研究和发展更加安全的密码算法,以应对未来的密码攻击。

古典密码的实验报告

古典密码的实验报告 1. 引言 古典密码是一种古老的加密技术,用于在信息传递过程中保护敏感信息的安全性。它通过将明文转换成密文,从而使未经授权的个体无法理解信息的内容。本实验旨在介绍几种常见的古典密码算法,并通过实验验证其加密和解密的过程。 2. 凯撒密码 凯撒密码是最简单的古典密码之一,它通过将明文中的每个字母向前或向后移动固定的位置来加密信息。例如,当移动的位置为3时,明文中的字母A将被替换为D,字母B将被替换为E,以此类推。 2.1 加密过程 1.输入明文。 2.设置移动的位置。 3.对于明文中的每个字母,按照移动的位置将其替换为对应的字母。 4.得到密文。 2.2 解密过程 1.输入密文。 2.设置移动的位置。 3.对于密文中的每个字母,按照移动的位置将其替换为对应的字母。 4.得到明文。 3. 维吉尼亚密码 维吉尼亚密码是一种多表密码,它通过使用一系列凯撒密码表来加密信息。每个表中的移动位置逐个递增,这样可以更好地混淆明文的结构。 3.1 加密过程 1.输入明文。 2.输入密钥。 3.对于明文中的每个字母,找到对应的凯撒密码表。 4.根据对应的表和密钥,将明文中的字母替换为密文。 5.得到密文。

3.2 解密过程 1.输入密文。 2.输入密钥。 3.对于密文中的每个字母,找到对应的凯撒密码表。 4.根据对应的表和密钥,将密文中的字母替换为明文。 5.得到明文。 4. 培根密码 培根密码是古典密码中的另一种类型,它使用一系列相同长度的字母组成的密钥来加密信息。明文中的每个字母都将被替换为对应密钥中的字母。 4.1 加密过程 1.输入明文。 2.输入密钥。 3.对于明文中的每个字母,将其对应到密钥中的相应字母。 4.得到密文。 4.2 解密过程 1.输入密文。 2.输入密钥。 3.对于密文中的每个字母,将其对应到密钥中的相应字母。 4.得到明文。 5. 实验结果与讨论 在本实验中,我们使用了凯撒密码、维吉尼亚密码和培根密码进行加密和解密实验。通过对不同算法的测试,我们发现: 1.凯撒密码是最简单的古典密码之一,但由于移动位置的确定性,易受 到频率分析等攻击方式的威胁。 2.维吉尼亚密码通过使用多个凯撒密码表,增加了加密的复杂性,使得 破解变得更加困难。 3.培根密码使用一系列字母组成的密钥,对明文进行替换。它的安全性 依赖于密钥的保密性,但一旦密钥泄露,密码就会立即失效。 在实际应用中,古典密码由于其简单性和易于理解的特点,已经不再被广泛使用。相比之下,现代密码算法(如AES,RSA等)具有更高的安全性和更复杂的加

实验一-古典密码—单表代换

实验一古典密码—单表代换 【实验目的】 理解代换密码的基本思想 理解移位密码、仿射密码等算法的原理 掌握上述各个算法的输入输出格式和密钥格式 掌握上述各个算法的加解密过程和实现方法 【实验原理】 代换密码体制的一般定义为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的整数。 二、乘法密码 乘法密码是通过对字母等间隔抽取以获得密文,其加解密可分别表示如下: -1 c=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-3 (二) 解密 (1) 在密文栏相应的文本框内输入所要解密的密文,在密钥栏输入相应的密钥,如图1.1-4 所示。 图1.1-4

密码学实验1

实验1-1 古典密码算法 一.实验原理 1.替换密码 替换密码算法的原理是使用替换法进行加密,就是将明文中的字符用其他字符替代后形成的密文。例如:名文字母a、b、c、d用D、E、F、G作对应替换后形成密文。 例如:对于明文字母H,其在字母表中的位置数位8,设k=4,则按照上式计算出来的密文为L。 2.置换密码 置换密码算法的原理是不改变明文字符,只将字符在明文中的字母按照给的顺序改变,从而实现明文信息的加密。置换密码有时候也称为换位密码。 例如:明文为attack begin five,密钥为cipher,将明文按照每行6列的形式排在矩阵中,形成如下形式: a t t a c k b e g i n s a t f I v e 根据密钥cipher中的各字母在字母表中出现的先后顺序,给定一个置换: F=(1 4 5 3 2 6) 根据上面的置换,将原有矩阵中的字母按照第一列、第四列、第五列、第三列、第二列、第六列的顺序排列,则有下列形式: a a c t t k

b i n g e s a i v f f e 从而得到密文:abaaiicnvtgftefkse 其解密的过程是根据密钥的字母数作为列数,将密文按照列、行的顺序写出,再根据由密钥给出的矩阵置换产生新的矩阵,从而恢复明文。 二实验目的 通过编程实现替换密码算法和置换密码算法,加深对古典密码体制的了解,为深入学习密码学奠定基础。 三.实验环境 运行windows或Linux操作系统的pc机,具有vc等c语言编译环境。 四.实验内容 1.根据实验原理部分对替换密码算法的介绍,自己创建明文信息,并选择一个密钥k,编写替换密码算法的实现程序,实现加密和解密操作。 2.根据实验原理部分对置换密码算法的介绍,自己创建明文信息,并选择一个密钥k,编写替换密码算法的实现程序,实现加密和解密操作。 五实验步骤 1.替换密码 其中明文为h,加密参数k=4,字母的个数n=26。实现环境为turboC (1)代码如下:

信息安全古典密码之凯撒密码

《网络攻击与防御》 实验报告 课程名称:信息安全技术 实验名称:古典密码之凯撒密码 指导教师: 学生姓名: 组号: 实验日期: 实验地点: 实验成绩:一 计算机科学与技术学院 计算机系网络教研室制

一、实验目的 (1)编程实现凯撒加密、解密算法,理解密码学基础知识,初步建立密码学思维方式。 (2)通过不断增加凯撒解密难度,理解唯密文解密,提高解密性能。 实验环境操作系统:Windows 10操作系统 软件工具:C++语言编译环境三、实验内容与实验要求 (1)在允许输入密码条件下,编程实现凯撒密码加解密解密。要求: ①从一文本文件读入英文文章(明文或密文)。 ②对读入内容加密或解密后写入另一文本文件。 (2)在不允许输入密码条件下,编程实现解密凯撒密码加密密文。要求绘制三种情况下解密程序流程图,说明不同解密程序存在的不足。程序需要计算、显示解密使用时间(单位:ms) o ①已知cl =wk 1 v lv d errn,求pl。(初级解密) 问:两次使用凯撒,能否正确解密?(字符串用凯撒加密后的结果再用凯撒加密一次。) ②已知cl =go kbo cdenoxdc, 或cl =zh duh vwxghqwv, 求pl。(中级解密) ③已知cl =rxwvlgh wkh eleoh, wkhvh via zrugv duh wkh prvw idprxv Iq doo wkh olwhudwxuh ri wkh zruog. wkhb zhuh vsrnhq eb kdpohw zkhq kh zdv wklqnlqj dorxg, dqg wkhb duh wkh prvw idprxv zrugv Iq vkdnhvshduh ehfdxvh kdpohw zdv vshdnlqj qrw rqob iru klpvhoi exw dovr iru hyhub wklqnlqj pdq dqg zrpdq. wr eh ru qrw wr eh, wr olyh ru qrw wr olyh, wr olyh ulfkob dqg dexqgdqwob dqg hdjhuob, ru wr olyh gxoob dqg phdqob dqg vfdufhob. d sklorvrskhu rqfh zdqwhg wr nqrz zkhwkhu kh zdv dolyh ru qrw, zklfk lv d jrrg txhvwlrq iru hyhubrqh wr sxw wr klpvhoi rffdvlrqdoob. kh dqvzhuhg Iw eb vdblqj: 〃1 wklqn, wkhuhiruh dp. 〃,求pl。(高级解密)对给定较长密文文件进行解密测试,测试结果填入表。 要求密文的内容不少于1000个英文单词,使用凯撒密码加密,加密密码保密。正确率二正确单词数/单词总数,智能程度:优秀(解密结果正确与否不需要人工判断)、一般。 表 四、实验过程与分析 (1)在允许输入密码条件下的实验结果。

古典密码实验报告

实验报告 一、实验室名称: SimpleSPC信息安全云实验系统 二、实验项目名称: 古典密码——置换密码 三、实验学时: 1学时 四、实验原理: 1) 算法原理 a) 置换密码算法就是不改变明文字符,而就是按照某一规则重新排列消息中的比特或字符顺序,才而实现明文信息的加密。将明文中的字母按照给定的顺序安排在一个矩阵中,然后用根据密钥提供的顺序重新组合矩阵中的字母,从而形成密文。其解密过程就是根据密钥的字母数作为列数,将密文按照列、行的顺序写出,再根据密钥给出的矩阵置换产生新的矩阵,从而恢复明文。 b) 置换密码(Permutation Cipher),又称换位密码。算法实施时,明文的字母保持相同,但顺序会被打乱。置换只不过就是一个简单的换位,每个置换都可以用一个置换矩阵Ek来表示。每个置换都有一个与之对应的逆置换Dk。置换密码的特点就是仅有一个发送方与接受方知道的加密置换(用于加密)及对应的逆置换(用于解密)。它就是对明文L长字母组中的字母位置进行重新排列,而每个字母本身并不改变。 c) 设n为一固定整数,P、C与K分别为明文空间、密文空间与密钥空间。明/密文就是长度为n的字符序列,分别记为X(x1,x2,…,xn)属于P与Y(y1,y2,…,yn)属于C ,K就是定义在{1,2,…,n}的所有置换组成的集合。对任何一个密钥(即一个置换),定义置换如下: 加密置换为: 解密置换为: 上式中,就是的逆置换,密钥空间K的大小为n! 2) 算法参数 置换密码算法主要有c、m、k、n四个参数。c为密文,m就是明文,k为密钥,n 为模数。 3) 算法流程 算法流程。如图所示

实验1-古典密码算法

实验1-古典密码算法

实验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 26 2、置换密码 置换密码算法的原理是不改变明文字符,只将字符在明文中的排列顺序改变,从而实现明文信息的加密。置换密码又称为换位密码。 矩阵换位法是实现置换密码的一种常用方法。它将明文中的字母按照给定的顺序安排在一个矩阵中,然后又根据密钥提供的顺序重新组合矩阵中的字母,从而形成密文。例如,明文为attack begins at five ,密钥为 cipher ,将明文按照每行6个字母的形式排在矩阵中,形成如下形式: a t t a c k b e g i n s

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