Шифрование методом сквозной шахматной доски
Сам метод в стандартной "ру.вики" не нашёл, но всё описано вот тут (или оригинал). Нам требовались методы для функций шифрования и расшифровки сообщения, весь тест взят из "Вики", включая настройки таблицы шифрования.
Консольное приложение C++ проверялось в актуальной сборке Visual Studio 2019, листинг и результат тестирования показаны ниже.
#include <iostream> #include <string> #include <map> #include <algorithm> class StraddlingCheckerboard { std::map<char, std::string> table; char first[10], second[10], third[10]; int rowU, rowV; public: StraddlingCheckerboard (const std::string& alphabet, int u, int v) { //Конструктор класса - настройка таблицы rowU = std::min(u, v); rowV = std::max(u, v); for (int i = 0, j = 0; i < 10; ++i) { if (i != u && i != v) { first[i] = alphabet[j]; table[alphabet[j]] = '0' + i; ++j; } second[i] = alphabet[i + 8]; table[alphabet[i + 8]] = '0' + rowU; table[alphabet[i + 8]] += '0' + i; third[i] = alphabet[i + 18]; table[alphabet[i + 18]] = '0' + rowV; table[alphabet[i + 18]] += '0' + i; } } std::string encode(const std::string& plain) { //Шифрование std::string out; for (int i = 0; i < plain.size(); ++i) { char c = plain[i]; if (c >= 'a' && c <= 'z') c += 'A' - 'a'; if (c >= 'A' && c <= 'Z') out += table[c]; else if (c >= '0' && c <= '9') { out += table['/']; out += c; } } return out; } std::string decode(const std::string& cipher) { //Дешифрование std::string out; int state = 0; for (int i = 0; i < cipher.size(); ++i) { int n = cipher[i] - '0'; char next = 0; if (state == 1) next = second[n]; else if (state == 2) next = third[n]; else if (state == 3) next = cipher[i]; else if (n == rowU) state = 1; else if (n == rowV) state = 2; else next = first[n]; if (next == '/') state = 3; else if (next != 0) { state = 0; out += next; } } return out; } }; //class StraddlingCheckerboard int main() { StraddlingCheckerboard sc("ETAONRISBCDFGHJKLMPQ/UVWXYZ.", 2, 6); //Тест из Вики: https://livepcwiki.ru/wiki/Straddling_checkerboard std::string original = "ATTACK AT DAWN"; std::string encoded = sc.encode(original); std::string decoded = sc.decode(encoded); std::cout << "Original: " << original << std::endl << "Encoded: " << encoded << std::endl << "Decoded: " << decoded << std::endl; return 0; }
Original: ATTACK AT DAWN Encoded: 3113212731223655 Decoded: ATTACKATDAWN
17.03.2022, 16:51 [715 просмотров]