Extra Systems

CYPHERNET

procedura di negoziazione della chiave di sessione


Dopo aver stabilito una connessione attraverso il server centrale Extra Systems Cypher Net con il programma di output, il programma di input genera una chiave di sessione casuale e la crittografa tramite RSA con la chiave pubblica dell'abbonato con il quale vengono condotte le trattative. Quindi l'input gli invia questa crittografia e subito dopo invia l'hash della chiave generata. Eventi simili si verificano all'altra estremità della connessione nel programma di output.

Dopo aver ricevuto le informazioni specificate dal partner, l'input decrittografa la chiave di sessione con la sua chiave privata RSA e verifica la corrispondenza dell'hash. Quindi entrambi i partecipanti alla comunicazione (input e output) modulo sommano le sequenze casuali che hanno generato (questo viene fatto dalla procedura make_common_key) e, grazie alla commutabilità di questa operazione, ottengono lo stesso valore, che viene poi utilizzato come chiave di sessione. Tutte queste azioni vengono eseguite dalla procedura get_common_key, che è la stessa sia nel ricevitore che nel trasmettitore.

La procedura di negoziazione della chiave di sessione get_common_key svolge il suo lavoro utilizzando il seguente 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;
}

Le procedure di crittografia e decrittografia delle chiavi di sessione encrypt_local_key e decrypt_remote_key sono descritte qui.

Una caratteristica di questa procedura è la sua completa disponibilità all'uso di chiavi RSA di qualsiasi dimensione e algoritmi hash di qualsiasi tipo. A questo scopo viene formato un buffer di dimensione PACKED_VALUE_LENTH + HASH_SIZE, la cui dimensione (variabile socket_buffer_size) viene inviata per prima. Ciò è necessario affinché il server, dopo aver letto questo valore, sappia esattamente quale dimensione del trasferimento tra gli abbonati deve effettuare (procedura connect_server).

Il contenuto di questa pagina è disponibile anche in inglese, francese, tedesco, portoghese, spagnolo, ucraino e russo.


© Extra Systems, 2024 Extra Web Top