Автор: Реми ван Элст (Remy van Elst)
Содержание
- Получение публичного ключа
- Создание случайного файла пароля
- Шифрование файла случайным ключом
- Шифрование случайного ключа файлом публичного ключа
- Расшифровывание случайного ключа при помощи файла своего приватного ключа
- Расшифровывание большого файла случайным ключом
Из-за особенностей алгоритма 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.
Получение публичного ключа
Попросите получателя отправить вам его сертификат или публичный ключ. Если он отправил сертификат, можно извлечь из него публичный ключ с помощью следующей команды:
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В результате получим расшифрованный большой файл.
2 комментария:
Спасибо за статью.
пожалуйста
Отправить комментарий