Подтвердить что ты не робот

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

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

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

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

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

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

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 бит, не повезло, такая же ошибка

4b9b3361

Ответ 1

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

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

Ответ 2

Решение для безопасного и высоко защищенного кодирования любого файла в 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 - тот же, что и выше,
  • -inkey private.key - имя файла вашего личного ключа. Это должно быть в формате PEM и может быть зашифровано с помощью пароля.
  • -passin pass: your_password - ваш пароль для шифрования секретного ключа. (аргументы passphrase)

Ответ 3

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

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

Ответ 4

Шифрование очень большого файла с помощью 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

Ответ 5

Чтобы безопасно шифровать большие файлы ( > 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

Ответ 6

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

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

Ответ 7

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

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