Extra Systems

CYPHERNET

приймач (input)


Приймач (input) служить прийому інформації від абонента, з яким ведуться переговори, і виведення отриманої інформації на екран консолі. На початку сеансу приймач запитує у користувача його ідентифікатор, а також ідентифікатор абонента, від якого прийматиметься текстова інформація. Приймач повинен мати закритий ключ абонента, який ним користується, та відкритий ключ абонента, з яким будуть вестись переговори. В наявності також має бути відповідний fingerprint.

Відсилання відповідного fingerprint на сервер (це сервер пізнає клієнта і визначає, з яким саме абонентом його потрібно зв'язати) проводиться процедурою send_finger_print.

Після встановлення зв'язку через центральний сервер Extra Systems Cypher Net з програмою output програма input генерує випадковий сеансовий ключ і шифрує його через RSA відкритим ключем абонента, з яким ведуться переговори. Потім input висилає йому це шифрування, і відразу після цього висилає хеш згенерованого ключа. Аналогічні події відбуваються на іншому кінці зв'язку у програмі output.

Отримавши від партнера зазначену інформацію, input розшифровує сеансовий ключ своїм закритим ключем RSA та перевіряє збіг хешу. Потім обидва учасники зв'язку (input і output) складають по модулю два згенеровані ними випадкові послідовності і, зважаючи на комутативність цієї операції, отримують одне і те значення, яке і використовується далі як сеансовий ключ. Всі ці дії виконує процедура get_common_key, яка однакова і в приймачі, і передавачі.

Після того, як сеансовий ключ таким чином сформований, у справу входить модуль потокового шифрування. Він експортує універсальні (інкапсулюючі необхідні операції незалежним від обраного алгоритму потокового шифрування способом) функції make_crypt_key_table (створення таблиці ключів), encrypt_buffer (шифрує буфер у програмі input) та decrypt_buffer (дешифрує буфер у програмі output).

Програма input виконує свою роботу за допомогою такого алгоритму:

#include "cyphernet.h"

#define STR_BUF_SIZE 4096
#define CLIENT_MODE CLIENT_MODE_INPUT

int main(void)
{
	int my_id, his_id, my_socket, buf_size, client_mode = CLIENT_MODE;
	char str_buf[STR_BUF_SIZE];
	char public_name[64], private_name[64];
	set_console_code_page();
	printf ("\nКлиент консольной шифросвязи (приемник)\n(C) Extra Systems, 2024\n\n");
	printf ("Укажите свой идентификатор: ");
	scanf("%d", &my_id);
	printf ("Укажите идентификатор партнера: ");
	scanf("%d", &his_id);
	printf ("\n");
	sprintf(private_name, "private_%d.bin", my_id);
	sprintf(public_name, "public_%d.bin", his_id);
	if (!load_rsa_keys(public_name, private_name)) {
		printf("На диске отсутствуют нужные ключи...\n\n");
		return 1;
	}
	if (!load_shuffle_data()) {
		printf("На диске отсутствует таблица перетасовки...\n\n");
		return 1;
	}
	print_crypt_params();
	sockets_startup();
	my_socket = create_client_socket(main_server_name, main_server_port);
	if (!send_finger_print(my_socket, my_id, his_id, CLIENT_MODE)) {
		printf("На диске отсутствует нужный fingerprint...\n\n");
		return 1;
	}
	if (!get_common_key(my_socket)) {
		printf("Канал связи установить не удалось...\n");
		return 1;
	}
	while (buf_size = socket_read_buffer(my_socket, str_buf, STR_BUF_SIZE))
	{
			str_buf[buf_size] = 0;
			decrypt_buffer(str_buf, buf_size);
			shuffle_decrypt_buffer(str_buf, buf_size);
			printf( "%s", str_buf);
	}
	close_socket(my_socket);
	sockets_cleanup();
	return 0;
}

Процедури load_shuffle_data та shuffle_decrypt_buffer відносяться до модуля перестановки алфавіту, який забезпечує захист цієї системи від атаки за методом «грубої сили».

Контент цієї сторінки доступний також англійською, французькою, німецькою, португальською, іспанською, італійською та російською мовами.


© Extra Systems, 2024 Extra Web Top