📄 vegener.cpp
字号:
#include <stdio.h>
#include <stdlib.h>
int keylength(int m[350])
{
int i,k,j=0,g,d;
double w=0.0000, c[26],q[26],x=0,y;
for(i=0;i<26;i++)
{
c[i]=0;
q[i]=0;
}
for(i=1;w<0.06||w>0.07;i++)
{
for(g=0;g<26;g++)
{
q[g]=0;
}
for(k=1;k<=i;k++)
{
j=k-1;
x=0;
for(g=0;g<26;g++)
{
c[g]=0;
}
while(j<312)
{
d=m[j]-97;
c[d]++;
x++;
j+=i;
}
for(g=0;g<26;g++)
{
y=(c[g]/x)*(c[g]/x);
q[k-1]=q[k-1]+y;
}
}
for(k=1;k<=i;k++)
{
y+=q[k-1];
}
w=y/k;
}
return i-1;
}
int * key(int l,char m[350])
{
int *p,v[26],d,g,k=0,i,x=0,j;
double a[26]={0.0000},c[26],y=0,A[26]={0.082,0.015,0.028,0.043,0.127,0.022,0.020,0.061,0.070,0.002,0.008,0.040,0.024,0.067,0.075,0.019,0.001,0.060,0.063,0.091,0.028,0.010,0.023,0.001,0.020,0.001};
double w[26][26]={0};
for(k=0;k<l;k++)
{
y=0;
for(g=0;g<26;g++)
{
c[g]=0;
v[g];
}
for(i=1;m[k+(i-1)*l]!=NULL;i++)
{
j=k+(i-1)*l;
d=m[j]-97;
c[d]++;
y++;
}
for(i=0;i<26;i++)
{
w[k][i]=c[i]/y;
}
}
y=0;
for(d=0;d<l;d++)
{
for(k=0;k<26;k++)
{
a[k]=0;
y=0;
for(i=0;i<26;i++)
{
a[k]=a[k]+(w[d][i]*A[(26-k+i)%26]);
}
}
for(i=0;i<26;i++)
{
if(a[i]>y)
{
y=a[i];
v[d]=i;
}
}
}
printf("the key is:");
for(d=0;d<l;d++)
{
printf("%c",char(v[d]+97));
v[d]=int(v[d]);
}
return p=v;
}
void decode(int o[350],int l)
{
int q[6]={7,14,11,12,4,18};
int i=0,j[350];
char g[350];
for (i=0;i<312;i++)
{
j[i]=(26+o[i]-97-q[i%l])%26;
g[i]=char(97+j[i]);
}
printf("\nthe message is:");
for(i=0;i<312;i++)
{
printf("%c",g[i]);
}
printf("\n");
}
void main()
{
FILE*fp;
int *p,i=0,m,ich[350];
char ch[350],filename[10];
printf("Please input filename:");
scanf("%s",filename);
if((fp=fopen(filename,"r+"))==NULL)
{
printf("cannot open file\n");
exit(0);
}
fgets(ch,350,fp);
for(i=0;i<313;i++)
{
ich[i]=0;
printf("%c",ch[i]);
ich[i]=int(ch[i]);
}
m=keylength(ich);
printf("\nthe keylength is %d\n",m);
p=key(m,ch);
decode(ich,m);
fclose(fp);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -