Extra Systems

CYPHERNET

procedimiento de negociación de claves de sesión


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 en módulo las secuencias aleatorias que generaron (esto se hace mediante el procedimiento make_common_key) y, debido a la conmutabilidad de esta operación, obtienen el mismo valor, que luego se usa 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.

El procedimiento de negociación de claves de sesión get_common_key hace su trabajo utilizando el siguiente algoritmo:

int get_common_key(int socket)
{
	char local_hash[HASH_SIZE], remote_hash1[HASH_SIZE], remote_hash2[HASH_SIZE];
	char socket_buffer[PACKED_VALUE_LENTH + HASH_SIZE];
	time_t start_time, end_time;
	init_hash();
	printf("Создаем защищенный канал связи...\n");
	make_local_key();
	get_hash(local_key.packed, PACKED_VALUE_LENTH / 2, local_hash);
	time(&start_time);
	printf("Шифруем свою половину ключа...\n");
	encrypt_local_key();
	memcpy(socket_buffer, crypted_local_key, PACKED_VALUE_LENTH);
	memcpy(socket_buffer + PACKED_VALUE_LENTH, local_hash, HASH_SIZE);
	socket_send_buffer(socket, socket_buffer, PACKED_VALUE_LENTH + HASH_SIZE);
	if (socket_read_buffer(socket, socket_buffer, PACKED_VALUE_LENTH + HASH_SIZE) != (PACKED_VALUE_LENTH + HASH_SIZE)) return 0;
	memcpy(crypted_remote_key, socket_buffer, PACKED_VALUE_LENTH);
	memcpy(remote_hash1, socket_buffer + PACKED_VALUE_LENTH, HASH_SIZE);
	printf("Дешифруем чужую половину ключа...\n");
	decrypt_remote_key();
	time(&end_time);
	get_hash(remote_key.packed, PACKED_VALUE_LENTH / 2, remote_hash2);
	if (memcmp(remote_hash1, remote_hash2, HASH_SIZE) != 0) return 0;
	make_common_key();
	printf("Канал связи создан за %ld сек.\n\n", (long int)(end_time - start_time));
	return 1;
}

Los procedimientos de cifrado y descifrado de claves de sesión encrypt_local_key y decrypt_remote_key se describen aquí.

Un rasgo característico de este procedimiento es su total disposición para utilizar claves RSA de cualquier tamaño y algoritmos hash de cualquier tipo. Para ello se forma un búfer del tamaño PACKED_VALUE_LENTH + HASH_SIZE, cuyo tamaño (variable socket_buffer_size) se envía primero. Esto es necesario para que el servidor, después de leer este valor, sepa exactamente qué tamaño de transferencia entre suscriptores debe realizar (el procedimiento connect_server).

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