OpenSSLで大きなファイルを暗号化する方法
1. 概要
暗号化には、一般に2つのタイプがあります。秘密鍵または対称暗号化と公開鍵または非対称暗号化です。
このチュートリアルでは、これらの暗号化方法と、それらを使用してOpenSSLで大きなファイルを暗号化する方法に焦点を当てます。
2. 設定
fallocate コマンドを使用して、サンプルの大きなファイルを作成しましょう。
$ fallocate -l 900M sample.txt
これにより900MBのテキストファイルが作成され、-lフラグを使用してファイルの長さをバイト単位で表しました。 このチュートリアルでは、このファイルを使用します。
fallocate コマンドは、キロバイト(K)、メガバイト(M)、
echo コマンドを使用して、ファイルにテキストを追加できるようになりました。
$ echo "Encryption and decryption of large files with OpenSSL on Baeldung!!!" >> sample.txt
3. 対称暗号化と復号化
これは、ファイルまたは電子情報の暗号化と復号化に1つの秘密鍵またはパスワードのみが使用される暗号化の一種です。
AES(Advanced Encryption Standard)対称鍵暗号化アルゴリズムを使用します。 128、192、および256ビットの暗号化キー(秘密キー)をサポートして、128ビットのブロックでデータを暗号化および復号化します。
AESは単純な代数計算を使用し、データのすべてのブロックは常に同じ方法で暗号化されるため、大きなファイルの暗号化に最適です。ただし、この単純さにより、高度な攻撃に比べてブルートフォース攻撃に対して脆弱になります。 RSAのようなアルゴリズム。
3.1. 暗号化
このコマンドを使用して、sample.txtファイルを暗号化できます。
$ openssl enc -aes-256-cbc -pbkdf2 -p -in sample.txt -out sample.txt.enc
ファイルを暗号化するためのパスワードを入力するように求めるプロンプトが表示されます。 ファイルを復号化する必要があるたびに、このパスワードを使用します。
これにより、sample.txt.enc。という名前の暗号化された出力ファイルが作成されます。
上記のコマンドの内訳は次のとおりです。
- enc:対称鍵暗号化を実行します
- -aes-256-cbc:暗号化アルゴリズム、CBCモードのキーサイズ256ビットのAES
- -pbkdf2 :特に指定がない限り、デフォルトの反復回数でPBKDF2アルゴリズムを使用します
- -p :使用した塩、鍵、IVを印刷するために使用
- -in&-out :それぞれ入力ファイルと出力ファイルを表します
cat コマンドを使用して、出力ファイルのコンテンツが暗号化されていることを確認できます。
$ cat sample.txt.enc
���'I`Y��<��;|`/A�:1���.��Q"�T��1`)v��s��AXӏ�
��oBɼ7:����j�: 4ΐ��@�eQ�g�J����q��%��
...truncated
キーファイルを使用してファイルを暗号化することもできます。 これは、暗号化キーまたはライセンスキーを含むファイルです。
まず、キーファイルを作成する必要があります。
$ openssl rand 256 > symmetric_keyfile.key
キーファイルが生成されたら、サンプルファイルを暗号化できます。
$ openssl enc -in sample.txt -out sample.txt.enc -e -aes256 -k symmetric_keyfile.key
3.2. 復号化
sample.txt.enc ファイルを復号化するには、暗号化中に入力したパスワードを使用する必要があります。
次のコマンドを使用してファイルを復号化します。
openssl aes-256-cbc -d -pbkdf2 -in sample.txt.enc -out sample_decrypted.txt
-dを渡してファイルを復号化します。
パスワードの入力を求めるプロンプトが表示されます。入力すると、sample_decrypted.txtファイルが作成されます。
復号化されたファイルの内容を確認しましょう。
$ cat sample_decrypted.txt
Encryption and decryption of large file with OpenSSL on Baeldung
キーファイルを使用してファイルを暗号化した場合は、次のコマンドで復号化できます。
$ openssl enc -in sample.txt.enc -out sample_decrypted.txt -d -aes256 -k symmetric_keyfile.key
4. 非対称暗号化と復号化
これは、共有キーを使用して情報を暗号化および復号化する暗号化の一種です。
利用可能な多くの非対称暗号化アルゴリズムがあります。 ここでは、業界標準であるRSA(Rivest–Shamir–Adleman)アルゴリズムを使用します。
RSAは、データを暗号化するために比較的大きな素数に対して操作を実行し、すべてのブロックが異なる方法で暗号化されるため、非常にリソースを消費するアルゴリズムです。 これにより、各ブロックでこれらすべての計算を実行するのに時間がかかりすぎるため、大きなファイルの暗号化には理想的ではありません。
経験則として、RSAで暗号化する場合は、RSAキーの長さと同じ大きさのデータのみを暗号化する必要があります。
RSAは大きなファイルの暗号化には理想的ではありませんが、標準のAES対称暗号化から生成されたキーファイルを暗号化するために使用できます。
AESとRSAの両方を組み合わせて、より高いセキュリティで大きなファイルを効率的に暗号化する方法を見てみましょう。
4.1. 暗号化
まず、秘密鍵を生成する必要があります。
$ openssl genpkey -algorithm RSA -out private_key.pem -pkeyopt rsa_keygen_bits:2048
このコマンドを分解してみましょう。
- genpkey:は秘密鍵を生成します
- -アルゴリズムRSA:はRSAを公開鍵アルゴリズムとして設定します
- -pkeyopt:s公開鍵アルゴリズムオプションoptをvalueに設定します。 この場合、使用するビット数を定義できます。
- rsa_keygen_bits:2048:秘密鍵の長さを2048ビットに制限します
生成されたprivate_key.pemファイルの内容を確認できます。
$ cat private_key.pem
-----BEGIN PRIVATE KEY-----
MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQC4Du/lM5d8/jym
DaJud6oi5fbZcro3u7q7wa2JNbTXBtCbamCAdsBdss3jkbSN0shjRdK1X7GWfgsv
...truncated...
次に、生成した秘密鍵の公開鍵を生成する必要があります。
$ openssl rsa -pubout -in private_key.pem -out public_key.pem
writing RSA key
private_key.pemファイルを入力として渡します。
上記の秘密鍵で行ったように、catコマンドを使用してその内容を同様に表示できます。
次に、前に行ったように対称暗号化を使用して生成されたキーファイルを使用して、sample.txtファイルを暗号化する必要があります。
最後に、生成した公開鍵を使用して、上記で生成した鍵ファイルを暗号化できます。
$ openssl rsautl -encrypt -inkey public_key.pem -pubin -in symmetric_keyfile.key -out symmetric_keyfile.key.enc
ここでは、 rsautl フラグを使用して、RSAアルゴリズムを使用してデータを暗号化しました。
このコマンドは、symmetric_keyfile.key.encファイルを生成します。 このファイルの内容を表示しようとすると、ランダムな文字と数字のみが出力されます。
4.2. 復号化
ファイルを復号化するには、最初に生成した秘密鍵を使用してキーファイルを復号化する必要があります。
$ openssl rsautl -decrypt -inkey private_key.pem -in symmetric_keyfile.key.enc -out symmetric_keyfile.key
このコマンドは、symmetric_keyfile.keyファイルを出力します。
これで、通常のAES復号化コマンドを使用して大きなファイルを復号化できます。
$ openssl enc -in sample.txt.enc -out sample_decrypted.txt -d -aes256 -k symmetric_keyfile.key
秘密鍵を使用してファイルを暗号化し、公開鍵を使用してファイルを復号化することもできます。 このメソッドは、実際にはCSR(証明書署名要求)ファイルを作成して署名するための一部として使用されます。
5. 結論
この記事では、OpenSSLを使用して大きなファイルを暗号化および復号化する方法について説明しました。対称および非対称の暗号化方法と、各方法を使用して大きなファイルを暗号化または復号化する方法について説明しました。