El receptor (entrada) se utiliza para recibir información del suscriptor con el que se están negociando y mostrar la información recibida en la pantalla de la consola. Al inicio de la sesión, el receptor solicita al usuario su identificador, así como el identificador del abonado del que recibirá información de texto. El receptor debe tener la clave privada del suscriptor que la utiliza y la clave pública del suscriptor con quien se realizarán las negociaciones. También debe estar disponible la huella digital correspondiente.
El envío de la huella digital correspondiente al servidor (de esta manera el servidor identifica al cliente y determina con qué suscriptor debe estar asociado) se realiza mediante el procedimiento send_finger_print.
Después de establecer una conexión a través del servidor central Cypher Net de Extra Systems con el programa de salida, el programa de entrada genera una clave de sesión aleatoria y la cifra vía RSA con la clave pública del suscriptor con el que se están llevando a cabo las negociaciones. Luego, la entrada le envía este cifrado e inmediatamente después envía el hash de la clave generada. Eventos similares ocurren en el otro extremo de la conexión en el programa de salida.
Habiendo recibido la información especificada del socio, la entrada descifra la clave de sesión con su clave privada RSA y verifica la coincidencia de hash. Luego, ambos participantes de la comunicación (entrada y salida) suman módulo dos las secuencias aleatorias que generaron y, debido a la conmutabilidad de esta operación, reciben el mismo valor, que luego se utiliza como clave de sesión. Todas estas acciones se realizan mediante el procedimiento get_common_key, que es el mismo tanto en el receptor como en el transmisor.
Una vez que se genera la clave de sesión de esta manera, entra en juego el módulo de cifrado de transmisión. Exporta las funciones genéricas (encapsula las operaciones necesarias de una manera independiente del algoritmo de cifrado de flujo elegido) make_crypt_key_table (crea una tabla de claves), encrypt_buffer (cifra el búfer en el programa de entrada) y decrypt_buffer (descifra el búfer en el programa de salida).
El programa de entrada hace su trabajo usando 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; }
El contenido de esta página también está disponible en inglés, francés, alemán, portugués, ucraniano y ruso.
© Extra Systems, 2024 |