栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C:Vigenere维吉尼亚密码的加解密

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C:Vigenere维吉尼亚密码的加解密

关于维吉尼亚密码
实质上就是分组然后分别用不同密钥凯撒加密
详情参考百度百科-维吉尼亚密码

维吉尼亚密码的加密

加密原理:分组凯撒加密(度娘欢迎您
输入明文不带空格,原因参考本文结尾缺点第4条

#include
#include
int main()
{
	char m[500],c[500],k[20];  //明密文、密钥长度(可调
	int i=0,key[20],keylen;  //密钥对应十进制数,a为0
	printf("明文m:");
	scanf("%s",m);
	printf("密钥k:");
	scanf("%s",k);
	while(k[i]!='')
	{
		key[i]=k[i]-'a';
		i++;
	}
	keylen=i;
	printf("密文c:");
	for(i=0;i 

一看就很简单哈

维吉尼亚密码的破解 破解原理

比jio暴力
先利用重合指数法(在英文文本中,找到两个等同字母发生的概率约为0.065)猜测出密钥长度,再通过计算互重合指数(两串英文文本中,一串中的一个随机元素与另一串中一个随机元素相同的概率约为0.065)计算出每个密钥之间的相对间隔,最后通过不断猜测第一个密钥(最多尝试26次),输出可能的密钥及相应的明文。

算法代码

先计算出可能的密钥串中每个密钥之间的关系K
注意可调值(已标明
…输入密文不带空格,小写
密钥a表示移位0

#include
#include
float cic(char c[],int keylength,int offset)   //计算重合指数IC
{
	int i,count[26],l;
	float ic=0;
	for(i=0;i<26;i++) count[i]=0;
	for(i=0;i*keylength+offset0.059) return k;      //0.059为可调边界值
		k++;
	}
	if(k==26) return -1;
}
int main()
{
	char c[500];    //密文最大长度
	int keylength=1,i,j;
	printf("输入密文c:");
	scanf("%s",c);         //输入密文 
	while(true)
	{
		for(i=0;i 

再通过输入可能的密钥关系求出26种可能的密钥及对应明文

#include
#include
int main()
{
	char c[500],m[500];
	printf("输入密文c:");
	scanf("%s",c);//输入密文 
	int n;
	printf("输入密钥长度n:");
	scanf("%d",&n);    //输入密钥长度 
	int k[n],i,s,j;
	k[0]=0;
	for(i=1;i 

缺点就是:
1、密钥关系还得自己一个个输进去
2、懒得合并
3、人工查验明文
4、懒

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/353157.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号