Подтвердить что ты не робот

Предварительная тайна сглаживания при использовании обмена ключами Диффи-Хеллмана

Я пытаюсь реализовать DHE_DSS в пакет go crypto/tls. К сожалению, я не могу заставить PreMasterSecret (Z) быть таким же, мой основной рабочий процесс:

Сообщение об обмене ключа сервера приема

  • Выдержка P, G, Ys
  • Проверить использование цифровой подписи

Подготовить сообщение об обмене ключами клиента

  • Создать клиент Xc
  • Генерация Yc (Yc = G ^ Xc% P)
  • Создать Z (Z = Ys ^ Xc% P)
  • Отправить обратно Yc, упакованный следующим образом:
ckx := make([]byte, len(yC)+2)
ckx[0] = byte(len(Yc)>>8)
ckx[1] = byte(len(Yc))
copy(ckx[2:], yBytes)

Однако, когда я отлаживаю это с помощью gnutls-serv, оба PreMasterSecrets (Z) отличаются. Нужно ли мне подписать возвращенный Yc, или, может быть, упаковать его по-другому? Я не вижу ничего в RFC 5246, чтобы предложить это.

< - EDIT →

Вот патч моих изменений:

https://08766345559465695203.googlegroups.com/attach/48587532c74b4348/crypto.patch?part=4&view=1&vt=ANaJVrHbwydqEZc3zjUWqQ5C8Q5zEkWXZLdL0w6JJG3HYntOlBurUTY7mc9xR9OTfE0bJxs4eeL5a5SGd2jj9eIfXcwJQgLvJchXOgkYKBBynbPfshY8kuQ

4b9b3361

Ответ 1

Обмен ключами клиента будет содержать:

length (2 bytes) --> Y_C (in plain text)

Я реализовал TLS в Java, и я придерживаюсь той же структуры и отлично работает для меня.

Нужно ли мне подписать возвращаемый Yc?

Нет нет необходимости подписывать общедоступное значение клиента DH, оно передается простым текстом.

Вы можете взять pcap и проверить, переносятся ли те же значения в пакете. Кроме того, если GNU TLS имеет регистратор для печати полученного Y_C, вы можете проверить, получены ли правильные данные.

Если в случае, если вы все еще получаете разный секрет Pre-Master, тогда, похоже, возникает проблема с логикой генерации секретности.