c语言维吉尼亚密码实验报告,维吉尼亚密码的C语言实现.doc

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)//随机生成

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值