codeFlowType:
codeWrite
codeFlowLang:
C++
Расшифровка шифра Цезаря с помощью генетического алгоритма
#include <iostream>
#include <string>
#include <random>
#include <vector>
std::string decryptCaesar(const std::string& encryptedText, int shift) {
std::string decryptedText = "";
for (const char& c : encryptedText) {
if (c >= 'a' && c <= 'z') {
decryptedText += ((c - 'a' - shift + 26) % 26) + 'a';
} else if (c >= 'A' && c <= 'Z') {
decryptedText += ((c - 'A' - shift + 26) % 26) + 'A';
} else {
decryptedText += c;
}
}
return decryptedText;
}
std::vector<std::string> generatePopulation(int populationSize, int keyLength) {
std::vector<std::string> population;
std::random_device rd;
std::mt19937 gen(rd());
std::uniform_int_distribution<> dis(0, 25);
for (int i = 0; i < populationSize; ++i) {
std::string individual = "";
for (int j = 0; j < keyLength; ++j) {
individual += (dis(gen) + 'a');
}
population.push_back(individual);
}
return population;
}
std::string getBestIndividual(const std::vector<std::string>& population, const std::string& encryptedText) {
std::string bestIndividual = "";
int bestFitness = 0;
for (const std::string& individual : population) {
std::string decryptedText = decryptCaesar(encryptedText, individual[0] - 'a');
int fitness = 0;
for (std::size_t i = 0; i < decryptedText.length(); ++i) {
if (decryptedText[i] == 'e' || decryptedText[i] == 'E') {
fitness++;
}
}
if (fitness > bestFitness) {
bestFitness = fitness;
bestIndividual = individual;
}
}
return bestIndividual;
}
int main() {
std::string encryptedText = "QEB NRFZH YOLTK CLU GRJMP LSBO QEB IXWV ALD";
int populationSize = 100;
int keyLength = 1;
std::vector<std::string> population = generatePopulation(populationSize, keyLength);
std::string bestIndividual = getBestIndividual(population, encryptedText);
std::string decryptedText = decryptCaesar(encryptedText, bestIndividual[0] - 'a');
std::cout << "Best Individual: " << bestIndividual << std::endl;
std::cout << "Decrypted Text: " << decryptedText << std::endl;
return 0;
}
Шифр Цезаря - это метод шифрования, в котором каждая буква в открытом тексте заменяется другой буквой с фиксированным смещением. В данном коде идет расшифровка шифра Цезаря с помощью генетического алгоритма.
Для начала, определяется функция decryptCaesar
, которая принимает зашифрованный текст и смещение (ключ), и возвращает расшифрованный текст. Затем, определяется функция generatePopulation
, которая генерирует начальную популяцию (случайные значения ключа), и возвращает вектор строк (популяцию).
Далее, определяется функция getBestIndividual
, которая принимает популяцию и зашифрованный текст, и возвращает лучший (наиболее подходящий) ключ из популяции. Для каждого индивида (ключа) в популяции, функция расшифровывает текст с использованием этого ключа, и вычисляет "фитнес" - количество букв "е" или "Е" в расшифрованном тексте. Лучший индивид выбирается на основе наибольшего значения фитнеса.
В функции main
задается зашифрованный текст, размер популяции и длина ключа. После генерации начальной популяции и нахождения лучшего индивида, текст расшифровывается с использованием этого индивида, и выводятся результаты (лучший индивид и расшифрованный текст) на экран.