1. 概要

暗号化は、データをエンコードするプロセスであり、不正アクセスからデータを安全に保つことを目的としています。

このクイックチュートリアルでは、人気のある無料のソフトウェアである GPG (GNU Privacy Guard)を使用して、Linuxシステムでファイルを暗号化および復号化する方法を学習します。

2. 暗号化の基本

始める前に、いくつかの基本的な概念を理解してみましょう。

基本的に、すべてのタイプの暗号化(および復号化)には、主にパスフレーズまたはキーのいずれかが含まれます。これらは単なるデータ文字列です。

2.1. 暗号化の種類

暗号化と復号化のプロセスに関係するデータ文字列の数に応じて、2種類の暗号化があります。

暗号化と復号化の両方に1つのデータ文字列(パスフレーズ)のみが使用される場合、それは対称暗号化と呼ばれます。 暗号化されたファイルを他の人と共有する必要がない場合は、通常対称暗号化を使用します。 共有する場合は、 passphrase も共有する必要があります。これは、潜在的なリスク要因となる可能性があります。

一方、暗号化用と復号化用の2つのデータ文字列が関係する場合、それは非対称暗号化と呼ばれます。 したがって、データ文字列のペアはキーペアと呼ばれます。

非対称暗号化は、2つのデータ文字列のうち1つだけを共有する必要があるため、暗号化されたファイルの共有に適しています。 これについては、チュートリアルの後半で説明します。

2.2. キーの種類

非対称暗号化では、キーペアは公開キーと秘密キーの2つのキーで構成されます。

公開鍵は機密ではありません。 したがって、リスクなしで公開鍵を利害関係者と共有できます。

それどころか、常に秘密鍵を秘密にして、他の人と共有しないようにする必要があります。

データの暗号化/復号化に関しては、暗号化には常に公開鍵が使用され、復号化には秘密鍵が使用されます。

公開/秘密鍵はデジタル署名の分野でも使用できることを知っておく価値があるかもしれません。 このような場合、秘密鍵を使用して署名を作成し、対応する公開鍵を使用してその信頼性を検証します。

3. GPGのインストール

ターミナルウィンドウを開いて、GPGがインストールされているかどうかを確認しましょう。

> gpg --version
gpg (GnuPG) 2.2.4

インストールされていない場合は、先に進み、Linuxディストリビューションのパッケージマネージャーを使用してインストールします。

apt ベースのディストリビューションの場合:

> sudo apt install gnupg

または、 yum ベースのディストリビューションの場合:

> sudo yum install gnupg

GPGツールにはGUIとCLIの両方が付属していますが、例ではコマンドラインを使用します。

さらに、適切なオプションを使用して、無人モードでコマンドを実行します。

4. 対称暗号化

4.1. ファイルの暗号化

最初にサンプルファイルを作成して、ファイルの暗号化を試してみましょう。

> echo "Hello, Baeldung!" > greetings.txt

次に、 gpg コマンドを実行して、パスフレーズを使用してファイルを暗号化します。

> gpg --batch --output greetings.txt.gpg --passphrase mypassword --symmetric greetings.txt

その後、これにより、デフォルトのAES256アルゴリズムを使用して、同じ場所に暗号化ファイルgreetings.txt.gpgが作成されます。 別のアルゴリズムを使用するには、オプション— cipher-algoを使用できます。

4.2. ファイルの復号化

次に、前の例の暗号化されたファイルを復号化してみましょう。

> gpg --batch --output greetings1.txt --passphrase mypassword --decrypt greetings.txt.gpg
gpg: AES256 encrypted data
gpg: encrypted with 1 passphrase

これにより、復号化されたファイルgreetings1.txtが同じ場所に作成されます。

–batch オプションを省略すると、パスフレーズの入力を求められ、セッションに保存されることに注意してください。

したがって、セッションに保存されているパスワードをクリアするには、次のコマンドを実行できます。

echo RELOADAGENT | gpg-connect-agent

復号化されたファイルに戻って、復号化が成功したことを確認しましょう。

> diff -s greetings.txt greetings1.txt
Files greetings.txt and greetings1.txt are identical

5. 非対称暗号化

このタイプの暗号化には、送信者と受信者の2つの役割が関係します。

受信者は受信したファイルを復号化します。 したがって、レシーバーはキーペアの生成を担当します。 とりわけ、受信者は安全に秘密鍵を秘密にし、公開鍵のみを送信者と共有します。

送信者は、受信者が共有する公開鍵を使用して送信するファイルを暗号化します。

Ryanが受信者で、Samが送信者である例を使用して、これがどのように機能するかを見てみましょう。

簡単にするために、それぞれに2つのWork Folderを作成しましょう。これは、実際には2つの異なるシステムを表します。

> mkdir ryan
> mkdir sam

5.1. 公開鍵と秘密鍵のペアの生成

最初のステップは、受信者であるライアンが自分のフォルダーにキーペアを生成することです。

> cd ryan
> gpg --batch --generate-key <<EOF
    Key-Type: RSA
    Key-Length: 3072
    Subkey-Type: RSA
    Subkey-Length: 3072
    Name-Real: Ryan
    Name-Email: [email protected]
    Passphrase: ryanpassword
    Expire-Date: 30
    %pubring ryanpubring.kbx
    %commit
EOF

これにより、キーペアが生成され、同じ場所にあるryanpubring.kbxキーリングファイルに保存されます。

キーリングファイルに対して行われた公開鍵エントリを見てみましょう。

> gpg --keyring ./ryanpubring.kbx --no-default-keyring --list-keys

./ryanpubring.kbx
-----------------
pub   rsa3072 2019-10-27 [SCEA] [expires: 2019-11-26]
      120C528F1D136BCF7AAACEE6D6BA055613B064D7
uid           [ unknown] Ryan <[email protected]>
sub   rsa3072 2019-10-27 [SEA] [expires: 2019-11-26]

pubインジケーターは公開鍵用です。

同様に、秘密鍵のエントリを表示できます。

> gpg --keyring ./ryanpubring.kbx --no-default-keyring --list-secret-keys

./ryanpubring.kbx
-----------------
sec   rsa3072 2019-10-27 [SCEA] [expires: 2019-11-26]
      120C528F1D136BCF7AAACEE6D6BA055613B064D7
uid           [ultimate] Ryan <[email protected]>
ssb   rsa3072 2019-10-27 [SEA] [expires: 2019-11-26]

ここで、 sec は、これが秘密鍵または秘密鍵であることを示します。

5.2. 公開鍵の共有

キーの生成が成功すると、ライアンは公開キーをキーリングからファイルにエクスポートできます。

> gpg --keyring ./ryanpubring.kbx --no-default-keyring --armor --output ryanpubkey.gpg --export [email protected]

これにより、公開鍵を含む新しいファイルryanpubkey.gpgが生成されます。 ファイルの内容を見てみましょう。

> cat ryanpubkey.gpg
-----BEGIN PGP PUBLIC KEY BLOCK-----
mQGNBF21KQoBDACs7bgjl22TPyQDKjLTMlZrBgQrXZOIkNcH3z1f87XQYoLjVPU3
ymg1hweHm1RsIxO+GdD42pkU/ob5YdWgvVBRdIZPeTXciTa8TtxZKNNtr+IL0pwY
...
-----END PGP PUBLIC KEY BLOCK-----

Ryanは、セキュリティで保護されたチャネルまたはセキュリティで保護されていないチャネルを介して、このファイルをSamと共有できるようになりました。

この例では、公開鍵を共有するための簡単なファイルコピーを実行してみましょう。

> cp ryanpubkey.gpg ../sam

5.3. 公開鍵のインポート

ライアンから公開鍵を受け取った後、サムが何をしなければならないかを見てみましょう。

まず、Samのフォルダに切り替えましょう。

> cd ../sam

次に、Ryanの公開鍵をSamのキーリングファイルにインポートしましょう。

> gpg --keyring ./sampubring.kbx --no-default-keyring --import ryanpubkey.gpg
gpg: keybox './sampubring.kbx' created
gpg: key D6BA055613B064D7: public key "Ryan <[email protected]>" imported
gpg: Total number processed: 1
gpg:               imported: 1
gpg: public key of ultimately trusted key 01220F5773165740 not found
gpg: marginals needed: 3  completes needed: 1  trust model: pgp
gpg: depth: 0  valid:   2  signed:   0  trust: 0-, 0q, 0n, 0m, 0f, 2u
gpg: next trustdb check due at 2019-11-26

これにより、新しいキーリングファイル sampubring.kbx が作成され、それに公開キーが追加されます。

これで、インポートされたキーを表示できます。

> gpg --keyring ./sampubring.kbx --no-default-keyring --list-keys
...
uid           [ unknown] Ryan <[email protected]>

[不明]は、キーの信頼性に関する情報が利用できないことを示します。 今後の警告を回避するために、これをtrustedに変更しましょう。

> gpg --keyring ./sampubring.kbx --no-default-keyring --edit-key "[email protected]" trust

尋ねられる信頼レベルの質問で、 5 =最終的にを信頼し、はいとして確認します。その後、quitと入力して終了します。シェルから。

5.4. ファイルの暗号化

これで、Samは、Ryanだけが読み取ることができるファイルを暗号化するように設定されました。 サンプルファイルを作成しましょう:

> echo "Hello, Baeldung!" > greetings.txt

その後、encryptコマンドで受信者としてRyanを指定しましょう。

> gpg --keyring ./sampubring.kbx --no-default-keyring --encrypt --recipient "[email protected]" greetings.txt

これにより、ファイルgreetings.txt.gpg が同じ場所に作成され、ライアンの公開鍵を使用して暗号化されます。 これで、Samは、セキュリティで保護されたチャネルまたはセキュリティで保護されていないチャネルを介して、このファイルをRyanと共有できます。

前と同じように、暗号化されたファイルを共有するための簡単なファイルコピーを実行しましょう。

> cp greetings.txt.gpg  ../ryan

5.5. ファイルの復号化

ライアンのフォルダに戻って、サムから受け取った暗号化されたファイルを読みましょう。

> cd ../ryan

復号化コマンドを使用できます。

> gpg --keyring ./ryanpubring.kbx --no-default-keyring --pinentry-mode=loopback --passphrase "ryanpassword" --output greetings.txt --decrypt greetings.txt.gpg
gpg: encrypted with 3072-bit RSA key, ID 8273FAC75696D83E, created 2019-10-27
      "Ryan <[email protected]>"

これにより、ライアンの秘密鍵を使用して復号化された新しいファイルgreetings.txtが作成されます。

復号化が成功したかどうかをすばやく確認できます。

> diff -s greetings.txt ../sam/greetings.txt
Files greetings.txt and ../sam/greetings.txt are identical

5.6. 双方向通信

前の例では、送信者と受信者の役割が静的であるため、通信は単方向です。

これが意味するのは、双方向通信を可能にするために必要なのは、2番目のキーペアを生成することによって役割を逆にすることだけです。 前のセクションにリストされているのと同じ手順に従うことができます。

6. 結論

この記事では、2つの異なるアプローチを使用してファイルを暗号化する方法を学習しました。これにより、要件に応じて、タスクに最適なアプローチを決定できます。

また、公開/秘密鍵と、それらをファイルの暗号化/復号化に実際に使用する方法についても学びました。