维吉尼亚c语言编码原理,维吉尼亚密码的C语言实现

本文介绍了一次关于古典密码体制的实践与分析实验,重点介绍了维吉尼亚密码的加解密算法、重合指数计算及Kasiski's计算方法,并通过C语言实现了这些算法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

41528d3028836879cd698677c3999917.gif维吉尼亚密码的C语言实现

2016春 密码学原理 软件学院 密码学原理作业报告 作业1:古典密码体制的实践与分析 姓名 查志华 院系 软件学院 学号 1133710313 任课教师 刘绍辉 指导教师 刘绍辉 实验地点 哈尔滨工业大学 实验时间 2016.3.15-2016.3.18 一、实验目的 要求:综述本次实验的基本目的。 1.了解古典密码的基本体制,掌握维吉尼亚密码的加解密方式,能对文件进行加解密。 2. 掌握重合指数的计算方法,了解掌握Kasiski’s 的计算方法,能对明文以及密文进行重合指数的计算以及Kasiski’s 计算方法; 二、实验内容 要求:对如下内容进行详细描述。 1. 弗吉尼亚密码加密解密算法; 明文 =(密文-密钥+26)/26; 密文 = (明文+密钥)/26; 具体实现见下代码。 2. 重合指数计算算法; 先统计出各个字母出现的频数,f(a),f(b),……,f(z) f(a)+f(b)+……+f(z)=X (X就是密文长度),然后把所有的 f(字母)*(f(字母)-1) 的和求出来,假设为sum ,sum/(X*(X-1))就是重合指数 具体实现见下代码。 3. Kasiski’s 计算方法; 1 在密文中标出重复的三个或多个字符结构; 2 对每一个字符结构,记下结构的起始位置; 3 计算相邻的起始点的距离; 4 对每个距离求出所有因数; 5 若使用多字母替换密码,则密钥的长度为步骤4种出现的某一因数; 三、实验结果及分析 要求:将实验获得的结果进行描述,涉及不同的密钥以及密钥长度,不同密文长度情况下的Kasiski分析及重合指数分析得出的结果。 选择文件进行操作,对于不同的密钥以及不同长度的密钥,情况如下: (文件选取为英文原著阿兹卡班的囚徒1.txt,大小为21K) 各字符频率统计: l 密钥长度为4时,即n=4时: l 密钥长度为16时,即n=16时: 重合指数计算: l n=1时: l n=2时: l n=4时: l n=8时: l n=16时: l n=32时: l n=64时: l n=128时: l n=256时: l 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“, if(select ==1)//加密操作 { printf(“请输入密钥长度\n“); scanf(“%d“, 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)//随机生成密钥 { number= rand() % 26; //产生0-25的随机数 key1[i] = alp[number]; len --; i++; } printf(“随机生成的密钥为:“); while(len1>0)//打印密钥 { printf(“%c“,key1[j]); j++; len1--; } printf(“\n“); int L=strlen(key1); FILE *fp,*fp1; int num1[26]; int num2[26]; int m=0; for(m=0; m= a num1[al]++; fprintf(fp1,“%c“,(ch+key1[j%L]- A - A )%26+ A ); bl=(int)((ch+key1[j%L]- A - A )%26); num2[bl]++; j++; } else { al=(int)(ch- a ); num1[al]++; fprintf(fp1,“%c“,(ch+key1[j%L]- A - a )%26+ A ); bl=(int)((ch+key1[j%L]- A - a )%26); //printf(“%d “,bl); num2[bl]++; j++; } } fscanf(fp,“%c“, } printf(“加密结果请查看文档!\n“); // printf(“%d\n“,j); fclose(fp1); fclose(fp); //统计明文密文中各字符的频率 printf(“明文中各字符的频率(a-z):“); for(m=0; m<26; m++) { printf(“%.3f%% “,(float)num1[m]/j*100); if((m%5)==0) { printf(“\n“); } } printf(“密文中各字符出现的频率(a-z):“); for(m=0; m<26; m++) { printf(“%.3f%% “,(float)num2[m]/j*100); if((m%5)==0) { printf(“\n“); } } //计算重合指数 int sum =0; int sum1=0; for(m=0; m<26; m++) { sum=sum+num1[m]*(num1[m]-1); } for(m=0; m= A j++; } fscanf(fp,“%c“, } printf(“解密结果请查看文档!\n“); fclose(fp1); fclose(fp); } } 四、实验成绩(共5分) 程序设计成绩(1分) 实验结果成绩(2分) 实验报告成绩(2分) 总成绩 指导教师签字 日期

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值