БлогNot. Шифрование методом сквозной шахматной доски

Шифрование методом сквозной шахматной доски

Сам метод в стандартной "ру.вики" не нашёл, но всё описано вот тут (или оригинал). Нам требовались методы для функций шифрования и расшифровки сообщения, весь тест взят из "Вики", включая настройки таблицы шифрования.

Консольное приложение 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 просмотров]


теги: textprocessing c++ алгоритм

К этой статье пока нет комментариев, Ваш будет первым