web-dev-qa-db-ja.com

公開鍵を使用して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:.\crypto\rsa\rsa_pk1.c:151:

私は1024から1200ビットのサイズの鍵を作ろうとしましたが、運はありません、同じエラー

68
yamuna mathew

公開鍵暗号は、任意の長いファイルを暗号化するためのものではありません。対称暗号(AESなど)を使用して通常の暗号化を行います。新しいランダム対称キーが生成され、使用され、RSA暗号(公開キー)で暗号化されるたびに。暗号文と暗号化された対称キーが受信者に転送されます。受信者は自分の秘密キーを使用して対称キーを解読し、対称キーを使用してメッセージを解読します。

秘密鍵は決して​​共有されず、公開鍵のみがランダム対称暗号の暗号化に使用されます。

74
n.m.

OpenSSLおよびコマンドラインで安全かつ高度にセキュリティで保護されたすべてのファイルをエンコードするためのソリューション:

PEM形式のファイルを暗号化するためのX.509証明書を用意しておく必要があります。

ファイルの暗号化:

openssl smime -encrypt -binary -aes-256-cbc -in plainfile.Zip -out encrypted.Zip.enc -outform DER yourSslCertificate.pem

何とは:

  • smime-S/MIMEユーティリティのsslコマンド( smime(1)
  • -encrypt-ファイル処理のために選択された方法
  • -binary-安全なファイルプロセスを使用します。通常、入力メッセージはS/MIME仕様の要求に応じて「標準」形式に変換され、このスイッチは無効にします。すべてのバイナリファイル(画像、音声、Zipアーカイブなど)に必要です。
  • -aes-256-cbc-暗号化のために256ビットで選択された暗号AES(強力)。指定しない場合、40ビットRC2が使用されます(非常に弱い)。 ( サポートされている暗号
  • -in plainfile.Zip-入力ファイル名
  • -out encrypted.Zip.enc-出力ファイル名
  • -outform DER-出力ファイルをバイナリとしてエンコードします。が指定されていない場合、ファイルはbase64でエンコードされ、ファイルサイズは30%増加します。
  • yourSslCertificate.pem-証明書のファイル名。これはPEM形式である必要があります。

そのコマンドは、フォーマットに関係なく、大きなファイルを非常に効果的に強力に暗号化できます。
既知の問題:巨大なファイル(> 600MB)を暗号化しようとすると、何らかの問題が発生します。エラーはスローされませんが、暗号化されたファイルは破損します。常に各ファイルを確認してください! (または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.key-秘密鍵のファイル名。これはPEM形式である必要があり、パスワードで暗号化できます。
  • -passin pass:your_password-秘密鍵暗号化のパスワード。 ( パスフレーズ引数
70
JakubBoucek

rsautlを使用して大きなファイルを直接暗号化することはできません。代わりに、次のようなことをしてください。

  1. openssl Randを使用してキーを生成します。 openssl Rand 32 -out keyfile
  2. openssl rsautlを使用してキーファイルを暗号化する
  3. ステップ1で生成されたキーを使用して、openssl encを使用してデータを暗号化します。
  4. 暗号化されたキーファイルと暗号化されたデータをパッケージ化します。受信者は自分の秘密鍵で鍵を復号化してから、結果の鍵でデータを復号化する必要があります。
30
Hasturkun

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
22
Ipswitch

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

これで完了です。他の人は復号化されたファイルを持ち、安全に送信されました。

16
Tom Saleeba

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
3

たぶん、あなたはこの質問に受け入れられた答えをチェックアウトする必要があります( 公開/秘密鍵を使用してPHPでデータを暗号化する方法? )質問。

RSAのメッセージサイズ制限(または特性)を手動で回避する代わりに、OpenSSLのS/mime機能を使用して同じことを行い、対称キーを手動で操作する必要がない方法を示します。

2
Cray