Extra Systems

CYPHERNET

передавач (output)


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

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

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

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

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

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

#include "cyphernet.h"

#define STR_BUF_SIZE 4096
#define CLIENT_MODE CLIENT_MODE_OUTPUT

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;
	}
	printf ("Начинайте передачу информации...\n\n");
	while (get_string_from_console(str_buf, STR_BUF_SIZE))
	{
		buf_size = strlen(str_buf);
		shuffle_encrypt_buffer(str_buf, buf_size);
		encrypt_buffer(str_buf, buf_size);
		socket_send_buffer(my_socket, str_buf, buf_size);
	}
	close_socket(my_socket);
	sockets_cleanup();
	return 0;
}

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

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


© Extra Systems, 2024 Extra Web Top