关于维吉尼亚密码
实质上就是分组然后分别用不同密钥凯撒加密
详情参考百度百科-维吉尼亚密码
加密原理:分组凯撒加密(度娘欢迎您
输入明文不带空格,原因参考本文结尾缺点第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+offset 0.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


