维吉尼亚密码破解时求密钥mg移位时有一行全为nan:
代码如下:
#include<iostream>
#include<string>
using namespace std;
string* makeGroup(string beforeText, int step) {
string* afterText = new string[step];
long length = beforeText.length();
for (long i = 0; i < length; i++) {
afterText[i % step] += beforeText[i];
}
return afterText;
}
//求密钥长度,根据不同密钥长度对应的重合指数,正常文本为0.0635左右
int GetKeyLength(string cipherText){
//尝试1-30的密钥长度
double smallest = 1;
int keyLength = 0;
for (int i = 1; i < 30; i++) {
double index = 0;
string* afterText = makeGroup(cipherText, i);
for (int j = 0; j < i; j++) {
double num = 0;
//ASCII码65-90对应A-Z
for (int p = 65; p < 91; p++) {
int count = 0;
for (int q = 0; q < afterText[j].length(); q++) {
if (afterText[j][q] == p) {
count++;
}
}
num += (double(count) / afterText[j].length()) * ((double(count) - 1) / (afterText[j].length() - 1));
}
index += num;
}
cout <<"密钥长度为"<<i<<"时,重合指数="<< index / i << endl;
}
return keyLength;
}
//寻找mg移位,确定密钥
void Getkey(string a,int keylength){
double x[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};
string* afterText=makeGroup(a,keylength);
for(int i=0;i<keylength;i++){
int l=65;
double count[keylength][26];
for(int j=0;j<26;j++){
l=65+j;
for(int k=0;k<(a.length()/keylength);k++){
if(afterText[i][k]==l){
count[i][j]++;
}
}
}
for(int j=0;j<26;j++){
double m=0;
for(int t=0;t<26;t++){
m+=x[t]*count[i][(t+j)%26]/(double)(a.length()/keylength);
}
cout<<m<<" ";
}
cout<<endl;
}
}
int main(){
string a="KCCPKBGUFDPHQTYAVINRRTMVGRKDNBVFDETDGILTXRGUDDKOTFMBPVGEGLTGCKQRACQCWDNAWCRXIZAKFTLEWRPTYCQKYVXCHKFTPONCQQRHJVAJUWETMCMSPKQDYHJVDAHCTRLSVSKCGCZQQDZXGSFRLSWCWSJTBHAFSIASPRJAHKJRJUMVGKMITZHFPDISPZLVLGWTFPLKKEBDPGCEBSHCTJRWXBAFSPEZQNRWXCVYCGAONWDDKACKAWBBIKFTIOVKCGGHJVLNHIFFSQESVYCLACNVRWBBIREPBBVFEXOSCDYGZWPFDTKFQIYCWHJVLNHIQIBTKHJVNPIST";
GetKeyLength(a);
Getkey(a,6);
}
请解答!
估计是出现分母为0的情况了吧
我在VS2010下测试没问题,但有一个地方注意double count[keylength][26];没有初始化。后面都是count[i][j]++;有问题
Getkey()函数中count数组没有初始化,后面++计算的时候出错。
把 double count[keylength] [26] ; 改成 double count[100][26]={0}; 试一下。