Шифрование/дешифрование не работает между двумя разными версиями openssl.

Я скачал и скомпилировал openssl-1.1.0.

Я могу зашифровать и расшифровать, используя один и тот же исполняемый файл openssl (как здесь< /а>)

me@ubuntu:~/openssl-1.1.0$ LD_LIBRARY_PATH=. ./apps/openssl aes-256-cbc -a -salt -in file.txt -out file.txt.enc
enter aes-256-cbc encryption password: 123
Verifying - enter aes-256-cbc encryption password:
me@ubuntu:~/openssl-1.1.0$ LD_LIBRARY_PATH=. apps/openssl aes-256-cbc -a -d -in file.txt.enc -out file.txt.dec
enter aes-256-cbc decryption password: 123

Этот openssl использует: libcrypto.so.1.1, libssl.so.1.1

Когда я пытаюсь расшифровать с помощью openssl, установленного на моем Ubuntu, который использует: /lib/x86_64-linux-gnu/libssl.so.1.0.0, /lib/x86_64-linux-gnu/libcrypto.so.1.0.0

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

me@ubuntu:~/openssl-1.1.0$ openssl aes-256-cbc -a -d -in file.txt.enc -out file.txt.dec2
enter aes-256-cbc decryption password: 123
bad decrypt
140456117421728:error:06065064:digital envelope routines:EVP_DecryptFinal_ex:bad decrypt:evp_enc.c:539:

Что может быть причиной этого? Спасибо


person hudac    schedule 22.09.2016    source источник
comment
Предоставьте свои тестовые значения, ключ, iv, простые данные, зашифрованные данные непосредственно до и после операций шифрования/дешифрования. Кроме того, ключ слишком короткий, AES поддерживает только 128, 192 и 256-битные ключи, вы полагаетесь на заполнение клавиш, которое не является частью стандарта AES.   -  person zaph    schedule 22.09.2016
comment
Stack Overflow — это сайт для вопросов по программированию и разработке. Этот вопрос кажется не по теме, потому что он не о программировании или разработке. См. раздел О каких темах я могу задать здесь в Справочном центре. Возможно, Суперпользователь или Unix & Linux Stack Exchange лучше спросить. См. также раздел Где размещать вопросы о Dev Ops?   -  person jww    schedule 22.09.2016


Ответы (4)


Дайджест по умолчанию был изменен с MD5 на SHA256 в Openssl 1.1.

Попробуйте использовать -md md5

cgs@ubuntu:~$ echo "it-works!" > file.txt
cgs@ubuntu:~$ LD_LIBRARY_PATH=~/openssl-1.1.0/ openssl-1.1.0/apps/openssl aes-256-cbc -a -salt -in ~/file.txt -out ~/file.txt.enc -md md5
enter aes-256-cbc encryption password:
Verifying - enter aes-256-cbc encryption password:
cgs@ubuntu:~$ LD_LIBRARY_PATH=~/openssl-1.0.1f/ openssl-1.0.1f/apps/openssl aes-256-cbc -a -in ~/file.txt.enc -d
enter aes-256-cbc decryption password:
it-works!

Неприятные подробности:

Введенный пароль не используется aes (или другим шифрованием) как есть, но команда неявно извлекает из него ключ. Для получения ключа используется дайджест сообщения, который был изменен в openssl 1.1 .

Если вы хотите сохранить простой пароль и не начинать возиться с боевыми ключами (-K, -iv), просто принудительно введите тот же дайджест с помощью -md.

person idog    schedule 22.09.2016
comment
Провел большую часть дня, думая, что наш код сломался. Наткнулся на ваш ответ. Спас день! - person starfry; 21.06.2017
comment
как заставить md5 в программе C++? - person Adnan; 19.09.2017
comment
Да, указание дайджеста -md md5 работает, однако лучшим решением является повторное шифрование с использованием -md sha256 (и то же самое для расшифровки), которое более безопасно, чем md5, поэтому изменение дайджеста по умолчанию в новых версиях openssl - person Scott Stensland; 25.09.2017
comment
Не используйте md5. Он небезопасен и сломан. - person Aaron Brager; 05.06.2019
comment
+1, и да, более новое значение по умолчанию, очевидно, лучше (md5 также страдает от проблем с коллизиями), но в моем случае мне нужно было использовать его для расшифровки старых файлов, которые были зашифрованы с использованием более старого стандарта. - person Broper; 07.01.2020
comment
Вот почему я сейчас использую оболочку для openssl, чтобы сохранить параметры, используемые для шифрования файлов. Таким образом, файл может быть расшифрован, даже если обычные параметры, используемые для шифрования, меняются. По сути, он сохраняет метаданные шифрования, необходимые для расшифровки, особенно новый счетчик итераций v1.1.1 -pbkdf2, который со временем должен увеличиваться. Это в основном подтверждает шифрование в будущем. См. Keepout antofthy.gitlab.io/software/#keepout. - person anthony; 27.05.2020

Я протестировал шифрование и дешифрование AES с версией 1.1.0a (скачанной с openssl.org) и версией 1.0.2g-fips (из моей Ubuntu 16.04).

При использовании опции -p с двумя разными версиями openssl IV и ключ различаются:

$ LD_LIBRARY_PATH=~/openssl-1.1.0a/ ~/openssl-1.1.0a/apps/openssl aes-256-cbc -a -p -salt -in file -out file.enc
enter aes-256-cbc encryption password:
Verifying - enter aes-256-cbc encryption password:
salt=6A80B2A3B4CFE048
key=637E17094DF7892A7AFC14957EAA13991DFFD3273A2459EDA613F3AD8A406C38
iv =6AC7CE5C9AADC6C46C633BF5124DAFBF

$ openssl aes-256-cbc -a -d -p -in file.enc -out file.dec
enter aes-256-cbc decryption password:
salt=6A80B2A3B4CFE048
key=6220AF2E25CB0B5D9994A0A1B05503D82AC5B0B4C9015E241CACBF8BF62DAC77
iv =2DC04EF29AA57478EBE606DF87277EA6
bad decrypt
140557073118872:error:06065064:digital envelope routines:EVP_DecryptFinal_ex:bad decrypt:evp_enc.c:592:

Я подозреваю другое происхождение ключа и IV на основе соли с двумя версиями.

Если вы хотите избавиться от этой ошибки дешифрования, вы можете удалить параметр -salt и использовать параметры -K для ключа и -iv в вашей команде openssl.

person oliv    schedule 22.09.2016

Эта проблема также может возникать между OpenSSL 1.1 и LibreSSL. В этом случае и в других случаях, когда доступны более безопасные дайджесты сообщений, вам следует избегать использования -md md5 для шифрования новых файлов, поскольку алгоритм MD5 имеет значительные уязвимости.

Вместо этого вы должны использовать -md sha256 или какой-либо другой более безопасный дайджест сообщений, поддерживаемый всеми версиями. -md md5 следует использовать только для расшифровки старых файлов, и в идеале они должны быть повторно зашифрованы с использованием sha256. Это также упоминается в часто задаваемых вопросах по OpenSSL:

Дайджест сообщения используется для создания ключа шифрования/дешифрования из парольной фразы, введенной человеком. В OpenSSL 1.1.0 мы изменили MD5 на SHA-256. Мы сделали это как часть общего изменения, чтобы отказаться от небезопасного и сломанного алгоритма MD5. Если у вас есть старые файлы, используйте флаг "-md md5" для их расшифровки.


Чтобы проверить, какие дайджесты сообщений поддерживаются различными версиями, которые у вас есть, запустите openssl help:

LibreSSL 2.2.7 (входит в состав macOS 10.13 High Sierra):

$ openssl help
…
Message Digest commands (see the `dgst' command for more details)
gost-mac          md4               md5               md_gost94
ripemd160         sha               sha1              sha224
sha256            sha384            sha512            streebog256
streebog512       whirlpool
…

OpenSSL 1.1f:

$ openssl help
…
Message Digest commands (see the `dgst' command for more details)
blake2b512        blake2s256        gost              md4
md5               rmd160            sha1              sha224
sha256            sha384            sha512
…
person Aaron Brager    schedule 31.03.2018

Существуют различные строки ошибок, которые выдаются из openssl, в зависимости от соответствующих версий и сценариев. Ниже приведен контрольный список, который я использую в случае проблем, связанных с openssl:

  1. В идеале openssl может шифровать/дешифровать только с использованием одного и того же ключа (+ соль) и алгоритма enc.
  2. Убедитесь, что версии openssl (используемые для шифрования/дешифрования) совместимы. Например. хеш, используемый в openssl, изменился в версии 1.1.0 с MD5 на SHA256. Это создает другой ключ из того же пароля. Исправление: добавьте «-md md5» в 1.1.0 для расшифровки данных из более ранних версий и добавьте «-md sha256» в более ранних версиях для расшифровки данных из 1.1.0.

  3. Убедитесь, что на вашем компьютере установлена ​​единственная версия openssl. Если одновременно установлено несколько версий (на моей машине были установлены: «LibreSSL 2.6.5» и «openssl 1.1.1d»), убедитесь, что в вашей переменной PATH отображается только нужная версия.

person Ankush    schedule 04.02.2020