@EgaNator
Учусь на программиста

Как реализовать шифрование шифром гаммирования по модулю 2?

Необходимо реализовать два шифра (шифрование и дешифрование с заглавными русскими буквами): 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;
}
  • Вопрос задан
  • 3931 просмотр
Пригласить эксперта
Ответы на вопрос 1
wataru
@wataru Куратор тега C++
Разработчик на С++, экс-олимпиадник.
Можно воспользоваться побитовыми операциями. Сложение по модулю 2 равносильно xor. Т.е. вам надо про xor-ить текст и гамму. Вычитание, что забавно, это тот же самый xor. Побитовый xor в си - это ^.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы