Приймач (input) служить прийому інформації від абонента, з яким ведуться переговори, і виведення отриманої інформації на екран консолі. На початку сеансу приймач запитує у користувача його ідентифікатор, а також ідентифікатор абонента, від якого прийматиметься текстова інформація. Приймач повинен мати закритий ключ абонента, який ним користується, та відкритий ключ абонента, з яким будуть вестись переговори. В наявності також має бути відповідний fingerprint.
Відсилання відповідного fingerprint на сервер (це сервер пізнає клієнта і визначає, з яким саме абонентом його потрібно зв'язати) проводиться процедурою send_finger_print.
Після встановлення зв'язку через центральний сервер Extra Systems Cypher Net з програмою output програма input генерує випадковий сеансовий ключ і шифрує його через RSA відкритим ключем абонента, з яким ведуться переговори. Потім input висилає йому це шифрування, і відразу після цього висилає хеш згенерованого ключа. Аналогічні події відбуваються на іншому кінці зв'язку у програмі output.
Отримавши від партнера зазначену інформацію, input розшифровує сеансовий ключ своїм закритим ключем RSA та перевіряє збіг хешу. Потім обидва учасники зв'язку (input і output) складають по модулю два згенеровані ними випадкові послідовності і, зважаючи на комутативність цієї операції, отримують одне і те значення, яке і використовується далі як сеансовий ключ. Всі ці дії виконує процедура get_common_key, яка однакова і в приймачі, і передавачі.
Після того, як сеансовий ключ таким чином сформований, у справу входить модуль потокового шифрування. Він експортує універсальні (інкапсулюючі необхідні операції незалежним від обраного алгоритму потокового шифрування способом) функції make_crypt_key_table (створення таблиці ключів), encrypt_buffer (шифрує буфер у програмі input) та decrypt_buffer (дешифрує буфер у програмі output).
Програма input виконує свою роботу за допомогою такого алгоритму:
#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; }
Контент цієї сторінки доступний також англійською, французькою, німецькою та російською мовами.
© Extra Systems, 2024 |