Як використовувати OpenSSL для шифрування / розшифрування файлів?


205

Я хочу зашифрувати та розшифрувати один файл за допомогою одного пароля.

Як я можу використовувати OpenSSL для цього?


2
Ви повинні отримати ключ і IV з пароля, використовуючи PKCS5_PBKDF2_HMAC. Ви повинні використовувати EVP_*функції для шифрування та дешифрування. Дивіться симетричне шифрування та дешифрування EVP на вікі OpenSSL. Насправді, ймовірно, ви повинні використовувати автентифіковане шифрування, оскільки воно забезпечує як конфіденційність, так і справжність. Дивіться автентифіковані шифрування та дешифрування EVP на вікі OpenSSL.
jww

3
З вашого запитання не зрозумійте, чому ви хочете OpenSSL. У коментарі нижче показано, що GPG кращий - також через безпеку. stackoverflow.com/a/31552829/952234 Я голосую проти.
Ярослав Нікітенко

Відповіді:


261

Попередження про безпеку : AES-256-CBC не забезпечує автентифіковане шифрування і є вразливим для атаки оракула . Ви повинні використовувати щось на зразок віку .

Шифрувати:

openssl aes-256-cbc -a -salt -in secrets.txt -out secrets.txt.enc

Розшифрувати:

openssl aes-256-cbc -d -a -in secrets.txt.enc -out secrets.txt.new

Детальніше про різні прапори


18
Відповідь, ймовірно, не є оптимальною (станом на цей текст) залежно від випадку використання ОП. Зокрема, параметри "-a", ймовірно, не є оптимальними, і відповідь не пояснює його використання. "-a" зазвичай використовується, коли зашифрований вихід повинен передаватися у ASCII / текстовій формі і має ефект збільшення розміру виводу порівняно з двійковою формою. Оригінальний плакат не визначає формат виводу, тому я вважаю, що принаймні це слід згадати. Дивіться відповідь: stackoverflow.com/a/31552829/952234, яка також містить примітку про те, чому для цього завдання слід використовувати gpg замість openssl.
пн

7
Не використовуйте вищевказану команду, оскільки немає ключового виведення. Детальніше читайте тут: opensl слабке виведення ключів
jonasl

Також слід вказати ключ або згадати, звідки він походить. Це посилено?
Tuntable

2
@jonasl, згідно з останньою сторінкою, вказується: "Дайджест за замовчуванням був змінений з MD5 на SHA256 в Openssl 1.1.0." Джерело: github.com/openssl/openssl/blob/master/doc/man1/enc.pod
Кебман

2
Додаючи до коментаря від @Kebman, ви можете додати -md sha256до своєї команди кодування та декодування, якщо плануєте використовувати цей файл на іншій машині. Це повинно покрити вас проти несумісності / відмінності версії OpenSSL
dev-rowbot

162

Коротка відповідь:

Ви, ймовірно, хочете використовувати gpgзамість opensslцього, дивіться "Додаткові примітки" в кінці цієї відповіді. Але відповісти на питання, використовуючи openssl:

Для шифрування:

openssl enc -aes-256-cbc -in un_encrypted.data -out encrypted.data

Дешифрувати:

openssl enc -d -aes-256-cbc -in encrypted.data -out un_encrypted.data

Примітка. Під час шифрування чи розшифрування вам буде запропоновано ввести пароль.


Довга відповідь:

Найкращим джерелом інформації для openssl enc, ймовірно, буде: https://www.openssl.org/docs/man1.1.1/man1/enc.html

Командний рядок: openssl enc приймає таку форму:

openssl enc -ciphername [-in filename] [-out filename] [-pass arg]
[-e] [-d] [-a/-base64] [-A] [-k password] [-kfile filename] 
[-K key] [-iv IV] [-S salt] [-salt] [-nosalt] [-z] [-md] [-p] [-P] 
[-bufsize number] [-nopad] [-debug] [-none] [-engine id]

Пояснення найбільш корисних параметрів стосовно вашого питання:

-e
    Encrypt the input data: this is the default.

-d    
    Decrypt the input data.

-k <password>
    Only use this if you want to pass the password as an argument. 
    Usually you can leave this out and you will be prompted for a 
    password. The password is used to derive the actual key which 
    is used to encrypt your data. Using this parameter is typically
    not considered secure because your password appears in 
    plain-text on the command line and will likely be recorded in 
    bash history.

-kfile <filename>
    Read the password from the first line of <filename> instead of
    from the command line as above.

-a
    base64 process the data. This means that if encryption is taking 
    place the data is base64 encoded after encryption. If decryption 
    is set then the input data is base64 decoded before being 
    decrypted.
    You likely DON'T need to use this. This will likely increase the
    file size for non-text data. Only use this if you need to send 
    data in the form of text format via email etc.

-salt
    To use a salt (randomly generated) when encrypting. You always
    want to use a salt while encrypting. This parameter is actually
    redundant because a salt is used whether you use this or not 
    which is why it was not used in the "Short Answer" above!

-K key    
    The actual key to use: this must be represented as a string
    comprised only of hex digits. If only the key is specified, the
    IV must additionally be specified using the -iv option. When 
    both a key and a password are specified, the key given with the
    -K option will be used and the IV generated from the password 
    will be taken. It probably does not make much sense to specify 
    both key and password.

-iv IV
    The actual IV to use: this must be represented as a string 
    comprised only of hex digits. When only the key is specified 
    using the -K option, the IV must explicitly be defined. When a
    password is being specified using one of the other options, the 
    IV is generated from this password.

-md digest
    Use the specified digest to create the key from the passphrase.
    The default algorithm as of this writing is sha-256. But this 
    has changed over time. It was md5 in the past. So you might want
    to specify this parameter every time to alleviate problems when
    moving your encrypted data from one system to another or when
    updating openssl to a newer version.

Додаткові нотатки:

Хоча ви спеціально запитали про OpenSSL, ви можете розглянути можливість використання GPG замість цього для шифрування на основі цієї статті OpenSSL проти GPG для шифрування резервних копій за межами сайту?

Щоб використовувати GPG, щоб зробити те саме, ви використовуєте наступні команди:

Для шифрування:

gpg --output encrypted.data --symmetric --cipher-algo AES256 un_encrypted.data

Дешифрувати:

gpg --output un_encrypted.data --decrypt encrypted.data

Примітка. Під час шифрування чи розшифрування вам буде запропоновано ввести пароль.


8
Чудовий коментар щодо переваги GPG перед OpenSSL. Мені здається неймовірним те, що OpenSSL використовує такий слабкий хеш, що походить від ключа!
Марк

2
Обов’язково використовуйте параметр "-md md5" для сумісності з файлами, які були зашифровані на старих openssl без вказаної опції -md, інакше ви виявите, що файли не розшифруються на новіших системах: github.com/libressl-portable/ портативний / випуски / 378
Сем Ліддікотт

1
Значення за замовчуванням змінюються між версіями openssl. 1.0.x використовує за замовчуванням md5 для параметра -md. У версії 1.1.x використовується sha256. Якщо ви розшифруєте та отримаєте помилку ": цифровий конверт: EVP_DecryptFinal_ex: неправильне розшифрування". спробуйте вказати "-md md5" або "-md sha256".
txyoji

1
"Вам буде запропоновано ввести пароль під час шифрування чи розшифрування." gpgдозволяє мені розшифрувати файл, не запрошуючи пароль. Схоже, що пароль зберігається протягом певного періоду часу, якого я не хочу.
користувач76284

1
@moo Також здається, що параметр --no-symkey-cacheвимикає кешування під час використання gpg з --symmetric, навіть якщо агент працює.
користувач76284

32

Шифрувати:

openssl enc -in infile.txt -out encrypted.dat -e -aes256 -k symmetrickey

Розшифрувати:

openssl enc -in encrypted.dat -out outfile.txt -d -aes256 -k symmetrickey

Детальніше див. У openssl(1)документах.


11
Щоб використовувати пароль простого тексту, замініть -k symmetrickey з -pass stdinабо-pass 'pass:PASSWORD'
Zenexer

3
Не використовуйте вищевказану команду, оскільки немає ключового виведення. Детальніше читайте тут: opensl слабке ключове виведення
jonasl

4
Що стосується коментаря @ jonasl, зауважте, що -k symmetrickeyце вводить в оману. Цей -kпараметр використовується для введення пароля, з якого OpenSSL отримує симетричний ключ. Якщо ви хочете вказати симетричний ключ, потрібно скористатися -Kпараметром.
користувач1071847

13

НЕ ВИКОРИСТОВУЙТЕ КОНСУЛЬТАТИВНІ КЛЮЧОВІ ПЕРЕВІРКИ ВІДКРИТТЯ

В даний час прийнята відповідь використовує її, і вона більше не рекомендується і захищена.

Для зловмисника дуже доцільно просто збити грубу силу.

https://www.ietf.org/rfc/rfc2898.txt

PBKDF1 застосовує хеш-функцію, яка має бути MD2 [6], MD5 [19] або SHA-1 [18], для отримання ключів. Довжина похідного ключа обмежена довжиною виводу хеш-функції, яка становить 16 октетів для MD2 і MD5 і 20 октетів для SHA-1. PBKDF1 сумісний з процесом виведення ключа в PKCS # 5 v1.5. PBKDF1 рекомендується застосовувати лише для сумісності з існуючими програмами, оскільки ключі, які він створює, можуть бути недостатньо великими для деяких програм.

PBKDF2 застосовує псевдовипадкову функцію (див. Додаток В.1 для прикладу) для отримання ключів. Довжина похідного ключа по суті не обмежена. (Однак максимально ефективний простір пошуку похідного ключа може бути обмежений структурою основної псевдовипадкової функції. Для подальшого обговорення див. Додаток В.1.) Для нових програм рекомендується використовувати PBKDF2.

Зробити це:

openssl enc -aes-256-cbc -pbkdf2 -iter 20000 -in hello -out hello.enc -k meow

openssl enc -d -aes-256-cbc -pbkdf2 -iter 20000 -in hello.enc -out hello.out

Примітка : Ітерації в дешифруванні повинні бути такими ж, як ітерації в шифруванні.

Ітерацій має бути не менше 10000. Ось хороша відповідь щодо кількості ітерацій: https://security.stackexchange.com/a/3993

Також ... у нас є достатньо людей, які рекомендують GPG. Прочитайте прокляте питання.


4

Для шифрування:

$ openssl bf < arquivo.txt > arquivo.txt.bf

Дешифрувати:

$ openssl bf -d < arquivo.txt.bf > arquivo.txt

bf === Укус у режимі CBC


3

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

Енципт:

openssl enc -aes-256-cbc -a -salt -in {raw data} -out {encrypted data} -pass file:{random key}

Розшифрувати:

openssl enc -d -aes-256-cbc -in {ciphered data} -out {raw data}

У мене є повний підручник з цього приводу на веб-сайті http://bigthinkingapplied.com/key-based-encryption-using-openssl/


3

Зауважте, що OpenSSL CLI використовує слабкий нестандартний алгоритм для перетворення парольної фрази в ключ та встановлення результатів GPG у різні файли, додані до домашнього каталогу та фоновий процес gpg-агента. Якщо ви хочете отримати максимальну портативність та контроль за допомогою існуючих інструментів, ви можете використовувати PHP або Python для доступу до API нижчого рівня та безпосередньо для передачі у повному обсязі AES Key та IV.

Приклад виклику PHP через Bash:

IV='c2FtcGxlLWFlcy1pdjEyMw=='
KEY='Twsn8eh2w2HbVCF5zKArlY+Mv5ZwVyaGlk5QkeoSlmc='
INPUT=123456789023456

ENCRYPTED=$(php -r "print(openssl_encrypt('$INPUT','aes-256-ctr',base64_decode('$KEY'),OPENSSL_ZERO_PADDING,base64_decode('$IV')));")
echo '$ENCRYPTED='$ENCRYPTED
DECRYPTED=$(php -r "print(openssl_decrypt('$ENCRYPTED','aes-256-ctr',base64_decode('$KEY'),OPENSSL_ZERO_PADDING,base64_decode('$IV')));")
echo '$DECRYPTED='$DECRYPTED

Це виводи:

$ENCRYPTED=nzRi252dayEsGXZOTPXW
$DECRYPTED=123456789023456

Ви також можете використовувати openssl_pbkdf2функцію PHP для безпечного перетворення парольної фрази в ключ.


Тепер Clons Openssl реалізує та попереджає користувачів, що вони повинні використовувати PBKDF2 для хешування паролів. Однак кількість ітерацій за замовчуванням дуже низька і повинна бути значно більшою.
антоній

2

В Інтернеті є програма з відкритим кодом, яка використовує openssl для шифрування та дешифрування файлів. Це робиться за допомогою одного пароля. Чудова річ у цьому скрипті з відкритим кодом - це те, що він видаляє оригінальний незашифрований файл, подрібнюючи файл. Але небезпечна річ у тому, що коли оригінал незашифрованого файлу зник, ви повинні переконатися, що ви запам’ятали свій пароль, інакше вони не будуть іншим способом розшифрувати ваш файл.

Ось посилання воно є на github

https://github.com/EgbieAnderson1/linux_file_encryptor/blob/master/file_encrypt.py


Речі змінилися при використанні openssl для шифрування файлів, їх набагато більше варіантів, які потрібно пам’ятати, щоб ви могли успішно розшифрувати зашифровані файли. Одним з варіантів цього рішення є "підтримка" antofthy.gitlab.io/software/#keepout
anthony

2

Як було сказано в інших відповідях, попередні версії openssl використовували слабку функцію виведення ключа, щоб отримати ключ шифрування AES з пароля. Однак, openssl v1.1.1 підтримує більш сильну функцію виведення ключа, де ключ виводиться з пароля за pbkdf2допомогою випадково генерованої солі та багаторазових ітерацій хешування sha256 (за замовчуванням 10 000).

Для шифрування файлу:

 openssl aes-256-cbc -e -salt -pbkdf2 -iter 10000 -in plaintextfilename -out encryptedfilename

Щоб розшифрувати файл:

  openssl aes-256-cbc -d -salt -pbkdf2 -iter 10000 -in encryptedfilename -out plaintextfilename

Що, як ці параметри постійно змінюються, означає, що вам також потрібно вести облік, які параметри використовувались під час створення кожного зашифрованого файлу openssl. Тим більше, що з часом ітерація повинна збільшуватися! Для одного рішення розглядайте як відносно просту обгортку навколо openssl enc ... "Keepout" antofthy.gitlab.io/software/#keepout Він може розширюватися, включаючи більше Opensl - час триває.
антоній

@anthony виглядає як корисний проект. Також дивіться github.com/meixler/web-browser-based-file-encryption-decryption
mti2935

0

Додаткові коментарі до mti2935 хорошої відповіді.

Здається, що чим більше ітерація, тим кращий захист від грубої сили, і вам слід використовувати високу ітерацію, оскільки ви можете дозволити собі ефективність / ресурс.

На моєму старому Intel i3-7100 шифрування досить великого файлу 1,5 Гб:

 time openssl enc -aes256 -e -pbkdf2 -iter 10000 -pass pass:"mypassword" -in "InputFile" -out "OutputFile"
 Seconds: 2,564s

 time openssl enc -aes256 -e -pbkdf2 -iter 262144 -pass pass:"mypassword" -in "InputFile" -out "OutputFile"
 Seconds:  2,775s

Насправді немає різниці, не перевірив використання пам'яті, хоча (?)

З сьогоднішніми графічними процесорами та ще швидшими завтрашніми днями, мабуть, мільярд жорстоких ітерацій здається можливим щосекунди.

12 років тому NVIDIA GeForce 8800 Ultraможна було повторити понад 200 000 мільйонів / сек ітерацій (проте хешування MD5)

джерело: Ainane-Barrett-Johnson-Vivar-OpenSSL.pdf

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.