Extra Systems

CYPHERNET

ricevitore (input)


Il ricevitore (input) viene utilizzato per ricevere informazioni dall'abbonato con cui sono in corso le trattative e visualizzare le informazioni ricevute sullo schermo della console. All'inizio della sessione, il ricevitore chiede all'utente il suo identificatore, nonché l'identificatore dell'abbonato da cui verranno ricevute le informazioni testuali. Il destinatario deve avere la chiave privata dell'abbonato che lo utilizza e la chiave pubblica dell'abbonato con il quale verranno condotte le trattative. Deve essere disponibile anche un'impronta digitale corrispondente.

L'invio dell'impronta digitale corrispondente al server (con questo il server identifica il client e determina a quale abbonato deve essere associato) viene eseguito dalla procedura send_finger_print.

Dopo aver stabilito una connessione attraverso il server centrale Extra Systems Cypher Net con il programma di output, il programma di input genera una chiave di sessione casuale e la crittografa tramite RSA con la chiave pubblica dell'abbonato con il quale vengono condotte le trattative. Quindi l'input gli invia questa crittografia e subito dopo invia l'hash della chiave generata. Eventi simili si verificano all'altra estremità della connessione nel programma di output.

Dopo aver ricevuto le informazioni specificate dal partner, l'input decrittografa la chiave di sessione con la sua chiave privata RSA e controlla la corrispondenza dell'hash. Quindi entrambi i partecipanti alla comunicazione (input e output) sommano modulo due le sequenze casuali che hanno generato e, grazie alla commutabilità di questa operazione, ricevono lo stesso valore, che viene poi utilizzato come chiave di sessione. Tutte queste azioni vengono eseguite dalla procedura get_common_key, che è la stessa sia nel ricevitore che nel trasmettitore.

Una volta formata la chiave di sessione in questo modo, entra in gioco il modulo di crittografia del flusso. Esporta le funzioni generiche (incapsula le operazioni necessarie in modo indipendente dall'algoritmo di crittografia del flusso scelto) funzioni make_crypt_key_table (crea una tabella di chiavi), encrypt_buffer (crittografa il buffer nel programma di input) e decrypt_buffer (decrittografa il buffer nel programma di output) .

Il programma di input fa il suo lavoro utilizzando questo algoritmo:

#include "common.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", 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();
	while (buf_size = socket_read_buffer(my_socket, str_buf, STR_BUF_SIZE))
	{
			str_buf[buf_size] = 0;
			decrypt_buffer(str_buf, buf_size);
			printf( "%s", str_buf);
	}
	close_socket(my_socket);
	sockets_cleanup();
	return 0;
}

Il contenuto di questa pagina è disponibile anche in inglese, francese, tedesco, portoghese, spagnolo, ucraino e russo.


© Extra Systems, 2024 Extra Web Top