2016春 密码学原理 软件学院
密码学原理作业报告
作业1:古典密码体制的实践与分析
姓名查志华院系软件学院学号1133710313任课教师刘绍辉指导教师刘绍辉实验地点哈尔滨工业大学实验时间2016.3.15-2016.3.18一、实验目的要求:综述本次实验的基本目的。
1.了解古典密码的基本体制,掌握维吉尼亚密码的加解密方式,能对文件进行加解密。
2. 掌握重合指数的计算方法,了解掌握Kasiski’s 的计算方法,能对明文以及密文进行重合指数的计算以及Kasiski’s 计算方法;
二、实验内容要求:对如下内容进行详细描述。
弗吉尼亚密码加密解密算法;
明文 =(密文-密钥+26)/26;
密文 = (明文+密钥)/26;
具体实现见下代码。
重合指数计算算法;
先统计出各个字母出现的频数,f(a),f(b),……,f(z)f(a)+f(b)+……+f(z)=X (X就是密文长度),然后把所有的 f(字母)*(f(字母)-1) 的和求出来,假设为sum ,sum/(X*(X-1))就是重合指数
具体实现见下代码。
Kasiski’s 计算方法;
在密文中标出重复的三个或多个字符结构;
对每一个字符结构,记下结构的起始位置;
计算相邻的起始点的距离;
对每个距离求出所有因数;
若使用多字母替换密码,则密钥的长度为步骤4种出现的某一因数;
三、实验结果及分析要求:将实验获得的结果进行描述,涉及不同的密钥以及密钥长度,不同密文长度情况下的Kasiski分析及重合指数分析得出的结果。
选择文件进行操作,对于不同的密钥以及不同长度的密钥,情况如下:
(文件选取为英文原著阿兹卡班的囚徒1.txt,大小为21K)
各字符频率统计:
密钥长度为4时,即n=4时:
密钥长度为16时,即n=16时:
重合指数计算:
n=1时:
n=2时:
n=4时:
n=8时:
n=16时:
n=32时:
n=64时:
n=128时:
n=256时:
n=9000时:
结论:当密钥的长度足够大时,发现密文的重合指数会趋向于3.84%,也就是1/26。
代码如下:
#include
#include
#include
#include
#include
void Genkey(int len);
void DenKey();
int main()
{
int len = 0;
int select =0;
while(1)
{
printf("请选择操作:加密(1);解密(2):退出(3)\n");
scanf("%d",&select);
if(select ==1)//加密操作
{
printf("请输入密钥长度\n");
scanf("%d",&len);
Genkey(len);
}
else if(select ==2)//解密操作
{
DenKey();
}
else if(select ==3)
{
exit(0);
}
else
{
printf("输入有误!\n");
}
}
return 0;
}
void Genkey(int len)
{
srand((unsigned) time(NULL)); //用时间做种,每次产生随机数不一样
int number=0,i=0,j=0,len1;
len1=len;
char ch;
char key1[10000]= "";
char alp[26] = {'A','B','C','D','E','F','G',
'H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'
};
while(len >0)//随机生成