Le récepteur (input) permet de recevoir des informations de l'abonné avec lequel des négociations sont en cours et d'afficher les informations reçues sur l'écran de la console. En début de session, le récepteur demande à l'utilisateur son identifiant, ainsi que l'identifiant de l'abonné dont les informations textuelles seront reçues. Le récepteur doit disposer de la clé privée de l'abonné qui l'utilise et de la clé publique de l'abonné avec lequel les négociations seront menées. Une empreinte digitale correspondante doit également être disponible.
L'envoi de l'empreinte digitale correspondante au serveur (le serveur identifie ainsi le client et détermine à quel abonné il doit être associé) est effectué par la procédure send_finger_print.
Après avoir établi une connexion via le serveur central Extra Systems Cypher Net avec le programme de sortie, le programme d'entrée génère une clé de session aléatoire et la crypte via RSA avec la clé publique de l'abonné avec lequel les négociations sont en cours. Ensuite, input lui envoie ce cryptage, et immédiatement après, il envoie le hachage de la clé générée. Des événements similaires se produisent à l’autre extrémité de la connexion dans le programme de sortie.
Après avoir reçu les informations spécifiées du partenaire, l'entrée déchiffre la clé de session avec sa clé privée RSA et vérifie une correspondance de hachage. Ensuite, les deux participants à la communication (entrée et sortie) ajoutent modulo deux les séquences aléatoires qu'ils ont générées et, grâce à la commutabilité de cette opération, reçoivent la même valeur, qui est ensuite utilisée comme clé de session. Toutes ces actions sont effectuées par la procédure get_common_key, qui est la même dans le récepteur et dans l'émetteur.
Une fois la clé de session ainsi formée, le module de chiffrement de flux entre en jeu. Il exporte les fonctions génériques (encapsule les opérations nécessaires de manière indépendante de l'algorithme de chiffrement de flux choisi) make_crypt_key_table (crée une table de clés), encrypt_buffer (crypte le tampon dans le programme d'entrée) et decrypt_buffer (déchiffre le tampon dans le programme de sortie) .
Le programme "input" fait son travail en utilisant l'algorithme suivant:
#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; }
Le contenu de cette page est également disponible en anglais, allemand, ukrainien et en russe.
© Extra Systems, 2024 |