信息安全 实验报告
课程名称: _ 专业:计算机科学与技术 _20xx级_02班
实验编号: 实验项目 _ 指导教师
姓名: ** 学号: *** 实验成绩:
实验名称:古典密码算法
实验类型: 设计性实验
学 时: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 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;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
根据实验原理部分对置换密码算法的介绍,自己创建明文信息,并选择一个密钥,编写置换密码算法的实现程序,实现加密和解密操作。
4.2.2
置换密码算法的原理是不改变明文字符,只将字符在明文中的排列顺序改变,从而实现明文信息的加密。置换密码有时又称为换位密码。
矩阵换位法是实现置换密码的一种常用方法。它将明文中的字母按照给的顺序安排在一个矩阵中,然后用根据密钥提供的顺序重新组合矩阵中字母,从而形成密文。
4.2.3代码
#include<stdio.h>
#include<math.h>
#include<string.h>
#define N 100
int main()
{
/*----------------------------*/
int i,j,lenK,lenM,m,n,temp;
int T[N];
char K[N],M[N],C[N],Temp1[N],Temp2[N],Temp3[N];
clrscr();
/*----------------------------*/
printf("This is a substitution cipher...\n");
printf("Please input the M::\n");/*输入明文M*/
gets(M);
printf("Please input the K::\n");/*输入密钥K*/
gets(K);
lenK=strlen(K);
lenM=strlen(M);/*测设长度*/
m=lenM/lenK;/
n=lenK;/*定义矩阵的长和宽*/
for(i=0;i<lenK;i++)/*对密钥进行数字排序*/
{
temp=0;
for(j=0;j<lenK;j++)
{
if((int)K[i]<(int)K[j])
{
temp+=1;
}
}
T[i]=lenK-temp;
printf("%d ",T[i]);/*输出各字符对应的数字顺序*/
}
/*--------------------------------*/
printf("\n\nFirst........\n\n");
for(i=0;i<m;i++)/*根据密钥将明文排列成矩阵*/
{
for(j=0;j<n;j++)
{
Temp1[i*lenK+j]=M[i*lenK+j];
printf("%c ",Temp1[i*lenK+j]);
}
printf("\n");
}
Temp1[lenM]='\0';
/*--------------------------------*/
printf("\nSecond........\n\n");/*进行第一次置换*/
for(i=0;i<lenK;i++)
{
for(j=0;j<m;j++)
{
Temp2[j*lenK+i]=Temp1[j*lenK+T[i]-1];
}
}
Temp2[lenM]='\0';
for(i=0;i<m;i++)
{
for(j=0;j<lenK;j++)
{
printf("%c ",Temp2[i*lenK+j]);
}
printf("\n");
}
/*-------------------------------*/
printf("\nThird.......\n\n");/*进行第二次置换*/
for(i=0;i<lenK;i++)
{
for(j=0;j<m;j++)
{
Temp3[j*lenK+i]=Temp2[j*lenK+T[i]-1];
}
}
Temp3[lenM]='\0';
for(i=0;i<m;i++)
{
for(j=0;j<lenK;j++)
{
printf("%c ",Temp3[i*lenK+j]);
}
printf("\n");
}
/*-----------------------------*/
printf("The substitution cipher is...\n");/*输出结果*/
for(j=0;j<lenK;j++)
{
for(i=0;i<m;i++)
{
printf("%c",Temp3[i*lenK+j]);
}
}
getch();
return 0;
}
4.2.4运行结果
5.总结
通过此次实验,对古典密码算法有了进一步的了解,同时也在过程当中学习到了如何更好的完善一个问题的求解过程。这次的实验还可以通过MATLAB来完成。在置换密码的算法中,未能完成解密算法,但是我会继续完成的。
上机实验报告(一)
实验课程:应用密码学
实验时间:20XX年9月26日
任课教师:***
班级:11级信息与计算科学专业1班
姓名:刘静**
学号:***
一、实验名称: 密码学基本算法的实现(一)
二、实验目的
学习常见的古典密码学算法,通过编程实现替代密码算法和置换密码算法,加深对古典密码体制的了解,为深入学习密码学奠定基础。
三、实验要求
1、在D盘建立一个自己的文件夹;
2、开启软件平台—Visual C++6.0,在此环境下进行编程实验;
3、将题目、你输入的命令、程序及运行结果保存在word文件中,作为作业提交;
4、若出现错误,修改、运行直到输出正确结果。
四、报告正文(文档,数据,模型,程序,图形)
1、编写程序实现仿射加密和Playfair密码。通过讨论分析单表代替密码和多表代替密码算法的功能需求,详细设计实现代替密码算法的数据结构和流程,给出测试用例和测试步骤,得出测试和结论。算法的实现程序必须提供加密和解密两个接口:int encrypt()和int decrypt()。当加密或者解密成功时返回CRYPT_OK,失败时返回CRYPT_ERROR。
/**********加密的实现**********/
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
char book[5][5]={' '}; //密码本.设为全局变量.
/******************************
*查找在密码本中的位置。
*******************************/
int findlocation(char m,int *t)
{
int i,j;
int temp; //表示行数.
for(i=0;i<5;i++)
for(j=0;j<5;j++)
if(m==book[i][j])
{
*t=j;
temp=i;
i=5; //不必再循环。
j=5;
}
return temp; //返回行数。
}
/*************************
*密码输出函数
**************************/
void out_put(int s0,int t0,int s1,int t1)
{
char c[2]={' '};
if(s0==s1) //同一行。
{
c[0]=book[s0][(t0+1)%5];
c[1]=book[s0][(t1+1)%5];
}
else if(t0==t1) //同一列.
{
c[0]=book[(s0+1)%5][t0];
c[1]=book[(s1+1)%5][t0];
}
else //不同行不同列.
{
c[0]=book[s0][t1];
c[1]=book[s1][t0];
}
printf("%c",c[0]); //输出已加密的两个字符.
printf("%c",c[1]);
}
/********************************
*对明文加密.
*********************************/
void Encrypt()
{
char m[2]={' '}; //明文数组.
char temp,ch;
char flag1,flag2; //用来标志上一轮中处理的第二个字母,提高解密精度.
int s0,t0,s1,t1,i; //两个字符的位置参数.
temp=' '; //初始化为空字符.
i=0; //控制变量.
flag1=m[1]; //初始化.
while((ch=getchar())!='\n')
{
if(ch==' ') //如果输入的是空格跳过去.
continue;
if(ch=='j') //如果输入的是j则当作i处理.
ch='i';
m[i++]=ch; //赋入数组.
if(temp!=' ') //如果上一步操作中有两个相同的字母.
{
m[1]=m[0];
m[0]=temp;
temp=' ';
i=2; //标志变量,不必再输入下一个.
}
if(i!=2) //数组赋满,则跳过.
continue;
i=0;
if(m[0]==m[1]) //如果两个字母相同,则处理成不相同的.
{
temp=m[1];
flag2='x';
while(m[1]==m[0]||m[1]==flag1)
m[1]=flag2++;
}
flag1=m[1];
s0=findlocation(m[0],&t0); //列值传递的是地址.
s1=findlocation(m[1],&t1);
m[0]=' ';
out_put(s0,t0,s1,t1); //在密码本中打印密码.
}
/*不会出现的情况是:temp!=' ' && m[0]!='\n' */
if(temp!=' '||m[0]!=' ') //此处是为了防止出现什么也没有输入的情况。
{
if(m[0]==' '&&temp!=' ') //最后刚好剩余一位.
{
m[0]=temp;
m[1]=flag2='x';
while(m[1]==m[0]||m[1]==flag1)
m[1]=flag2++;
}
if(temp==' '&&m[0]!=' ') //最后剩余一位并且上一轮中有相同的字母.
{
//m[0]=temp;
m[1]=flag2='x';
while(m[1]==m[0]||m[1]==flag1)
m[1]=flag2++;
}
s0=findlocation(m[0],&t0);
s1=findlocation(m[1],&t1);
out_put(s0,t0,s1,t1);
}
}
/*************************
*构造密码本
**************************/
void createbook()
{
char key; //key密钥
int temp[25]={' '}; //临时数组,记录密钥中出现字母的位置.
int t,flag=0; //辅助变量. flag用于定位新出现字母的位置.
/*************************************
*构造密码本.
**************************************/
for(t=0;t<25;t++) //对整型数组赋值.
temp[t]=26;
while((key=getchar())!='\n') //此处要极其注意,用换行符表示其结束.
{
if(key<'j')
t=key-'a'; //t表示字母相对于数组的位置.
if(key>'j')
t=key-'a'-1;
if(temp[t]==26) //若未出现过,则记录其位置.
temp[t]=flag++;
}
for(t=0;t<25;t++) //完善字母的顺序,并映射到密码本。
{
if(temp[t]==26) //将未出现过的字母按字母表顺序在数组中编号.
temp[t]=flag++;
if(t+'a'<'j') //按照次序将临时数组中的字母映射到密码本中.
book[temp[t]/5][temp[t]%5]=t+'a'; //处理小于i的情况。
else
book[temp[t]/5][temp[t]%5]=t+'a'+1; //处理大于j的情况。
}
for(t=0;t<25;t++) //打印。
printf("%d ",temp[t]);
printf("\n");
for(t=0;t<25;t++) //打印。
{
printf(" %c",book[t/5][t%5]);
if(!((t+1)%5))
printf("\n");
}
}
/*******************************
*主函数
********************************/
int main()
{
createbook(); //构造密码本。
Encrypt(); //进行加密。
printf("\n");
return 0;
}
/**********************
*解密
*密码本构造函数相同.
*部分不同.
***********************/
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
char book[5][5]={' '}; //密码本.设为全局变量.
/******************************
*查找在密码本中的位置。
*******************************/
int findlocation(char m,int *t)
{
int i,j;
int temp; //表示行数.
for(i=0;i<5;i++)
for(j=0;j<5;j++)
if(m==book[i][j])
{
*t=j;
temp=i;
i=5; //不必再循环。
j=5;
}
return temp; //返回行数。
}
/*************************
*密码输出函数
**************************/
void out_put(char str[1001])
{
char c[2]={' '};
char cip[1001];
int s0,t0,s1,t1;
int i,j;
i=j=0;
while(str[i]!='\0')
{
s0=findlocation(str[i++],&t0);
s1=findlocation(str[i++],&t1);
if(s0==s1) //同一行。
{
c[0]=book[s0][(t0+4)%5];
c[1]=book[s0][(t1+4)%5];
}
else if(t0==t1) //同一列.
{
c[0]=book[(s0+4)%5][t0];
c[1]=book[(s1+4)%5][t0];
}
else //不同行不同列.
{
c[0]=book[s0][t1];
c[1]=book[s1][t0];
}
cip[j++]=c[0];
cip[j++]=c[1];
}
j=strlen(str);
i=0;
while(i+2<j)
{
printf("%c",cip[i]);
if(cip[i]!=cip[i+2])
i++;
else
i+=2;
}
if(i!=j-1)
printf("%c",cip[i++]);
printf("%c\n",cip[i]);
}
/********************************
*对密文解密.
*********************************/
void Decry()
{
char str[1001];
gets(str);
if(strlen(str)%2==1)
{
printf("密文的个数不能是奇数!");
return 0;
}
else
out_put(str);
}
/*************************
*构造密码本
**************************/
void createbook()
{
char key; //key密钥
int temp[25]={' '}; //临时数组,记录密钥中出现字母的位置.
int t,flag=0; //辅助变量. flag用于定位新出现字母的位置.
/*************************************
*构造密码本.
**************************************/
for(t=0;t<25;t++) //对整型数组赋值.
temp[t]=26;
while((key=getchar())!='\n') //此处要极其注意,用换行符表示其结束.
{
if(key<'j')
t=key-'a'; //t表示字母相对于数组的位置.
if(key>'j')
t=key-'a'-1;
if(temp[t]==26) //若未出现过,则记录其位置.
temp[t]=flag++;
}
for(t=0;t<25;t++) //完善字母的顺序,并映射到密码本。
{
if(temp[t]==26) //将未出现过的字母按字母表顺序在数组中编号.
temp[t]=flag++;
if(t+'a'<'j') //按照次序将临时数组中的字母映射到密码本中.
book[temp[t]/5][temp[t]%5]=t+'a'; //处理小于i的情况。
else
book[temp[t]/5][temp[t]%5]=t+'a'+1; //处理大于j的情况。
}
for(t=0;t<25;t++) //打印。
printf("%d ",temp[t]);
printf("\n");
for(t=0;t<25;t++) //打印。
{
printf(" %c",book[t/5][t%5]);
if(!((t+1)%5))
printf("\n");
}
}
/*******************************
*主函数
********************************/
int main()
{
createbook(); //构造密码本。
Decry(); //进行加密。
printf("\n");
return 0;
}
信息安全实验报告学号学生姓名班级实验三密码学实验一古典密码算法实验一实验目的通过编程实现替代密码算法和置换密码算法加深对古典密码体…
密码学与网络安全技术课程上机报告学号119xx4339姓名许海龙班级网112班教师卫琳娜安徽工业大学密码学实验一古典密码算法实验一…
密码学实验报告学院计算机科学与技术班级学号姓名指导老师实验日志实验题目DES或AES分组密码实验目的熟悉分组密码加解密算法的基本原…
密码学实验报告实验一DES加密算法实验一实验目的理解对称加解密算法的原理和特点理解DES算法的加解密原理二实验背景DES算法为密码…
江苏大学学院专业姓名学号计算机学院信息安全09023090604035小组成员AES对称加密算法实现一AES对称加密算法实现原理A…
信息安全实验报告学号学生姓名班级实验三密码学实验一古典密码算法实验一实验目的通过编程实现替代密码算法和置换密码算法加深对古典密码体…
密码学实验报告实验一DES加密算法实验一实验目的理解对称加解密算法的原理和特点理解DES算法的加解密原理二实验背景DES算法为密码…
密码学与网络安全技术课程上机报告学号119xx4339姓名许海龙班级网112班教师卫琳娜安徽工业大学密码学实验一古典密码算法实验一…
哈尔滨工程大学实验报告实验名称RC4加密班级学号姓名实验时间20xx615成绩指导教师实验室名称哈尔滨工程大学实验室与资产管理处制…
网络与信息安全IntroductiontoNetworkandSecurityDES加密解密算法的C实现姓名学号学院20xx年10…