Это противоположно тому, что я делал в этом вопросе - https://crypto.stackexchange.com/questions/21021/encryption-and-hmac-in-a-pskc-file

Спецификация находится по адресу https://tools.ietf.org/rfc/rfc6030.txt.

Данные / семя зашифрованы с помощью AES-128-CBC &, а также ключа и IV. IV добавляется к зашифрованным данным, и все это кодируется в base-64 и сохраняется в поле CipherValue.

У меня есть (это из образца файла pskc, а не из RFC).

CipherValue/EncryptedText = v5dgOiUq1Hgja0g1SI9VpcHu81DLdcDqT8C3+k8wlQtk5KL1KErwojxLPSNO8lZt
Encryption Key = E9C1E401122EE194D620465A775D9C97
Algo = AES-128-CBC

Мне нужно получить расшифрованные данные из этого

Это то что я делаю

Я храню CipherValue в файле с именем cv.

openssl base64 -d -A < cv > cv.bin

Я получаю 48 байт cv.bin

Я разлил на 2 части

iv.bin = 16 bytes
data.bin = 32 bytes

Я конвертирую iv.bin в hex

xxd -p < iv.bin
bf97603a252ad478236b4835488f55a5

Так что мой

iv = bf97603a252ad478236b4835488f55a5

Я превращаю ключ в шестнадцатеричный

У меня есть файл вызова k.b64, который содержит E9C1E401122EE194D620465A775D9C97

openssl base64 -d -A < k.b64 > k.bin
xxd -p < k.bin
13d0b5138d35d76d84135f780fadb4e3ae40efbe43f42f7b

key = 13d0b5138d35d76d84135f780fadb4e3ae40efbe43f42f7b

Сейчас расшифровываю

openssl enc -aes-128-cbc -d  -K 13d0b5138d35d76d84135f780fadb4e3ae40efbe43f42f7b -iv bf97603a252ad478236b4835488f55a5  < data.bin

Я получаю следующую ошибку

▓\=Bt═┐|)éïh│■ìcbad decrypt
62008:error:06065064:digital envelope routines:EVP_DecryptFinal_ex:bad decrypt:.
\crypto\evp\evp_enc.c:539:

Что я здесь не так делаю?

1 ответ1

1

(Ответ из комментариев реорганизован в логический порядок.)

Значение ключа шифрования в этом примере E9C1E401122EE194D620465A775D9C97 составляет 32 символа , которые являются действительными шестнадцатеричными цифрами, которые по своей природе также являются допустимыми символами base64. Обычно нужно знать кодировку данных из процесса, который его создал (или, если применимо, отправил).

Очень маловероятно, что это значение будет base64, потому что кодировка base64 длиной более нескольких байтов, если только она не была специально создана, почти всегда будет содержать некоторые символы, не являющиеся шестнадцатеричными цифрами. И невозможно быть base64, потому что 32 символа base64, не использующие заполнение base64 (=), кодируют 24-байтовое значение, но мы знаем, что это ключ AES-128, который составляет 16 байтов.

Таким образом, этот ключ закодирован в шестнадцатеричном формате и передает его openssl enc -K который ожидает, что шестнадцатеричный код правильно расшифрован

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .