Шифрование Файлов с Помощью Пароля Используя OpenSSL

OpenSSL — это мощный набор инструментов, который может быть использован для шифрования файлов и сообщений.

Если Вы хотите использовать один и тот же пароль как для шифрования открытого текста, так и для его последующего расшифровывания, тогда Вам необходимо использовать алгоритм симметричного шифрования.

Из данной статьи Вы узнаете как шифровать и расшифровывать файлы и сообщения с помощью пароля из командной строки в Linux, используя OpenSSL.

Как: Зашифровать файл

$ openssl enc -aes-256-cbc -salt -in file.txt -out file.txt.enc
Опции Описание
openssl Утилита командной строки OpenSSL.
enc Шифрование с помощью симметричных алгоритмов шифрования.
-aes-256-cbc Использующийся алгоритм шифрования.
-salt Увеличивает стойкость шифрования.
-in Указывает входной файл.
-out Указывает выходной файл.

256bit AES — это криптографический алгоритм, который использует правительство Соединенных Штатов для шифрования информации на самом секретном уровне.

Опция-salt (соль) должна использоваться ВСЕГДА, если секретный ключ формируется на основе пароля.

Без использования опции -salt, существует возможность проведения высокоэффективной атаки по словарю, что приведет к раскрытию зашифрованных данных. Причина этого заключается в том, что без добавления ‘соли’, один и тот же пароль всегда генерирует один и тот же секретный ключ.

Когда используется соль, первые 8 байтов резервируются под нее. Она генерируется случайным образом при шифровании файла и считывается с зашифрованного файла во время дешифрации.

Как: Расшифровать файл

$ openssl enc -aes-256-cbc -d -in file.txt.enc -out file.txt
Опции Описание
-d Расшифровывает данные.
-in Указывает зашифрованный файл.
-out Указывает куда сохранить расшифрованный файл.

Base64 Кодирование и Декодирование

Кодирование в формат Base64, является стандартным методом для преобразования 8-битной двоичного информации, в ограниченное подмножество символов ASCII, для безопасной транспортировки через системы электронной почты и другие систем, которые не поддерживают 8-битный формат.

По умолчанию, зашифрованный файл создается в бинарном формате. Если вы собираетесь отправить его по электронной почте, IRC и т.д., Вы должны сохранить его в кодировке Base64. Чтобы зашифровать файл в кодировке Base64, необходимо добавить опцию -a:

$ openssl enc -aes-256-cbc -salt -a -in file.txt -out file.txt.enc
Опции Описание
-a Говорит OpenSSL что зашифрованные данные в кодировке Base64.

Так же, опция -a, должна быть указана при дешифрации:

$ openssl enc -aes-256-cbc -d -a -in file.txt.enc -out file.txt

Шифрование / Расшифровывание без запроса пароля

Так как пароль становится видимым, этот метод должен использоваться только там, где безопасность не является важной.

По умолчанию, пользователю предлагается вводить пароль в интерактивном режиме.

При написании BASH скрипта, Вы, возможно, захотите организовать ввод пароля не интерактивно, используя опцию -k.

Как раз для таких случаев было придумано шифрование с открытым ключом.

Шифрование файла, используя предоставленный пароль:

$ openssl enc -aes-256-cbc -salt -in file.txt -out file.txt.enc -k PASS

Дешифрация файла, используя предоставленный пароль:

$ openssl enc -aes-256-cbc -d -in file.txt.enc -out file.txt -k PASS

16 Replies to “Шифрование Файлов с Помощью Пароля Используя OpenSSL”

  1. $ openssl enc -aes-256-cbc -d -in file.txt.enc -out file.txt -k PASS

    I have used the last command line to decrypt a file but my lecturer hinted that I need to use a parameter related to encoding. What is it? The code is base64.

    1. if I understand your question correctly you need to add -a to your command for input in base64 format

  2. Thanks! That was super helpful.

  3. with -k password it is showing «error in input file»

  4. im trying to decrypt without specifying the file name as i want to do a whole folder and decrypt an encrypted folder via bash script.

  5. it gives an error message
    error:20074002:BIO routines:FILE_CTRL:system lib:bss_file.c:400:

  6. Help would be appreciated!

    I encrypted a .dmg file using openssl encryption on my Macbook Pro, keeping the output name the same as the input name. I didn’t know this would be problematic, as I am now unable to decrypt the .dmg file even with the correct password.

    Some folks say it could not be done, but it seemed to have worked for me. Now, I can’t open the file and am afraid it will be impossible to decrypt.

    Note: If I use the same code, but change the output name, it can decrypt just fine. My issue was that I encrypted the file using the same output name as the input, which has made it impossible for me to decrypt it.

    Here’s what the code looks like:
    openssl enc -aes-256-cbc -d -in /Users/huntert/Desktop/IMPT.dmg -out /Users/huntert/Desktop/IMPT.dmg
    enter aes-256-cbc encryption password:
    Verifying — enter aes-256-cbc encryption password:

    When I tried to decrypt it, I received the folllowing messages:
    enter aes-256-cbc decryption password:
    error reading input file

    I should’ve been more cautious and tried it on a rubbish file. Lesson learned.

  7. Hello, the option to give the password is
    -pass pass:
    or
    -pass file:
    works for ecoding & decoding

  8. hi,
    I have a problem to decrypt a file
    I have encrypted my file after I used this file in matlab (modulation ..) and then I cannot decrypt the extracted file from matlab
    error is » error reading file »
    what I have to do ?

  9. hello,
    thank you for this, very helpful.
    one thing I ask, where do I get the openssl (I assume executable) from to run the encrypt and decrypt?
    Neil

  10. Hello, how are you? I have an encrypted file which I forgot the password, it is a file (.evp), what command line do I get to decrypted it?

  11. Hello everybody,

    I’m tring to find out if will possible to decrypt a directory with a certificate private with open SSL.
    If you want a solution i’m here
    Thanks
    Kurtis

  12. Hello Thanks for this article.
    But how do we do this programmatically? I’ve a situation where I need to use a password to login to a server programmatically. We cannot hard code the password to decrypt the file. One option I know is to store the password in a vault but that takes too long/expensive to implement. Please suggest. thanks

    1. Hi,
      I used to deploy encrypted bash programs to production using openssl.
      I suggest looking at https://linuxconfig.org/using-openssl-to-encrypt-messages-and-files-on-linux
      Or,
      If your program is compiled code, then why not encrypt secret in a file (manually) then decrypt it in your code into a variable? Then, you can programmatically use it as input to your authentication process.
      Hope this helps.

      Here is a sample code in GNU-C:

      //------------------------------------
      int main (int argc, char *argv[], char *envp[]) {
        char *cmdstr = (char *) malloc (254);
        memset(cmdstr, '\0', sizeof(254));
        /* build the command string for encryption */
        strcpy(cmdstr, "openssl enc -aes-256-cbc -in file.txt -out file.txt.enc -iter 29 -pass pass:mysecret");
      
        /* encrypt */
        if (run_my_script (cmdstr) == -1)
          fprintf(stderr, "Failed to encrypt file\n");
      
        /* rebuilt the command string for decryption */
        strcpy(cmdstr, "openssl enc -aes-256-cbc -d -in file.txt.enc -out decrypted_file.txt -iter 29 -pass pass:mysecret");
      
        /* decrypt */
        if (run_my_script (cmdstr) == -1)
          fprintf(stderr, "Failed to decrypt file.txt.enc\n");
      
        free(cmdstr);
      
        return 0;
      }
      
      int run_my_script (const char *command) {
         int status;
         pid_t pid;
         pid = fork ();
         if (pid == 0) {
            /* This is the child process.  Execute the shell command. */
            execl (SHELL, SHELL, "-c", command, NULL);
            _exit (EXIT_FAILURE);
         }
         else if (pid < 0)
            /* The fork failed.  Report failure.  */
            status = -1;
         else
            /* This is the parent process.  Wait for the child to complete.  */
            if (waitpid (pid, &status, 0) != pid)
               status = -1;
         return status;
      }
  13. opriont -iter # is need
    e.g.
    ENCRYPT (interactive):

    openssl enc -aes-256-cbc -in file.txt.enc -out file.txt  -iter 29 -k PASS

    DECRYPT (interactive):

    openssl enc -aes-256-cbc -d -in file.txt.enc -out file.txt -iter 29 -k PASS

    ENCRYPT (non-interactive):

    openssl enc -aes-256-cbc -in file.txt.enc -out file.txt  -iter 29 -pass pass:mysecret

    DECRYPT (non-interactive):

    openssl enc -aes-256-cbc -d -in file.txt.enc -out file.txt -iter 29 -pass pass:mysecret

Добавить комментарий

Этот сайт использует Akismet для борьбы со спамом. Узнайте как обрабатываются ваши данные комментариев.