秘密鍵を持っている人以外が復号化できないように、公開鍵で大きなファイルを暗号化するにはどうすればよいですか?
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ビットのサイズの鍵を作ろうとしましたが、運はありません、同じエラー
公開鍵暗号は、任意の長いファイルを暗号化するためのものではありません。対称暗号(AESなど)を使用して通常の暗号化を行います。新しいランダム対称キーが生成され、使用され、RSA暗号(公開キー)で暗号化されるたびに。暗号文と暗号化された対称キーが受信者に転送されます。受信者は自分の秘密キーを使用して対称キーを解読し、対称キーを使用してメッセージを解読します。
秘密鍵は決して共有されず、公開鍵のみがランダム対称暗号の暗号化に使用されます。
OpenSSLおよびコマンドラインで安全かつ高度にセキュリティで保護されたすべてのファイルをエンコードするためのソリューション:
PEM形式のファイルを暗号化するためのX.509証明書を用意しておく必要があります。
ファイルの暗号化:
openssl smime -encrypt -binary -aes-256-cbc -in plainfile.Zip -out encrypted.Zip.enc -outform DER yourSslCertificate.pem
何とは:
そのコマンドは、フォーマットに関係なく、大きなファイルを非常に効果的に強力に暗号化できます。
既知の問題:巨大なファイル(> 600MB)を暗号化しようとすると、何らかの問題が発生します。エラーはスローされませんが、暗号化されたファイルは破損します。常に各ファイルを確認してください! (またはPGPを使用します。これは、公開鍵を使用したファイル暗号化をより強力にサポートします)
ファイルの復号化:
openssl smime -decrypt -binary -in encrypted.Zip.enc -inform DER -out decrypted.Zip -inkey private.key -passin pass:your_password
何とは:
rsautl
を使用して大きなファイルを直接暗号化することはできません。代わりに、次のようなことをしてください。
openssl Rand
を使用してキーを生成します。 openssl Rand 32 -out keyfile
openssl rsautl
を使用してキーファイルを暗号化するopenssl enc
を使用してデータを暗号化します。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の内容を使用し、base64(-aオプション)ファイルにAES256を使用してファイルを暗号化します。非対称の暗号化を使用して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
これは、5GBを超えるファイルに対してテストされています。
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
これで完了です。他の人は復号化されたファイルを持ち、安全に送信されました。
openssl smime
で大きなファイル(> 600MB)を安全に暗号化するには、各ファイルを小さなチャンクに分割する必要があります。
# 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のメッセージサイズ制限(または特性)を手動で回避する代わりに、OpenSSLのS/mime機能を使用して同じことを行い、対称キーを手動で操作する必要がない方法を示します。