Après avoir établi une connexion via le serveur central Extra Systems Cypher Net avec le programme de sortie, le programme d'entrée génère une clé de session aléatoire et la crypte via RSA avec la clé publique de l'abonné avec lequel les négociations sont en cours. Ensuite, input lui envoie ce cryptage, et immédiatement après, il envoie le hachage de la clé générée. Des événements similaires se produisent à l’autre extrémité de la connexion dans le programme de sortie.
Après avoir reçu les informations spécifiées du partenaire, input déchiffre la clé de session avec sa clé privée RSA et vérifie la correspondance de hachage. Ensuite, les deux participants à la communication (entrée et sortie) ajoutent modulo les séquences aléatoires qu'ils ont générées (cela est fait par la procédure make_common_key) et, en raison de la commutabilité de cette opération, reçoivent la même valeur, qui est ensuite utilisée comme clé de session. Toutes ces actions sont effectuées par la procédure get_common_key, qui est la même dans le récepteur et dans l'émetteur.
La procédure de négociation de clé de session get_common_key effectue son travail en utilisant l'algorithme suivant:
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; }
Les procédures de chiffrement et de déchiffrement des clés de session encrypt_local_key et decrypt_remote_key sont décrites ici.
Une caractéristique de cette procédure est sa totale disponibilité à utiliser des clés RSA de toute taille et des algorithmes de hachage de tout type. A cet effet, un tampon de taille PACKED_VALUE_LENTH + HASH_SIZE est formé, dont la taille (variable socket_buffer_size) est envoyée en premier. Ceci est nécessaire pour que le serveur, après avoir lu cette valeur, sache exactement quelle taille de transfert entre abonnés il doit effectuer (procédure connect_server).
Le contenu de cette page est également disponible en anglais, allemand, ukrainien et en russe.
© Extra Systems, 2024 |