Реми ван Элст. Шифрование и расшифровывание файлов публичными ключами с помощью OpenSSL из командной строки, 2015

Перевод статьи: Encrypt and decrypt files to public keys via the OpenSSL Command Line

Автор: Реми ван Элст (Remy van Elst)

Этот небольшой рецепт показывает, как использовать openssl из командной строки для шифрования файла публичным ключом и расшифровывания файла. Сначала мы создадим случайный ключ, зашифруем этот случайный ключ публичным ключом другого человека и с помощью этого случайного ключа зашифруем сам файл, используя симметричное шифрование.

Из-за особенностей алгоритма RSA, с его помощью невозможно шифровать большие файлы. Если создать ключ из n бит, то шифруемый файл не должен быть больше чем (n минус 11) бит. Наиболее эффективное использование RSA - шифрование случайного пароля, с последующим шифрованием файла паролем с помощью алгоритма симметричного шифрования. Если файл больше, чем размер ключа, то команда шифрования завершится ошибкой:

RSA operation error: 020:error:0406D06E:rsa routines:RSA_padding_add_PKCS1_type_2:data too large for key size:.\crypto\rsa\rsa_pk1.c:151:

Создадим случайный файл и используем его в качестве ключа для шифрования большого файла алгоритмом симметричного шифрования. Этот случайный файл выполнит роль пароля, который мы сообщим. Большой файл зашифруем маленьким файлом, выступающим в роли пароля. Затем отправим зашифрованный файл и зашифрованный ключ получателю, а он сможет расшифровать ключ своим приватным ключом и использовать этот ключ для расшифровывания большого файла.

Для работы с ключами RSA используются следующие команды:

Ключ - это просто строка случайных байтов. Воспользуемся строкой из 128 байтов, из которых в результате кодирования base64 получится 175 символов. Поскольку 175 символов - это 1400 бит, ключ получится достаточно маленьким, чтобы можно было зашифровать его при помощи RSA.

1. Получение публичного ключа

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

openssl rsa -in certificate.pem -out publickey.pem -outform PEM -pubout

2. Создание случайного файла пароля

Воспользуемся следующей командой, чтобы создать случайный ключ:

openssl rand -base64 128 -out key.bin

Делайте это при каждом шифровании файла. Каждый раз используйте новый ключ!

3. Шифрование файла случайным ключом

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

openssl enc -aes-256-cbc -salt -in largefile.pdf -out largefile.pdf.enc -pass file:./bin.key

Размер файла вырастет ненамного:

$ ls -larth
-rw-r--r-- 1 user group 40M Nov 9 21:14 Linux-Voice-Issue-020.pdf
-rw-r--r-- 1 user group 40M Nov 9 22:03 Linux-Voice-Issue-020.pdf.enc

Однако, он зашифрован:

$ file Linux-Voice-Issue-020.pdf
Linux-Voice-Issue-020.pdf: PDF document, version 1.4

$ file Linux-Voice-Issue-020.pdf.enc
Linux-Voice-Issue-020.pdf.enc: data

4. Шифрование случайного ключа файлом публичного ключа

Воспользуемся следующей командой для шифрования файла случайного ключа публичным ключом получателя:

openssl rsautl -encrypt -inkey publickey.pem -pubin -in key.bin -out key.bin.enc

Теперь можно без опаски отправить получателю key.bin.enc и largefile.pdf.enc.

Полезно также подписать оба файла своим публичным ключом.

5. Расшифровывание случайного ключа при помощи файла своего приватного ключа

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

openssl rsautl -decrypt -inkey privatekey.pem -in key.bin.enc -out key.bin

В результате получим расшифрованный случайный ключ, которым зашифрован полученный файл.

6. Расшифровывание большого файла случайным ключом

Как только был получен случайный ключ, можно расшифровать расшифрованным ключом зашифрованный файл:

openssl enc -d -aes-256-cbc -in largefile.pdf.enc -out largefile.pdf -pass file:./bin.key

В результате получим расшифрованный большой файл.

Написать автору перевода