Введение
Я наконец дошел до публикации решения. Я надеюсь, что это поможет некоторым людям, которые могут делать подобные вещи. Там действительно не так много упоминаний о том, чтобы сделать это в другом месте.
Предпосылки
Для того, чтобы многое из этого имело смысл, необходимо прочитать показатель одного трюка , который позволяет экспортировать ключ сеанса в большой двоичный объект (колодец). известная структура байтов). Затем можно сделать то, что они хотят, с этим потоком байтов, но он содержит все важные ключи.
MSDN Документация сбивает с толку
В этом конкретном примере я использую Microsoft Enhanced Cryptographic Provider с алгоритмом Triple DES ( CALG_3DES ). Первое, что бросило меня в тупик, это то, что длина ключа указана в 168 битах, а длина блока - в 64 битах. Как длина ключа может быть 168? Три ключа по 56 бит? Что происходит с другим байтом?
Итак, с этой информацией я начал читать в другом месте, что последний байт действительно равен и по какой-то причине CryptoAPI удаляет это. Это действительно так? Кажется сумасшедшим, что они это сделают, но хорошо.
Расход ключа в .NET
Используя TripleDESCryptoServiceProvider , я заметил, что в документах указано, что:
Этот алгоритм поддерживает длину ключа от 128 до 192 бит с шагом 64 бита.
Так что, если CryptoAPI имеет длину ключа 168, как я получу это в .NET, который поддерживает только кратные 64? Таким образом, сторона API .NET учитывает паритет, а CryptoAPI - нет. Как можно себе представить ... смутился, я .
Итак, со всем этим я пытаюсь выяснить, как восстановить ключ на стороне .NET с правильной информацией о четности. Выполнимо, но не очень весело ... давайте просто оставим это на этом. Как только я получил все это на месте, все закончилось неудачей с капиталом F .
Все еще со мной? Хорошо, потому что я снова упал с лошади.
Лампочки и фейерверки
Низко и вот, так как я собираю MSDN для каждого последнего бита информации, я нахожу противоречивую часть в функции Win32 CryptExportKey . Низкий и вот я нахожу эту бесценную информацию:
Для любой из перестановок ключей DES, которые используют PLAINTEXTKEYBLOB, может быть экспортирован только полный размер ключа, включая бит четности. Поддерживаются следующие размеры ключей.
Алгоритм Поддерживаемый размер ключа
CALG_DES 64 бита
CALG_3DES_112 128 бит
CALG_3DES 192 бита
Таким образом, он экспортирует ключ, кратный 64 битам! Woohoo! Теперь исправим код на стороне .NET.
.NET Импорт кода твик
Порядок байтов важно помнить при импорте потока байтов, который содержит ключ, который был экспортирован как BLOB-объект из CryptoAPI. Два API не используют один и тот же порядок байтов, поэтому, как указывает @ nic-strong , реверсирование байтового массива необходимо до фактической попытки использования ключа. В остальном все работает как положено. Просто решено:
Array.Reverse( keyByteArray );
Заключение
Надеюсь, это кому-нибудь поможет. Я потратил слишком много времени, пытаясь отследить это. Оставьте любые комментарии, если у вас есть дополнительные вопросы, и я могу попытаться помочь заполнить любые детали.
Happy Crypto!