2023年7月31日发(作者:)

维吉尼亚密码暴⼒破解c++实现 维吉尼亚密码是⼀种多表替换密码,暴⼒破解相对来说⽐单表置换密码难⼀些。在⽹上找基于重合互指数法的破解代码,java、python都有,本菜鸟只有c++⽤的相对熟练⼀点,就⽤c++写了暴⼒破解过程。代码耗时提⾼效率什么的暂没考虑。 维吉尼亚⽅阵是26*26的⽅阵,第⼀⾏代表明⽂字母,第⼀列代表密钥字母,每⼀⾏都是⼀个凯撒加密。在只知道密⽂的情况下想要破解维吉尼亚加密,⾸先要确定密钥的长度。确定密钥长度有两种⽅式:i测试法 搜索长度⾄少为2的相邻的⼀对对相同的密⽂段,记下它们之间的距离。⽽密钥长度d可能就是这些距离的最⼤公因⼦。2.重合指数法 公式:

代码:void Miyaolenth(char c[])

{ int klen=1; //密钥长度 int clen=strlen(c); //密⽂的长度

while(1) { float IC[klen]; //重合指数 float avgIC=0; //平均重合指数 for(int i=0;i

{

int out[26]={ 0 }; //盛放字母个数的数组 for(int j=0;i+j*klen

float e=0.000f; int L=0; for(int k=0;k<26;k++) //⼦串密⽂长度

L+=out[k]; L*=(L-1); for(int k=0;k<26;k++) //分组计算重合指数IC

if(out[k]!=0) e=e+((float)out[k]*(float)(out[k]-1))/(float)L; IC[i]=e; } for(int i=0;i

if (avgIC >= 0.06) break; //判断退出条件,重合指数的平均值是否⼤于0.06

else klen++; } cout<<"密钥长度为:"<

}确定好密钥长度之后开始求密钥。重合互指数法求密钥: 根据密钥的长度对密⽂进⾏分组,每⼀组都是⼀个凯撒加密。计算拟重合指数,通过拟重合指数可以确定每组的移位密钥,从⽽求出整个的密钥。公式:代码:float p[] = {0.082, 0.015, 0.028, 0.043, 0.127, 0.022, 0.02, 0.061, 0.07, 0.002, 0.008, 0.04, 0.024, 0.067, 0.075, 0.019, 0.001, 0.06, 0.063, 0.091, 0.028, 0.

int key[100]={ 0 }; //存放密钥

for(int i=0;i

{

int g=0; //密⽂移动g个位置

for(int t=0;t<26;t++) { float x=0.000f; //拟重合指数

int out[26]={ 0 }; //盛放字母个数的数组 for(int j=0;i+j*klen

int L=0; for(int k=0;k<26;k++) //⼦串密⽂长度

L+=out[k]; for(int k=0;k<26;k++) x=x+p[k]*out[(k+g)%26]; if(x/L>0.055) { key[i]=g; break; } else g++; } } cout<<"加密密钥为:";

for(int i=0;i

cout<

2023年7月31日发(作者:)

维吉尼亚密码暴⼒破解c++实现 维吉尼亚密码是⼀种多表替换密码,暴⼒破解相对来说⽐单表置换密码难⼀些。在⽹上找基于重合互指数法的破解代码,java、python都有,本菜鸟只有c++⽤的相对熟练⼀点,就⽤c++写了暴⼒破解过程。代码耗时提⾼效率什么的暂没考虑。 维吉尼亚⽅阵是26*26的⽅阵,第⼀⾏代表明⽂字母,第⼀列代表密钥字母,每⼀⾏都是⼀个凯撒加密。在只知道密⽂的情况下想要破解维吉尼亚加密,⾸先要确定密钥的长度。确定密钥长度有两种⽅式:i测试法 搜索长度⾄少为2的相邻的⼀对对相同的密⽂段,记下它们之间的距离。⽽密钥长度d可能就是这些距离的最⼤公因⼦。2.重合指数法 公式:

代码:void Miyaolenth(char c[])

{ int klen=1; //密钥长度 int clen=strlen(c); //密⽂的长度

while(1) { float IC[klen]; //重合指数 float avgIC=0; //平均重合指数 for(int i=0;i

{

int out[26]={ 0 }; //盛放字母个数的数组 for(int j=0;i+j*klen

float e=0.000f; int L=0; for(int k=0;k<26;k++) //⼦串密⽂长度

L+=out[k]; L*=(L-1); for(int k=0;k<26;k++) //分组计算重合指数IC

if(out[k]!=0) e=e+((float)out[k]*(float)(out[k]-1))/(float)L; IC[i]=e; } for(int i=0;i

if (avgIC >= 0.06) break; //判断退出条件,重合指数的平均值是否⼤于0.06

else klen++; } cout<<"密钥长度为:"<

}确定好密钥长度之后开始求密钥。重合互指数法求密钥: 根据密钥的长度对密⽂进⾏分组,每⼀组都是⼀个凯撒加密。计算拟重合指数,通过拟重合指数可以确定每组的移位密钥,从⽽求出整个的密钥。公式:代码:float p[] = {0.082, 0.015, 0.028, 0.043, 0.127, 0.022, 0.02, 0.061, 0.07, 0.002, 0.008, 0.04, 0.024, 0.067, 0.075, 0.019, 0.001, 0.06, 0.063, 0.091, 0.028, 0.

int key[100]={ 0 }; //存放密钥

for(int i=0;i

{

int g=0; //密⽂移动g个位置

for(int t=0;t<26;t++) { float x=0.000f; //拟重合指数

int out[26]={ 0 }; //盛放字母个数的数组 for(int j=0;i+j*klen

int L=0; for(int k=0;k<26;k++) //⼦串密⽂长度

L+=out[k]; for(int k=0;k<26;k++) x=x+p[k]*out[(k+g)%26]; if(x/L>0.055) { key[i]=g; break; } else g++; } } cout<<"加密密钥为:";

for(int i=0;i

cout<