Используя ключи RSA, абоненты на начальной стадии (процедура get_common_key), генерируют случайные последовательности байт и обмениваются ними в зашифрованном виде. Этот обмен и называется прологом (дальнейшей, уже содержательной, связи). В упомянутой нами выше процедуре get_common_key к этому процессу (прологу) имеют отношение вот эти строки:
make_local_key(); get_hash(local_key.packed, PACKED_VALUE_LENTH / 2, local_hash); 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);
Размер пролога, как леко видеть, составляет PACKED_VALUE_LENTH + HASH_SIZE, то есть, зависит от разрядности используемых ключей RSA (параметр PACKED_VALUE_LENTH) и используемого в данной конкретной поставке алгоритма хэширования (параметр HASH_SIZE). Таким образом, он может меняться, что создавало бы проблемы центральному серверу в процедуре connect_server, если бы ему заранее, еще в ходе процедуры check_finger_print, абоненты, через высланный ими fingerprint, не сообщили значение своего prolog_size.
Легко видеть, что пролог состоит из двух частей: сгенерированной клиентом (в процедуре make_local_key) случайной последовательности local_key и хэша этой последовательности local_hash. При этом, хэш вычисляется до шифрования local_key, что обеспечивает надежность связи, поскольку расшифровать эту посылку может лишь партнер по связи, имеющий закрытый ключ RSA, а зашифровать может лишь абонент, которому этим партнером был лично передан для этого открытый ключ. Никакая атака посредника (man-in-the-middle), таким образом, в данном случае невозможна.
© Extra Systems, 2024 |