Необходимо реализовать два шифра (шифрование и дешифрование с заглавными русскими буквами): 1) шифрование с помощью шифра гаммирования по модулю n, и 2) шифрование с помощью шифра гаммирования по модулю 2.
По модулю n реализовать получилось, код приводу ниже.
Подскажите, как на основе моего кода можно реализовать шифрование по модулю 2?
Суть этих шифров в следующем.
1) По модулю n. Есть алфавит от "А" до "Я" без буквы "Ё". Каждому символу присваивается номер: А-0, Б-1, ..., Я-31. Итого 32 символа. Шифрование происходит так: складываются i-ые номера символов исходного сообщения и гаммы (ключа) и делятся по модулю n (n = 32). В итоге получаются числа, которые равны каким-то символам алфавита. Это и есть шифр. Дешифрование происходит так: к i-ому номеру шифротекста прибавляется модуль n и вычитается i-ый номер символа гаммы и всё это ещё делится по модулю n.
Пример:
Текст: ХЛЕБ
Ключ (гамма): ОБЕД
Шифр: ГМКЕ
2) По модулю 2. Здесь уже нужно работать с двоичными ASCII кодами. Буква "А" имеет код 192 (1100 0000), буква "Я" - 223 (1101 1111). По модулю 2 нужно складывать двоичные значения текста и гаммы. Шифрограммой будет являться сообщение в виде десятичных значение. Также можно вывести дополнительно в виде двоичных. Дешивровка проходит так: двоичные значение шифра и гаммы складываются по модулю 2.
Если гамма меньше исходного текста, то она дополняется циклически.
Пример:
Текст: В(194 = 1100 0010) О(206 = 1100 1110) В(194 = 1100 0010) А(192 = 1100 0000)
Ключ (гамма): Ю(222 = 1101 1110) Л(203 = 1100 1011) Я(223 = 1101 1111) Ю(222 = 1101 1110)
Шифр: 28(0001 1100) 5(0000 0101) 29(0001 1101) 30(0001 1110)
Помогите, пожалуйста, реализовать второй шифр.
#include <iostream>
#include <conio.h>
#include <string>
#include <windows.h>
using namespace std;
int main() {
//setlocale(LC_ALL, "Russian");
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
int t, n, i, j, k, sum = 0;
string m;
cout << "Введите текст: ";
cin >> m;
string key;
cout << "Введите ключ (гамму): ";
cin >> key;
int mod = key.size();
j = 0;
for (i = key.size(); i < m.size(); i++) {
key += key[j%mod];
j++;
}
string ans = "";
for (i = 0; i < m.size(); i++) {
ans += (key[i] - 'А' + m[i] - 'А') % 32 + 'А';
}
cout << "Зашифрованный текст: " << ans << '\n';
string ans1 = "";
for (i = 0; i < ans.size(); i++) {
ans1 += (ans[i] - key[i] + 32) % 32 + 'А';
}
cout << "Расшифрованный текст: " << ans1 << '\n';
_getch();
return 0;
}