Как зашифровать большой файл в openssl с помощью открытого ключа - PullRequest
67 голосов
/ 22 августа 2011

Как я могу зашифровать большой файл открытым ключом, чтобы никто, кроме тех, у кого есть закрытый ключ, не смог его расшифровать?

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

openssl rsautl -encrypt -pubin -inkey public.pem -in myLargeFile.xml -out myLargeFile_encrypted.xml

и как я могу выполнить расшифровку также ....

я создаю свой закрытый и открытый ключ с помощью следующих команд

openssl genrsa -out private.pem 1024
openssl rsa -in private.pem -out public.pem -outform PEM -pubout

Я получаю эту ошибку:

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

Я пытался создать ключи с размерами от 1024 до 1200 бит, не повезло, такая же ошибка

Ответы [ 7 ]

74 голосов
/ 22 августа 2011

Криптография с открытым ключом не предназначена для шифрования произвольно длинных файлов.Один использует симметричный шифр (скажем, AES) для обычного шифрования.Каждый раз новый случайный симметричный ключ генерируется, используется, а затем шифруется с помощью шифра RSA (открытый ключ).Зашифрованный текст вместе с зашифрованным симметричным ключом передается получателю.Получатель расшифровывает симметричный ключ, используя свой закрытый ключ, а затем использует симметричный ключ для расшифровки сообщения.

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

71 голосов
/ 02 сентября 2012

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

Вы должны иметь готовый сертификат X.509 для шифрования файлов в формате PEM.

Шифрование файла:

openssl smime -encrypt -binary -aes-256-cbc -in plainfile.zip -out encrypted.zip.enc -outform DER yourSslCertificate.pem

Что есть что:

  • smime - команда ssl для утилиты S / MIME ( smime (1) )
  • -encrypt - выбранный метод для обработки файлов
  • -binary - использовать безопасный процесс файла. Обычно входное сообщение преобразуется в «канонический» формат, как того требует спецификация S / MIME, этот переключатель отключает его. Это необходимо для всех двоичных файлов (например, изображений, звуков, ZIP-архивов).
  • -aes-256-cbc - выбран шифр AES в 256 бит для шифрования (сильный). Если не указано, используется 40-битный RC2 (очень слабый). ( Поддерживаемые шифры )
  • -in plainfile.zip - имя входного файла
  • -out encrypted.zip.enc - имя выходного файла
  • -outform DER - кодировать выходной файл в двоичном виде. Если не указан, файл закодирован в base64, а размер файла будет увеличен на 30%.
  • yourSslCertificate.pem - имя файла вашего сертификата. Это должно быть в формате PEM.

Эта команда может очень эффективно сильно шифровать большие файлы независимо от ее формата.
Известная проблема: Что-то не так происходит, когда вы пытаетесь зашифровать огромный файл (> 600 МБ). Ошибка не выдана, но зашифрованный файл будет поврежден. Всегда проверяйте каждый файл! (или используйте PGP - с большей поддержкой шифрования файлов с открытым ключом)

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

openssl smime -decrypt -binary -in encrypted.zip.enc -inform DER -out decrypted.zip -inkey private.key -passin pass:your_password

Что есть что:

  • -информировать DER - аналогично -outform выше
  • -inkey private.key - имя файла вашего личного ключа. Это должно быть в формате PEM и может быть зашифровано паролем.
  • -passin pass: your_password - ваш пароль для шифрования закрытого ключа. ( аргументы парольной фразы )
30 голосов
/ 22 августа 2011

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

  1. Сгенерируйте ключ, используя openssl rand, например.openssl rand 32 -out keyfile
  2. Шифрование файла ключа с использованием openssl rsautl
  3. Шифрование данных с использованием openssl enc с использованием сгенерированного ключа из шага 1.
  4. Упаковка файла зашифрованного ключас зашифрованными данными.получатель должен будет расшифровать ключ с помощью своего закрытого ключа, а затем расшифровать данные с помощью полученного ключа.
22 голосов
/ 17 ноября 2013

Шифрование очень большого файла с использованием smime не рекомендуется, поскольку вы можете зашифровать большие файлы с помощью параметра -stream, но не можете расшифровать полученный файл из-за аппаратных ограничений см .: проблема с расшифровкой больших файлов

Как упоминалось выше, криптография с открытым ключом не предназначена для шифрования произвольно длинных файлов. Поэтому следующие команды будут генерировать парольную фразу, шифровать файл с использованием симметричного шифрования, а затем шифровать парольную фразу с использованием асимметричного (открытого ключа). Примечание: smime включает в себя использование первичного открытого ключа и резервного ключа для шифрования парольной фразы. Резервная пара открытого / закрытого ключа будет разумной.

Генерация случайного пароля

Установите значение RANDFILE для файла, доступного текущему пользователю, сгенерируйте файл passwd.txt и очистите настройки

export OLD_RANDFILE=$RANDFILE
RANDFILE=~/rand1
openssl rand -base64 2048 > passwd.txt
rm ~/rand1
export RANDFILE=$OLD_RANDFILE

Шифрование

Используйте приведенные ниже команды для шифрования файла с использованием содержимого passwd.txt в качестве пароля и AES256 в файл base64 (-a опция). Зашифруйте файл passwd.txt с помощью асимметричного шифрования в файл XXLarge.crypt.pass, используя первичный открытый ключ и резервный ключ.

openssl enc -aes-256-cbc -a -salt -in XXLarge.data -out XXLarge.crypt -pass file:passwd.txt
openssl smime -encrypt -binary -in passwd.txt -out XXLarge.crypt.pass -aes256 PublicKey1.pem PublicBackupKey.pem
rm passwd.txt

дешифрование

Расшифровка просто расшифровывает XXLarge.crypt.pass в passwd.tmp, расшифровывает XXLarge.crypt в XXLarge2.data и удаляет файл passwd.tmp.

openssl smime -decrypt -binary -in XXLarge.crypt.pass -out passwd.tmp -aes256 -recip PublicKey1.pem -inkey PublicKey1.key
openssl enc -d -aes-256-cbc -a -in XXLarge.crypt -out XXLarge2.data -pass file:passwd.tmp
rm passwd.tmp

Это было проверено на> 5 ГБ файлах.

5365295400 Nov 17 10:07 XXLarge.data
7265504220 Nov 17 10:03 XXLarge.crypt
      5673 Nov 17 10:03 XXLarge.crypt.pass
5365295400 Nov 17 10:07 XXLarge2.data
14 голосов
/ 27 ноября 2017

Я нашел инструкции в http://www.czeskis.com/random/openssl-encrypt-file.html полезными.

Чтобы перефразировать связанный сайт с именами файлов из вашего примера:

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

openssl rand -base64 32 > key.bin

Зашифруйте большой файл с помощью симметричного ключа

openssl enc -aes-256-cbc -salt -in myLargeFile.xml \
  -out myLargeFile.xml.enc -pass file:./key.bin

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

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

Уничтожить незашифрованный симметричный ключ, чтобы никто его не нашел

shred -u key.bin

На этом этапе вы отправляете зашифрованный симметричный ключ (key.bin.enc) и зашифрованный большой файл (myLargeFile.xml.enc) надругой человек

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

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

Теперь он может использовать симметричный ключ для расшифровки файла

openssl enc -d -aes-256-cbc -in myLargeFile.xml.enc \
  -out myLargeFile.xml -pass file:./key.bin

И все готово.У другого человека есть расшифрованный файл, и он был благополучно отправлен.

3 голосов
/ 19 ноября 2015

Для безопасного шифрования больших файлов (> 600 МБ) с помощью openssl smime вам придется разбивать каждый файл на маленькие куски:

# Splits large file into 500MB pieces
split -b 500M -d -a 4 INPUT_FILE_NAME input.part.

# Encrypts each piece
find -maxdepth 1 -type f -name 'input.part.*' | sort | xargs -I % openssl smime -encrypt -binary -aes-256-cbc -in % -out %.enc -outform DER PUBLIC_PEM_FILE

Для информации, вот как расшифровать и собрать все части вместе:

# Decrypts each piece
find -maxdepth 1 -type f -name 'input.part.*.enc' | sort | xargs -I % openssl smime -decrypt -in % -binary -inform DEM -inkey PRIVATE_PEM_FILE -out %.dec

# Puts all together again
find -maxdepth 1 -type f -name 'input.part.*.dec' | sort | xargs cat > RESTORED_FILE_NAME
2 голосов
/ 17 августа 2012

Возможно, вам следует проверить принятый ответ на этот вопрос ( Как зашифровать данные в php с помощью открытого / закрытого ключей? ).

Вместо того, чтобы вручную обходить ограничение размера сообщения (или, возможно, признак) RSA, он показывает, как использовать функцию S / mime в OpenSSL, чтобы сделать то же самое, и не нужно манипулировать симметричным ключом.вручную.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...