vigenere 暗号のキーワードのキーの長さを推測するアルゴリズムを実装しようとしています。
考えられるキーの長さごとに一致のインデックスを見つける手順について説明しますが、暗号テキストを部分文字列に分割する方法がわかりません。
つまり、私はこのような特定の暗号文を取得しようとしています
ERTEQSDFPQKCJAORIJARTARTAAFIHGNAPROEOHAGJEOIHJA
(これはランダムなテキストです。コード化されたメッセージはありません)
次のように異なる文字列に分割します。
key length 2: ETQDP... (every second letter starting from position 0)
RESFQ... (every second letter starting from position 1)
key length 3: EEDQ.... (every third letter starting from position 0)
等々。
何か案は?
アップデート
私は今、自分のコードを実装しようとしましたが、これが私がやったことです:
void findKeyLength(string textToTest)
{
size_t length = textToTest.length();
vector<char> vectorTextChar;
//keeping key length to half the size of ciphertext; should be reasonable
for (size_t keylength = 1; keylength < length / 2; keylength++)
{
for (size_t i = keylength; i < keylength ; i++)
{
string subString = "";
for (size_t k = i; k < length; k+=i)
{
vectorTextChar.push_back(textToTest[k]);
}
for (vector<char>::iterator it= vectorTextChar.begin(); it!=vectorTextChar.end(); ++it)
{
subString += *it;
}
cout << subString << endl; //just to see what it looks like
cout << "Key Length : " << keylength << "IC: " << indexOfCoincidence(subString) << endl;
vectorTextChar.clear();
}
}
}
以下で述べたように、最初の文字に基づく部分文字列のみを反映する出力があります (つまり、キーの長さが 2 の場合は 1、3、5、7、9 ですが、2、4、6、8 はそうではありません)。 、10...)