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 "common.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", my_id);
	sprintf(public_name, "public_%d", his_id);
	if (!load_rsa_keys(public_name, private_name)) {
		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;
	}
	make_crypt_key_table();
	printf ("Начинайте передачу информации...\n\n");
	while (get_string_from_console(str_buf, STR_BUF_SIZE))
	{
		buf_size = strlen(str_buf);
		encrypt_buffer(str_buf, buf_size);
		socket_send_buffer(my_socket, str_buf, buf_size);
	}
	close_socket(my_socket);
	sockets_cleanup();
	return 0;
}

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


© Extra Systems, 2024 Extra Web Top