Extra Systems

CYPHERNET

transmisor (output)


El transmisor (salida) se utiliza para transmitir información del abonado que está negociando a otro abonado con el que está negociando. En el otro extremo, esta información se envía a la consola mediante el programa de entrada. Al inicio de la sesión, el transmisor solicita al usuario su identificador, así como el identificador del abonado al que se transmitirá la información de texto. El transmisor debe tener la clave privada del suscriptor que lo 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 entrada, el programa de salida 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 salida 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 entrada.

Habiendo recibido la información especificada del socio, la salida 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 salida hace su trabajo usando este algoritmo:

#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;
}

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 Extra Web Top