Как зашифровать большой файл в OpenSSL с помощью открытого ключа


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

Я могу сделать 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:.cryptorsarsa_pk1.c:151:

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

7 60

7 ответов:

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

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

решение для безопасного и высокозащищенного кодирования любого файла в 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))
  • зашифровать - выбранный метод для файла процесс
  • -binary - используйте безопасный файловый процесс. Обычно входное сообщение преобразуется в" канонический " формат в соответствии со спецификацией S/MIME, этот переключатель отключает его. Это необходимо для всех двоичных файлов (таких как изображения, звуки, ZIP-архивы).
  • - aes-256-cbc - выбран шифр AES в 256 бит для шифрования (strong). Если не указано 40 бит RC2 используется (очень слабый). (поддерживаемые шифры)
  • -в plainfile.молнии - имя входного файла
  • -из зашифрованных.застежка-молния.enc - имя выходного файла
  • - outform DER - кодирование выходного файла в двоичном виде. Если не указан, файл кодируется в base64 и размер файла будет увеличен на 30%.
  • yourSslCertificate.Пем - имя файла сертификата. Что должно быть в 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.ключ - имя файла закрытого ключа. Это должно быть в формате PEM и может быть зашифровано паролем.
  • - passin pass:your_password - ваш пароль для шифрования закрытого ключа. (аргументы фразу)

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

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

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

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

Генерация Случайных Паролей

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

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

безопасность

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

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.склеп.сдать в passwd.tmp, расшифровывает XXLarge.крипта на XXLarge2.данные, и удаляет 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

я нашел инструкции в 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

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

для безопасного шифрования больших файлов (>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

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

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