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

Как в шифре Эль-Гамаля букве русского алфавита присвоить порядковый номер?

Реализовал шифрование и дешифрование по Эль-Гамалю. Цифры и английский алфавит шифруется хорошо. Но теперь требуется принять код символа в соответствии с его положением в алфавите. И алфавит должен быть русским. То есть буква "А" - это цифра 1, "Б" - 2, "В" - 3, ..., "Я" - 33. И кодироваться слово будет за счёт символов. И также оно должно расшифровываться. Как это можно реализовать?

Мой код программы:
#define _CRT_SECURE_NO_WARNINGS
#include <fstream>
#include <iostream>
#include <cstdlib>
#include <ctime>
#include <string>
#include <windows.h>

#pragma hdrstop                  


using namespace std;

int power(int a, int b, int n) {// a^b mod n
	int tmp = a;
	int sum = tmp;
	for (int i = 1; i < b; i++) {
		for (int j = 1; j < a; j++) {
			sum += tmp;
			if (sum >= n) {
				sum -= n;
			}
		}
		tmp = sum;
	}
	return tmp;
	//return (a ^ b) % n;
}

int mul(int a, int b, int n) {// a*b mod n
	int sum = 0;

	for (int i = 0; i < b; i++) {
		sum += a;

		if (sum >= n) {
			sum -= n;
		}
	}

	return sum;
	//return (a * b) % n;
}


void crypt(int p, int g, int x, string inFileName, string outFileName) {

	//setlocale(LC_ALL, "Russian");
	SetConsoleCP(1251);
	SetConsoleOutputCP(1251);
	ifstream inf(inFileName.c_str());   //Формирует массив строк  И возвра-щает указатель на него.
	ofstream outf(outFileName.c_str());
	int y = power(g, x, p);
	printf("Открытый ключ (p,g,y)=", setlocale(LC_ALL, "Russian"));
	cout << "" << "(" << p << "," << g << "," << y << ")" << endl;
	cout << "Закрытый ключ x=" << x << endl;
	cout << "Текст который необходимо зашифровать\n";


	while (inf.good()) {
		int m = inf.get();
		if (m > 0) {
			cout << (char)m;

			int k = rand() % (p - 2) + 1; // 1 < k < (p-1)
			int a = power(g, k, p);
			int b = mul(power(y, k, p), m, p);
			outf << a << " " << b << " ";
		}
	}

	cout << endl;

	inf.close();
	outf.close();
}

void decrypt(int p, int x, string inFileName, string outFileName) {

	ifstream inf(inFileName.c_str());
	ofstream outf(outFileName.c_str());
	//setlocale(LC_ALL, "Russian");
	SetConsoleCP(1251);
	SetConsoleOutputCP(1251);

	cout << "\nДешифрованый текст:" << endl;

	while (inf.good()) {
		int a = 0;
		int b = 0;
		inf >> a;
		inf >> b;

		if (a != 0 && b != 0) {


			int deM = mul(b, power(a, p - 1 - x, p), p);// m=b*(a^x)^(-1)mod p =b*a^(p-1-x)mod p 
			char m = static_cast<char>(deM);
			outf << m;
			cout << m;
		}
	}

	cout << endl;

	inf.close();
	outf.close();
}

int main() {
	srand(time(NULL));
	//setlocale(LC_ALL, "Russian");
	SetConsoleCP(1251);
	SetConsoleOutputCP(1251);

	int p = 0, g = 0, x = 0;
	cout << "Введите p,g,x\n";
	cin >> p >> g >> x;
	crypt(p, g, x, "d:\\1\\input1.txt", "d:\\1\\outsh.txt");
	decrypt(p, x, "d:\\1\\outsh.txt", "d:\\1\\outdesh.txt");

	system("pause");
	return 0;
}
  • Вопрос задан
  • 65 просмотров
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы