Я пытаюсь реализовать алгоритм, который будет угадывать вероятную длину ключа ключевого слова виртуального шифра.
Я собираюсь узнать, как найти индекс совпадения для каждой возможной длины ключа, но я не могу найти способ разбить зашифрованный текст на подстроки.
То есть я пытаюсь взять определенный зашифрованный текст вроде этого
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();
}
}
}
Как я уже упоминал ниже, у меня будет вывод, который отражает только подстроку, которая основана
на первые символы (т.е. 1, 3, 5, 7, 9, если длина ключа равна 2, но не 2, 4, 6, 8, 10 …)
Не проверено, но вы можете сделать что-то вроде этого:
int len = cipherText.length;
char[] text2inspect = char[(len/keyLength) + 1]
for (int startIndex = 0; keyLength > startIndex; startIndex++){
int destIndex = 0;
for (int index = startIndex; len > index; index += keyLength){
text2inspect[destIndex++] = cipherText[index];
}
text2inspect[destIndex] = 0; // String termination
// add your inspection code here
}
Других решений пока нет …