Расшифровка с помощью AES и CryptoAPI? Когда вы знаете КЛЮЧ / СОЛЬ - PullRequest
3 голосов
/ 06 октября 2009

Хорошо, у меня есть запатентованный двоичный формат. Это в основном свободная упаковка нескольких разных наборов растровых данных. В любом случае, в прошлом просто прочитать это и распаковать было легкой задачей. Но теперь в следующей версии растровые XML-данные теперь должны быть зашифрованы с использованием AES-256 (не мой выбор, и у нас нет выбора).

Теперь нам в основном отправили ключ AES вместе с солью, которую они используют, чтобы мы могли изменить наш распаковщик.

ПРИМЕЧАНИЕ. ЭТИ КЛЮЧИ НЕ ТОЛЬКО ПРИМЕР:

Каждый из них представляет собой 63-байтовые символы ASCII:

Key: "QS;x||COdn'YQ@vs-`X\/xf}6T7Fe)[qnr^U*HkLv(yF~n~E23DwA5^#-YK|]v."
Salt: "|$-3C]IWo%g6,!K~FvL0Fy`1s&N<|1fg24Eg#{)lO=o;xXY6o%ux42AvB][j#/&"

Мы в основном хотим использовать C ++ CryptoAPI для расшифровки этого (я также единственный программист здесь на этой неделе, и это будет запущено завтра. Не по нашей вине). Я искал простое руководство по реализации этого. К сожалению, я даже не могу найти учебник, в котором есть соль и ключ по отдельности. По сути, все, что у меня есть сейчас, - это небольшая функция, которая принимает массив BYTE. Наряду с его длиной. Как я могу это сделать?

Я потратил большую часть утра, пытаясь сделать криптоАПИ головами / хвостами. Но период не идет хорошо: (

EDIT

Поэтому я спросил, как они его шифруют. Они используют C # и RijndaelManaged, что, насколько мне известно, не эквивалентно AES.

EDIT2

Хорошо, наконец-то получили именно то, что происходило, и они прислали нам неправильные ключи.

Они делают следующее:

Заполнение = PKCS7 CipherMode = CBC Ключ определяется как набор из 32 байтов в шестнадцатеричном формате. IV также определяется как набор из 32 байтов в шестнадцатеричном формате.

Они забрали соль, когда я спросил их.

Насколько сложно установить эти вещи в CryptoAPI с помощью заголовочного файла wincrypt.h .?

Ответы [ 2 ]

5 голосов
/ 06 октября 2009

AES-256 использует 256-битные ключи. В идеале каждый ключ в вашей системе должен быть одинаково вероятным. 63-байтовая строка будет 504 бит. Сначала вам нужно выяснить, как строка из 63 символов должна быть преобразована в 256 бит (предоставленные вами примеры не кодируются в base64). Далее, «соль» не является неотъемлемой частью AES. Вы можете ссылаться либо на вектор инициализации (IV) в режиме Cipher-Block-Chaining, либо на то, чтобы как-то обновить ключ.

Если бы я догадался, я предполагаю, что под "СОЛЬ" вы подразумеваете IV и, в частности, режим CBC.

Вам необходимо знать все это при использовании функций CAPI (например, decrypt ).

Если все это звучит запутанно, то, возможно, лучше изменить ваш дизайн, чтобы вам не пришлось беспокоиться о том, чтобы все это сделать правильно. Крипто сложно. Один плохой шаг может лишить законной силы всю безопасность. Подумайте о том, чтобы посмотреть этот комментарий на моем Руководстве по фигурным рисункам для AES .

ОБНОВЛЕНИЕ : Вы можете посмотреть на это для приблизительного начального пункта для C ++ CAPI. Вам понадобится шестнадцатеричная строка из 64 символов, чтобы получить 256 бит (256 бит / (4 бита / символ) == 64 символа). Вы можете конвертировать символы в биты самостоятельно.

Опять же, я должен предупредить, что быстрая и свободная игра с IV и ключами может иметь катастрофические последствия. Я изучил AES / Rijndael до уровня математики и гейта и даже написал свою собственную реализацию. Однако в моем производственном коде я придерживаюсь хорошо проверенной реализации TLS, если это вообще возможно для данных в пути. Даже для данных в состоянии покоя было бы лучше использовать библиотеку более высокого уровня .

0 голосов
/ 06 октября 2009

Rijndael - это имя алгоритма для AES

...