diff --git a/articles/gpg-file-encryption.md b/articles/gpg-file-encryption.md index d943653..4093f09 100644 --- a/articles/gpg-file-encryption.md +++ b/articles/gpg-file-encryption.md @@ -1,12 +1,12 @@ --- -title: "コマンドラインでファイルやフォルダを暗号化する方法 (GPG 編)" +title: "GPG でファイルやフォルダを暗号化する方法" emoji: "🔑" type: "tech" # tech: 技術記事 / idea: アイデア topics: ["gpg", "encryption", "cipher", "cryptography"] published: true --- -# 忙しい人向け +# クイックリファレンス ```shell # フォルダを圧縮 zip -r foo.zip foo @@ -20,11 +20,11 @@ gpg -d -o /tmp/decrypted.zip encrypted.zip.gpg ``` | ロングオプション | ショートオプション | 説明 | -| --- | :---: | --- | -| `--encrypt` | `-e` | ファイルを暗号化します | -| `--recipient` | `-r` | 使用する秘密鍵を選択します | +| --- | --- | --- | | `--armor` | `-a` | バイナリではなくアスキーデータで出力します | -| `--output` | `-o` | 暗号化されたファイルの出力先を指定します | +| `--encrypt` | `-e` | ファイルを暗号化します | +| `--output PATH` | `-o PATH` | 暗号化されたファイルの出力先を指定します | +| `--recipient KEY` | `-r KEY` | 使用する秘密鍵を選択します | | | バイナリデータ | アスキーデータ | | :---: | --- | --- | @@ -35,82 +35,92 @@ gpg -d -o /tmp/decrypted.zip encrypted.zip.gpg # はじめに -前回は `openssl` コマンドを使ってファイルを暗号化する方法について紹介しました。 +前回は OpenSSL を使ってファイルを暗号化する方法について紹介しました。 [コマンドラインでファイルを暗号化する方法 (OpenSSL 編)](https://zenn.dev/noraworld/articles/file-encryption) -しかし `openssl` コマンドによる暗号化だとファイルサイズが大きいファイルを正しく暗号化できないというデメリットがあります。 +しかし `openssl` コマンドによる暗号化だとオプションが複雑だったり、ファイルサイズが大きい場合に正しく暗号化できなかったりするデメリットがあります。 -そこで今回は `gpg` コマンドを使ってファイル・フォルダを暗号化する方法について解説します。 +そこで今回は GPG を利用してファイル・フォルダを暗号化する方法について解説します。 # 前提 * `gpg` コマンドはインストール済みであること -* GPG キー (秘密鍵) は生成済みであること +* GPG キー(秘密鍵)は生成済みであること # フォルダを圧縮 フォルダを直接的に暗号化することはできませんので、まずはフォルダを圧縮して ZIP ファイルにまとめます。フォルダではなくファイルを暗号化する場合はこの手順はスキップしてください。 -カレントディレクトリにある `foo` というフォルダを圧縮するには以下のコマンドを実行します。ZIP ファイル `foo.zip` が生成されるはずです。 +カレントディレクトリにある `foo` というフォルダを圧縮するには以下のコマンドを実行します。以下の例では、ZIP ファイル `foo.zip` が生成されるはずです。 ```shell zip -r foo.zip foo ``` ## 注意点 -* フォルダを圧縮する際は `-r` を付け忘れないように注意しましょう。付け忘れると空 ZIP ファイルになります。 -* 絶対パスを指定して圧縮すると展開したときにそのようなディレクトリ構造になってしまいます。また、圧縮前のフォルダ名は維持されます。 +* **フォルダを圧縮する際は `-r` を付け忘れないように注意しましょう** + * 付け忘れると空 ZIP ファイルになります +* 絶対パスを指定すると展開したときにそのようなディレクトリ構造になってしまいます +* 圧縮前のフォルダ名は維持されます ここではコマンドラインで圧縮する方法を紹介しましたが、実際には OS のファイル管理アプリ(Mac なら Finder、Windows なら Explorer)のほうが間違いがなくて良いかもしれません。 # 暗号化 -ファイルを暗号化するには以下のコマンドを実行します。暗号化されたファイル `foo.zip.gpg` が生成されるはずです。 +ファイルを暗号化するには以下のコマンドを実行します。以下の例では、暗号化されたファイル `foo.zip.gpg` が生成されるはずです。 ```shell gpg --encrypt --recipient you@example.com foo.zip ``` -暗号化には `--encrypt` または `-e` オプションをつけます。`--recipient` または `-r` オプションを指定して該当する秘密鍵に使用したメールアドレス (署名 ID) を指定する必要があります。このオプションを省略した場合は実行時にインタラクティブ形式で求められます。 +* 暗号化には `--encrypt` または `-e` オプションをつけます +* `--recipient` または `-r` オプションを指定して、利用する秘密鍵に登録したメールアドレスを指定する必要があります + * このオプションを省略した場合は実行時にインタラクティブ形式で求められます -バイナリデータではなくアスキーデータ (テキストエディタで開ける形式) として保存したい場合は以下のように `--armor` または `-a` オプションを付与します。`foo.zip.asc` が生成されるはずです。 +## アスキーデータで保存 +バイナリデータではなくアスキーデータ(テキストエディタで開ける形式)として保存したい場合は以下のように `--armor` または `-a` オプションを付与します。以下の例では、暗号化されたファイル `foo.zip.asc` が生成されるはずです。 ```shell -gpg --encrypt --recipient you@example.com --armor foo.zip +gpg --armor --encrypt --recipient you@example.com foo.zip ``` -このファイルはテキストエディタで開くことができます。ただしファイルサイズによっては開くと重くなりますのでご注意ください。 +* このファイルはテキストエディタで開くことができます + * ただしファイルサイズによっては開くと重くなりますのでご注意ください + +### バイナリデータとアスキーデータの違い +両者とも復号すれば全く同じファイルが生成されるため、基本的にはどちらでも良いと思います。主な違いは以下のとおりです。 + +| | バイナリデータ | アスキーデータ | +| :---: | --- | --- | +| **利点** | ファイルサイズが元のファイルと変わらない | テキストエディタで開ける、差分表示ができる | +| **欠点** | テキストエディタでは開けない、差分表示ができない | ファイルサイズが膨らむ [^size] | +| **拡張子** | `.gpg` | `.asc` | + +[^size]: 筆者の環境で 1.37 GB の ZIP ファイルをこの方法で暗号化したところ 1.85 GB になりました。 -デフォルトでは、暗号化されたファイルの出力先は暗号化前のファイルと同じディレクトリです。出力先を変更する場合は `--output` または `-o` オプションを指定します。**ディレクトリ名を指定するとそのディレクトリが暗号化ファイルになってしまうのでご注意ください。ファイル名まで含めて指定してください。** +## 出力先を変更 +デフォルトでは、暗号化されたファイルの出力先は暗号化前のファイルと同じディレクトリです。出力先を変更する場合は `--output` または `-o` オプションを指定します。以下の例では `/tmp/encrypted.zip.gpg` が生成されるはずです。 ```shell -gpg --encrypt --recipient you@example.com --output /tmp/encrypted.zip.gpg foo.zip +gpg --encrypt --output /tmp/encrypted.zip.gpg --recipient you@example.com foo.zip ``` +* **ディレクトリ名で終わるとそのディレクトリが暗号化ファイルになってしまいます** + * ファイル名まで含めて指定してください + ## よく使用するオプション一覧 上記で説明したよく使用するオプションの一覧を以下にまとめます。 | ロングオプション | ショートオプション | 説明 | -| --- | :---: | --- | -| `--encrypt` | `-e` | ファイルを暗号化します | -| `--recipient` | `-r` | 使用する秘密鍵を選択します | +| --- | --- | --- | | `--armor` | `-a` | バイナリではなくアスキーデータで出力します | -| `--output` | `-o` | 暗号化されたファイルの出力先を指定します | - -## バイナリデータとアスキーデータの違い -両者とも復号すれば全く同じファイルが生成されるため、基本的にはどちらでも良いと思います。主な違いは以下のとおりです。 - -| | バイナリデータ | アスキーデータ | -| :---: | --- | --- | -| **利点** | ファイルサイズが元のファイルと変わらない | テキストエディタで開ける、差分表示ができる | -| **欠点** | テキストエディタでは開けない、差分表示ができない | ファイルサイズが膨らむ[^size] | -| **拡張子** | `.gpg` | `.asc` | - -[^size]: 筆者の環境で 1.37 GB の ZIP ファイルをこの方法で暗号化したところ 1.85 GB になりました。 +| `--encrypt` | `-e` | ファイルを暗号化します | +| `--output PATH` | `-o PATH` | 暗号化されたファイルの出力先を指定します | +| `--recipient KEY` | `-r KEY` | 使用する秘密鍵を選択します | @@ -121,7 +131,9 @@ gpg --encrypt --recipient you@example.com --output /tmp/encrypted.zip.gpg foo.zi gpg foo.zip.gpg ``` -復号には `--decrypt` または `-d` オプションを明示的に指定することもできますが、通常は勝手に推測してくれるので省略可能です。また、このオプションを指定した場合は `--output` または `-o` オプションを指定しないと、ファイルではなくターミナルに標準出力されてしまうためご注意ください。 +* 復号には `--decrypt` または `-d` オプションを明示的に指定することもできます + * ただし、通常は勝手に推測してくれるので省略可能です + * このオプションを指定した場合は `--output` または `-o` オプションを指定しないと、ファイルではなくターミナルに標準出力されてしまうのでご注意ください ```shell gpg --decrypt --output /tmp/decrypted.zip foo.zip.gpg