O receptor (entrada) é utilizado para receber informação do assinante com quem decorrem as negociações e exibir a informação recebida no ecrã da consola. No início da sessão, o receptor solicita ao utilizador o seu identificador, bem como o identificador do assinante de quem será recebida a informação textual. O recetor deverá possuir a chave privada do assinante que o utiliza e a chave pública do assinante com quem se vão realizar as negociações. Uma impressão digital correspondente também deve estar disponível.
O envio da impressão digital correspondente ao servidor (com isto o servidor identifica o cliente e determina a que assinante necessita de estar associado) é realizado pelo procedimento send_finger_print.
Após estabelecer uma ligação através do servidor central Extra Systems Cypher Net com o programa de saída, o programa de entrada gera uma chave de sessão aleatória e encripta-a via RSA com a chave pública do assinante com quem as negociações estão a ser conduzidas. De seguida, input envia-lhe essa encriptação e imediatamente em seguida envia o hash da chave gerada. Eventos semelhantes ocorrem na outra extremidade da ligação no programa de saída.
Tendo recebido as informações especificadas do parceiro, a entrada desencripta a chave de sessão com a sua chave privada RSA e verifica a correspondência de hash. De seguida, ambos os participantes da comunicação (entrada e saída) somam módulo dois as sequências aleatórias que geraram e, devido à comutabilidade desta operação, recebem o mesmo valor, que é então utilizado como chave de sessão. Todas estas ações são realizadas pelo procedimento get_common_key, que é o mesmo tanto no recetor como no transmissor.
Depois de a chave de sessão ser gerada desta forma, o módulo de encriptação de fluxo entra em ação. Exporta as funções genéricas (encapsula as operações necessárias de forma independente do algoritmo de encriptação de fluxo escolhido) make_crypt_key_table (cria uma tabela de chaves), encrypt_buffer (encripta o buffer no programa de entrada) e decrypt_buffer (decifra o buffer no programa de saída ) .
O programa de entrada faz o seu trabalho utilizando este 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; }
O conteúdo desta página está também disponível em inglês, francês, alemão, espanhol, ucraniano e russo.
© Extra Systems, 2024 |