воскресенье, 20 ноября 2016 г.

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

Перевод: Encrypt and decrypt files to public keys via the OpenSSL Command Line
Автор: Реми ван Элст (Remy van Elst)

Содержание
  1. Получение публичного ключа
  2. Создание случайного файла пароля
  3. Шифрование файла случайным ключом
  4. Шифрование случайного ключа файлом публичного ключа
  5. Расшифровывание случайного ключа при помощи файла своего приватного ключа
  6. Расшифровывание большого файла случайным ключом
Этот небольшой рецепт показывает, как использовать 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 используются следующие команды:
  • openssl genrsa: Создание приватных ключей RSA.
  • openssl rsa: Управление приватными ключами RSA (включая создание публичного ключа из приватного).
  • openssl rsautl: Шифрование и расшифровывание файлов ключами RSA.
Ключ - это просто строка случайных байтов. Воспользуемся строкой из 128 байтов, из которых в результате кодирования base64 получится 175 символов. Поскольку 175 символов - это 1400 бит, ключ получится достаточно маленьким, чтобы можно было зашифровать его при помощи RSA.

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

Попросите получателя отправить вам его сертификат или публичный ключ. Если он отправил сертификат, можно извлечь из него публичный ключ с помощью следующей команды:
openssl rsa -in certificate.pem -out publickey.pem -outform PEM -pubout
Создание случайного файла пароля

Воспользуемся следующей командой, чтобы создать случайный ключ:
openssl rand -base64 128 -out key.bin
Делайте это при каждом шифровании файла. Каждый раз используйте новый ключ!

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

Воспользуемся следующей командой, чтобы зашифровать большой файл случайным ключом:
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
Шифрование случайного ключа файлом публичного ключа

Воспользуемся следующей командой для шифрования файла случайного ключа публичным ключом получателя:
openssl rsautl -encrypt -inkey publickey.pem -pubin -in key.bin -out key.bin.enc
Теперь можно без опаски отправить получателю key.bin.enc и largefile.pdf.enc.

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

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

Если нужно расшифровать файл, зашифрованный описанным способом, воспользуйтесь следующей командой, указав ей свой приватный ключ (соответствующий публичному ключу, которым был зашифрован случайный ключ) для расшифровывания случайного ключа:
openssl rsautl -decrypt -inkey privatekey.pem -in key.bin.enc -out key.bin
В результате получим расшифрованный случайный ключ, которым зашифрован полученный файл.

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

Как только был получен случайный ключ, можно расшифровать расшифрованным ключом зашифрованный файл:
openssl enc -d -aes-256-cbc -in largefile.pdf.enc -out largefile.pdf -pass file:./bin.key
В результате получим расшифрованный большой файл.

1 комментарий:

Анонимный комментирует...

Спасибо за статью.