Расшифровка 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
который ожидает, что шестнадцатеричный расшифровывает правильно.