Extra Systems

CYPHERNET

transmissor (output)


O transmissor (saída) é utilizado para transmitir informações do assinante que está a negociar para outro assinante com quem está a negociar. Na outra extremidade, esta informação é enviada para a consola usando o programa de entrada. No início da sessão, o transmissor solicita ao utilizador o seu identificador, bem como o identificador do assinante a quem a informação de texto será transmitida. O transmissor 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 entrada, o programa de saída gera uma chave de sessão aleatória e encripta-a via RSA com a chave pública do assinante com quem estão a ser conduzidas as negociações. De seguida, a saída envia-lhe essa encriptação e, imediatamente após, envia o hash da chave gerada. Eventos semelhantes ocorrem na outra extremidade da ligação no programa de entrada.

Tendo recebido as informações especificadas do parceiro, a saída 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 saída faz o seu trabalho utilizando 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;
}

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