Как зашифровать большой файл в 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 ответов:
шифрование с открытым ключом не предназначено для шифрования произвольно длинных файлов. Один использует симметричный шифр (скажем, 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
. вместо этого сделайте что-то вроде следующего:
- создать ключ с помощью
openssl rand
, например.openssl rand 32 -out keyfile
- зашифровать ключевой файл с помощью
openssl rsautl
- шифрование данных с помощью
openssl enc
, используя сгенерированный ключ из Шага 1.- упакуйте зашифрованный ключевой файл с зашифрованными данными. получатель должен будет расшифровать ключ с помощью своего закрытого ключа, а затем расшифровать данные с получением ключ.
шифрование очень большого файла с помощью 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, чтобы сделать то же самое и не нужно жонглировать симметричным ключом вручную.