Расшифровка CipherValue в файле PSKC

Это противоположно тому, что я делал в этом вопросе - 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.

У меня есть (это из образца файла PSCC, а не из 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 ответ

Решение

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

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

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

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

Другие вопросы по тегам