Extra Systems

CYPHERNET

Sender (output)


Der Sender (output) wird verwendet, um Informationen von dem Teilnehmer, der verhandelt, an einen anderen Teilnehmer zu übertragen, mit dem er verhandelt. Am anderen Ende werden diese Informationen über das Eingabeprogramm an die Konsole ausgegeben. Zu Beginn der Sitzung fragt der Sender den Benutzer nach seiner Kennung sowie nach der Kennung des Teilnehmers, an den die Textinformationen übermittelt werden sollen. Der Sender muss über den privaten Schlüssel des Teilnehmers verfügen, der ihn nutzt, und über den öffentlichen Schlüssel des Teilnehmers, mit dem Verhandlungen geführt werden. Ein entsprechender Fingerabdruck muss ebenfalls vorhanden sein.

Das Senden des entsprechenden Fingerabdrucks an den Server (dadurch identifiziert der Server den Client und bestimmt, welchem ​​Abonnenten er zugeordnet werden muss) erfolgt durch die Prozedur send_finger_print.

Nach dem Verbindungsaufbau über den zentralen Extra Systems Cypher Net-Server mit dem Eingabeprogramm generiert das Ausgabeprogramm einen zufälligen Sitzungsschlüssel und verschlüsselt diesen per RSA mit dem öffentlichen Schlüssel des Teilnehmers, mit dem verhandelt wird. Dann sendet ihm die Ausgabe diese Verschlüsselung und unmittelbar danach den Hash des generierten Schlüssels. Ähnliche Ereignisse treten am anderen Ende der Verbindung im Eingabeprogramm auf.

Nach Erhalt der angegebenen Informationen vom Partner entschlüsselt Output den Sitzungsschlüssel mit seinem privaten RSA-Schlüssel und prüft die Hash-Übereinstimmung. Anschließend addieren beide Kommunikationsteilnehmer (Eingang und Ausgang) die von ihnen erzeugten Zufallsfolgen modulo zwei und erhalten aufgrund der Kommutierbarkeit dieser Operation den gleichen Wert, der dann als Sitzungsschlüssel verwendet wird. Alle diese Aktionen werden von der Prozedur get_common_key ausgeführt, die sowohl im Empfänger als auch im Sender gleich ist.

Sobald der Sitzungsschlüssel auf diese Weise generiert wurde, kommt das Stream-Verschlüsselungsmodul ins Spiel. Es exportiert die generischen Funktionen (kapselt die erforderlichen Operationen unabhängig vom gewählten Stream-Verschlüsselungsalgorithmus) make_crypt_key_table (erstellt eine Schlüsseltabelle), encrypt_buffer (verschlüsselt den Puffer im Eingabeprogramm) und decrypt_buffer (entschlüsselt den Puffer im Ausgabeprogramm).

Das Ausgabeprogramm erledigt seine Aufgabe mit diesem Algorithmus:

#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;
}

Der Inhalt dieser Seite ist auch in Englisch, Französisch, Ukrainisch und Russisch verfügbar.


© Extra Systems, 2024 Extra Web Top