L'émetteur (output) est utilisé pour transmettre des informations de l'abonné qui négocie à un autre abonné avec lequel il négocie. À l'autre extrémité, ces informations sont transmises à la console à l'aide du programme d'entrée. En début de session, l'émetteur demande à l'utilisateur son identifiant, ainsi que l'identifiant de l'abonné à qui les informations textuelles seront transmises. L'émetteur 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 d'entrée, le programme de sortie 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, la sortie lui envoie ce cryptage, et immédiatement après, 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 d’entrée.
Après avoir reçu les informations spécifiées du partenaire, la sortie déchiffre la clé de session avec sa clé privée RSA et vérifie la 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 généré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 de sortie fait son travail en utilisant cet algorithme:
#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; }
Le contenu de cette page est également disponible en anglais, allemand, portugais, espagnol, italien, ukrainien et en russe.
© Extra Systems, 2024 |
|