Как зашифровать большой файл в 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 бит, не повезло, такая же ошибка
Ответы
Ответ 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
И все готово. У другого человека есть расшифрованный файл, и он был отправлен безопасно.