ClientHello
Клиент открывает соединение. Он предлагает TLS 1.3 и 3 набора шифров AES/ChaCha, перечисляет поддерживаемые группы для обмена ключами, начиная с X25519MLKEM768, и отправляет по key share для каждой из двух предпочтительных групп, в том числе гибридный key share длиной 1216 байт. Сообщение передаётся в открытом виде: секретов в нём пока нет.
Передано по сети · 1 483 байта
- Эти 1 478 байт совпадают с тем, что OpenSSL вывел для этой записи с параметром -msg.
Как это вычисляетсяKey share клиента
Ещё до первого сообщения клиент генерирует эфемерные ключи, которые предложит. Для гибридной группы это пара ключей ML-KEM-768 и пара ключей X25519, открытые ключи которых конкатенируются в один key share длиной 1216 байт; для отдельной группы X25519 генерируется свой, независимый ключ.
Определение
d, z ←$ B^32 FIPS 203 §7.1 (ek, dk) = ML-KEM-768.KeyGen_internal(d, z) FIPS 203 §6.1 x_c ←$ B^32, X_c = X25519(x_c, 9) RFC 7748 §5 share = ek ‖ X_c 1184 + 32 = 1216 RFC 10024 §4.1 y_c ←$ B^32, Y_c = X25519(y_c, 9) key_share: x25519 (0x001d)
Значения из этого сеанса
- d (32 байта) — разворачивается в секретный вектор
- 84745c7adf177dfb94e15c7cdef6f8006897b295bdafaadd090ef050c004b212
- z (32 байта) — секрет для неявного отклонения
- 921eb10b6b41e8f0221e0f7f164aadef44f4cba1139edd522c9f0860db6b0cde
- SHA-256 ключа инкапсуляции (1184 байта)
- 4a2903bee32a7a18d3294d93a4d24d6ecc8c07bc098bab31899689f87a572be8
- закрытый ключ X25519 клиента (гибридный key share)
- 784edfa4400a57540a7cbd71957c8ab182ae801a5c519755abe69f553b9e8c5d
- открытый ключ X25519 клиента (гибридный key share)
- 09e0802926363ed192b02f5261520f2056ba7af9a0acd1eee5bbe50181e0cf29
- закрытый ключ X25519 клиента (отдельный key share)
- d81df8305a5f24f9077b3d669885d0d7b93ec55fe405ccde814bac62e778f656
- открытый ключ X25519 клиента (отдельный key share)
- 67aab4deeec206fa89034014d772bdd47cedd7930610e81f634871565424f14d
Что это доказывает
- Генерация ключа ML-KEM-768 из seed воспроизводит ключ инкапсуляции из key share клиента.
- Все коэффициенты ключа инкапсуляции (их 768) меньше q = 3329 (наибольший — 3326), поэтому сервер принимает ключ (FIPS 203, § 7.2).
- Закрытый ключ X25519 даёт то же открытое значение, что и в гибридном key share клиента.
- Отдельный key share X25519 использует собственный ключ, не тот, что в гибридном key share.
Воспроизведите сами
printf '%s' 3054020100300b06096086480165030404020442804084745c7adf177dfb94e15c7cdef6f8006897b295bdafaadd090ef050c004b212921eb10b6b41e8f0221e0f7f164aadef44f4cba1139edd522c9f0860db6b0cde | unhex > client-mlkem.der openssl pkey -inform DER -in client-mlkem.der -pubout -outform DER | tail -c 1184 | openssl dgst -sha256 -binary | tohex
выводит 4a2903bee32a7a18d3294d93a4d24d6ecc8c07bc098bab31899689f87a572be8
printf '%s' 302e020100300506032b656e04220420784edfa4400a57540a7cbd71957c8ab182ae801a5c519755abe69f553b9e8c5d | unhex > x25519.der openssl pkey -inform DER -in x25519.der -pubout -outform DER | tail -c 32 | tohex
выводит 09e0802926363ed192b02f5261520f2056ba7af9a0acd1eee5bbe50181e0cf29