В настоящее время я разрабатываю SSH-клиент, и необходимо, чтобы клиент мог обмениваться ключами с сервером через ECDH KEX (NIST-256, 384 и 521).Извлечь общий секрет из класса ECDiffieHellmanCng
Я сделал несколько (на самом деле много) исследований, нашел .NET класс ECDiffieHellmanCng
и смог извлечь и импортировать открытый ключ сервера в класс.
Проблема в том, что я не могу извлечь общий секрет без его получения (ECDiffieHellmanCng.DeriveKeyMaterial(CngKey otherpartyPublicKey)
).
Есть ли способ прямого доступа к общему секрета («k», как он называется в документах RFC)?
Here является страница 7 из RFC реализации ECDH и почему мне нужен общий секрет:
Обмен хэш-H вычисляется как хэш конкатенации следующее.
строка V_C, строка идентификации клиента (CR и LF исключены)
строка V_s, строка идентификации сервера (CR и LF исключены)
строку I_C, полезную нагрузку SSH_MSG_KEXINIT клиента
строки I_S , полезная нагрузка SSH_MSG_KEXINIT сервера
струнные K_S, общественный хост-сервера ключей
Строка Q_C, эфемерное открытый ключ строка октетов клиента
струнные Q_S, эфемерное ключ октет струнные сервера общественного
mpint K, общий секрет < - вот почему мне нужен чистый секретный перед любым выводом
Спасибо за любые решения или подсказки!
Спасибо за ответ. Я пробовал, но это не сработало для меня. Решение может представлять собой определенную комбинацию prepend и append, поскольку для того, чтобы генерировать ключ с ожидаемой длиной, иногда требуется больше одного вывода. Документация Майкрософт о их деривации, однако, отсутствовала, поэтому я не стал задумываться о ней слишком много. Я отвечу так, чтобы кто-то другой с этой проблемой мог дать ему еще одну попытку. :) – Oachkatzl