Il trasmettitore (uscita) viene utilizzato per trasmettere informazioni dall'abbonato che sta negoziando a un altro abbonato con cui sta negoziando. Dall'altra parte, queste informazioni vengono inviate alla console utilizzando il programma di input. All'inizio della sessione, il trasmettitore chiede all'utente il suo identificatore, nonché l'identificatore dell'abbonato a cui verranno trasmesse le informazioni di testo. Il trasmettitore 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 input, il programma di output genera una chiave di sessione casuale e la crittografa tramite RSA con la chiave pubblica dell'abbonato con cui vengono condotte le trattative. Quindi l'output 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 input.
Dopo aver ricevuto le informazioni specificate dal partner, l'output 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 generata 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 output fa il suo lavoro utilizzando questo algoritmo:
#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; }
Il contenuto di questa pagina è disponibile anche in inglese, francese, tedesco, portoghese, spagnolo, ucraino e russo.
© Extra Systems, 2024 |
|