Расшифровка шифра Цезаря с помощью генетического

Расшифровка шифра Цезаря с помощью генетического алгоритма
Дополнительные параметры: codeFlowType: codeWrite codeFlowLang: C++
Создано: 16.07.2023 18:19 Обновлено: 2 года назад

Расшифровка шифра Цезаря с помощью генетического алгоритма

#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 задается зашифрованный текст, размер популяции и длина ключа. После генерации начальной популяции и нахождения лучшего индивида, текст расшифровывается с использованием этого индивида, и выводятся результаты (лучший индивид и расшифрованный текст) на экран.