_著者はhttps://www.brightfunds.org/funds/open-internet-free-speech[Open Internet / Free Speech Fund]を選択してhttps://do.co/w4do-ctaの一部として寄付を受け取りました[寄付のために書く]プログラム。

前書き

GnuPGパッケージは、暗号化キーを生成および保存するための完全なソリューションを提供します。 また、データと通信を暗号化して署名することができます。

このチュートリアルでは、https://pythonhosted.org/python-gnupg/ [python-gnupg]モジュールでPython 3を使用する一連のスクリプトを作成します。 これらのスクリプトを使用すると、複数のファイルに署名して暗号化し、実行する前にスクリプトの整合性を検証できます。

前提条件

このチュートリアルを続ける前に、次の前提条件を完了してください。

  • Ubuntu 16.04の初期サーバーセットアップチュートリアルに従って、Ubuntu 16.04サーバーをセットアップします。 このチュートリアルを実行した後、ルート以外のsudoユーザーアカウントにアクセスできるようになります。 このチュートリアルでは、ユーザーに* sammy *という名前を付けます。

  • https://www.digitalocean.com/community/tutorials/how-to-install-python-3-and-set-up-a-localのステップ1に従って、Python 3と `+ pip +`がインストールされていることを確認します-programming-environment-on-ubuntu-16-04#step-1-%E2%80%94-setting-up-python-3 [Ubuntu 16.04でPython 3をインストールしてローカルプログラミング環境をセットアップする方法]。

  • このhttps://www.digitalocean.com/community/tutorials/how-to-use-gpg-to-encrypt-and-sign-messages[GnuPGチュートリアル]に従って、GnuPGキーペアを作成します。

手順1-キーペア情報の取得

前提条件のGnuPGチュートリアルを完了すると、ホームディレクトリの下の `+ .gnupg `にキーペアが保存されます。 GnuPGは、キーペアの識別に役立つユーザー名と電子メールでキーを保存します。 この例では、ユーザー名は* sammy *で、電子メールアドレスは `+`です。

以下のコマンドを実行して、使用可能なキーのリストを取得します。

gpg --list-keys
Output/home//.gnupg/pubring.gpg
-----------------------------
pub   2048R/4920B23F 2018-04-23
uid
sub   2048R/50C06279 2018-04-23

出力の `+ uid +`行に表示される電子メールアドレスを書き留めます。 後でキーを識別するために必要になります。

ステップ2-Python-GnuPGのインストールとファイルの署名

キーを配置したら、 `+ python-gnupg +`モジュールをインストールできます。これは、GnuPGとPython 3の間の相互作用を可能にするGnuPGのラッパーとして機能します。 このモジュールを使用すると、次のことを行うPythonスクリプトを作成できます。

  • ファイルの分離された署名を作成し、署名をファイルから分離することで署名プロセスにセキュリティの層を追加します。

  • ファイルを暗号化します。

  • ファイルを解読します。

  • 分離された署名とスクリプトを確認します。

これらのファイルでスクリプトをテストする前に、いくつかのテストファイルと共にスクリプトを最初に作成します。

まず、テストファイルを開いたり、読み書きしたりできる「+ fs 」パッケージとともに、「 python-gnupg 」モジュールをインストールしましょう。 パッケージインデックスを更新し、 ` pip +`でこれらのパッケージをインストールします。

sudo apt-get update
sudo pip3 install python-gnupg fs

これらのパッケージを配置したら、スクリプトとテストファイルの作成に進むことができます。

スクリプトとテストファイルを保存するには、ホームディレクトリに「+ python-test +」というフォルダーを作成します。

cd ~/
mkdir python-test

このディレクトリに移動します。

cd python-test/

次に、3つのテストファイルを作成します。

echo "This is the first test file" > test1.txt
echo "print('This test file is a Python script')" > test2.py
echo "This is the last test file" > test3.txt

テストファイルの分離署名を作成するには、実行されるディレクトリ内のすべてのファイルを対象とする「+ signdetached.py」というスクリプトを作成します。 署名はタイムスタンプとして機能し、ドキュメントの信頼性を証明します。

分離された署名は、「+ signatures / +」と呼ばれる新しいフォルダーに保存され、スクリプトの実行時に作成されます。

`+ nano `またはお気に入りのテキストエディターを使用して、 ` signdetach.py​​ +`という新しいファイルを開きます。

nano signdetach.py

最初に、スクリプトに必要なすべてのモジュールをインポートしましょう。 これらには、ファイルナビゲーションを有効にする `+ os `および ` fs `パッケージ、および ` gnupg +`が含まれます。

〜/ python-test / signdetach.py

#!/usr/bin/env python3

import os
import fs
from fs import open_fs
import gnupg

GnuPGが暗号化キーを見つけるディレクトリを設定しましょう。 GnuPGはデフォルトでそのキーを `+ .gnupg +`に保存するので、ユーザー名でこれを設定しましょう。 * sammy *を非rootユーザーの名前に置き換えてください:

〜/ python-test / signdetach.py

...
gpg = gnupg.GPG(gnupghome="/home//.gnupg")

次に、 `+ home_fs +`変数を作成して、現在のディレクトリの場所をファイルオブジェクトとして保存します。 これにより、スクリプトが実行されたディレクトリ内で動作できるようになります。

〜/ python-test / signdetach.py

...
home_fs = open_fs(".")

これで、スクリプトは次のようになります。

〜/ python-test / signdetach.py

#!/usr/bin/env python3

import os
import fs
from fs import open_fs
import gnupg

gpg = gnupg.GPG(gnupghome="/home//.gnupg")
home_fs = open_fs(".")

この構成ブロックは、このチュートリアルを進めるときにスクリプトで使用する基本的なテンプレートです。

次に、 `+ signatures / +`という名前のフォルダーがあるかどうかを確認するコードを追加し、存在しない場合は作成します。

〜/ python-test / signdetach.py

...
if os.path.exists("signatures/"):
       print("Signatures directory already created")
else:
       home_fs.makedir(u"signatures")
       print("Created signatures directory")

空の配列を作成してファイル名を保存し、現在のディレクトリをスキャンして、すべてのファイル名を `+ files_dir +`配列に追加します。

〜/ python-test / signdetach.py

...
files_dir = []

files = [f for f in os.listdir(".") if os.path.isfile(f)]
for f in files:
   files_dir.append(f)

スクリプトが次に行うことは、ファイルの分離された署名を生成することです。 `+ files_dir `配列をループすると、キーリングの最初の秘密キーを使用して各ファイルの署名が作成されます。 秘密鍵にアクセスするには、設定したパスフレーズで秘密鍵をロック解除する必要があります。 「+」を、前提条件でキーペアを生成したときに使用したパスフレーズに置き換えます。

〜/ python-test / signdetach.py

...
for x in files_dir:
   with open(x, "rb") as f:
       stream = gpg.sign_file(f,passphrase=,detach = True, output=files_dir[files_dir.index(x)]+".sig")
       os.rename(files_dir[files_dir.index(x)]+".sig", "signatures/"+files_dir[files_dir.index(x)]+".sig")
       print(x+" ", stream.status)

完了すると、すべての署名が `+ signatures / +`フォルダーに移動します。 完成したスクリプトは次のようになります。

〜/ python-test / signdetach.py

#!/usr/bin/env python3

import os
import fs
from fs import open_fs
import gnupg

gpg = gnupg.GPG(gnupghome="/home//.gnupg")
home_fs = open_fs(".")

if os.path.exists("signatures/"):
   print("Signatures directory already created")
else:
   home_fs.makedir(u"signatures")
   print("Created signatures directory")

files_dir = []

files = [f for f in os.listdir(".") if os.path.isfile(f)]
for f in files:
   files_dir.append(f)

for x in files_dir:
   with open(x, "rb") as f:
       stream = gpg.sign_file(f,passphrase=,detach = True, output=files_dir[files_dir.index(x)]+".sig")
       os.rename(files_dir[files_dir.index(x)]+".sig", "signatures/"+files_dir[files_dir.index(x)]+".sig")
       print(x+" ", stream.status)

これで、ファイルの暗号化に進むことができます。

ステップ3-ファイルの暗号化

フォルダーで暗号化スクリプトを実行すると、そのフォルダー内のすべてのファイルが「+ encrypted / +」と呼ばれる新しいフォルダー内でコピーおよび暗号化されます。 ファイルの暗号化に使用される公開鍵は、鍵ペアの構成で指定した電子メールに対応するものです。

`+ encrypt files.py`という新しいファイルを開きます:

nano encryptfiles.py

まず、必要なモジュールをすべてインポートし、GnuPGのホームディレクトリを設定して、現在の作業ディレクトリ変数を作成します。

〜/ python-test / encryptfiles.py

#!/usr/bin/env python3

import os
import fs
from fs import open_fs
import gnupg

gpg = gnupg.GPG(gnupghome="/home//.gnupg")
home_fs = open_fs(".")

次に、現在のディレクトリに既に「+ encrypted / +」というフォルダーがあるかどうかを確認し、存在しない場合は作成するコードを追加します。

〜/ python-test / encryptfiles.py

...
if os.path.exists("encrypted/"):
       print("Encrypt directory exists")
else:
       home_fs.makedir(u"encrypted")
       print("Created encrypted directory")

暗号化するファイルを検索する前に、空の配列を作成してファイル名を保存しましょう。

〜/ python-test / encryptfiles.py

...
files_dir = []

次に、フォルダーをスキャンしてファイルを探し、それらを配列に追加するループを作成します。

〜/ python-test / encryptfiles.py

...
files = [f for f in os.listdir(".") if os.path.isfile(f)]
for f in files:
   files_dir.append(f)

最後に、フォルダー内のすべてのファイルを暗号化するループを作成します。 完了すると、すべての暗号化されたファイルが `+ encrypted / `フォルダーに転送されます。 この例では、「+」は暗号化中に使用するキーの電子メールIDです。 これを必ず手順1でメモした電子メールアドレスに置き換えてください。

〜/ python-test / encryptfiles.py

...
for x in files_dir:
   with open(x, "rb") as f:
       status = gpg.encrypt_file(f,recipients=[],output= files_dir[files_dir.index(x)]+".gpg")
       print("ok: ", status.ok)
       print("status: ", status.status)
       print("stderr: ", status.stderr)
       os.rename(files_dir[files_dir.index(x)] + ".gpg", 'encrypted/' +files_dir[files_dir.index(x)] + ".gpg")

`+ .gnupg `フォルダー内に複数のキーが保存されていて、暗号化に特定の公開キーまたは複数の公開キーを使用する場合、追加の受信者を追加するか、現在の受信者を置き換えることにより、 ` recipients +`配列を変更する必要があります。

完了したら、 `+ encrypt files.py`スクリプトファイルは次のようになります。

〜/ python-test / encryptfiles.py

#!/usr/bin/env python3

import os
import fs
from fs import open_fs
import gnupg

gpg = gnupg.GPG(gnupghome="/home//.gnupg")
home_fs = open_fs(".")

if os.path.exists("encrypted/"):
   print("Encrypt directory exists")
else:
   home_fs.makedir(u"encrypted")
   print("Created encrypted directory")

files_dir = []

files = [f for f in os.listdir(".") if os.path.isfile(f)]
for f in files:
   files_dir.append(f)

for x in files_dir:
   with open(x, "rb") as f:
       status = gpg.encrypt_file(f,recipients=[],output= files_dir[files_dir.index(x)]+".gpg")
       print("ok: ", status.ok)
       print("status: ", status.status)
       print("stderr: ", status.stderr)
       os.rename(files_dir[files_dir.index(x)] + ".gpg", "encrypted/" +files_dir[files_dir.index(x)] + ".gpg")

次に、プロセスの2番目の部分、つまり複数のファイルを一度に復号化して検証する方法を見てみましょう。

ステップ4-ファイルの復号化

復号化スクリプトは、「+ encrypted / 」ディレクトリ内で実行されることを除いて、暗号化スクリプトとほぼ同じように機能します。 起動されると、 ` decryptfiles.py `は最初に使用される公開鍵を識別し、次に ` .gnupg `フォルダーで対応する秘密鍵を検索してファイルを復号化します。 復号化されたファイルは、「 decrypted / +」という新しいフォルダに保存されます。

`+ nano `またはお気に入りのエディターで ` decryptfiles.py +`という新しいファイルを開きます:

nano decryptfiles.py

構成設定を挿入することから始めます。

〜/ python-test / decryptfiles.py

#!/usr/bin/env python3

import os
import fs
from fs import open_fs
import gnupg

gpg = gnupg.GPG(gnupghome="/home//.gnupg")
home_fs = open_fs(".")

次に、2つの空の配列を作成して、スクリプトの実行中にデータを保存します。

〜/ python-test / decryptfiles.py

...
files_dir = []
files_dir_clean = []

ここでの目標は、スクリプトが復号化されたファイルを独自のフォルダーに配置することです。そうしないと、暗号化されたファイルと復号化されたファイルが混在し、特定の復号化されたファイルを見つけることが難しくなります。 この問題を解決するには、現在のフォルダーをスキャンして `+ decrypted / +`フォルダーが存在するかどうかを確認し、存在しない場合は作成するコードを追加します。

〜/ python-test / decryptfiles.py

...
if os.path.exists("decrypted/"):
   print("Decrypted directory already exists")
else:
   home_fs.makedir(u"decrypted/")
   print("Created decrypted directory")

フォルダをスキャンして、すべてのファイル名を `+ files_dir +`配列に追加します。

〜/ python-test / decryptfiles.py

...
files = [f for f in os.listdir(".") if os.path.isfile(f)]
for f in files:
   files_dir.append(f)

すべての暗号化されたファイルには、ファイル名に「+ .gpg +」拡張子が追加されており、暗号化されていることを示します。 ただし、暗号化を解除するときは、暗号化されていないため、この拡張子なしで保存します。

これを行うには、 `+ files_dir `配列をループし、各ファイル名から ` .gpg +`拡張子を削除します。

〜/ python-test / decryptfiles.py

...
   for x in files_dir:
           length = len(x)
           endLoc = length - 4
           clean_file = x[0:endLoc]
           files_dir_clean.append(clean_file)

新しい「クリーンアップ」されたファイル名は、 `+ file_dir_clean +`配列内に保存されます。

次に、ファイルをループして解読します。 「++」をパスフレーズに置き換えて、秘密鍵のロックを解除します。

〜/ python-test / decryptfiles.py

...
for x in files_dir:
   with open(x, "rb") as f:
      status = gpg.decrypt_file(f, passphrase=,output=files_dir_clean[files_dir.index(x)])
      print("ok: ", status.ok)
      print("status: ", status.status)
      print("stderr: ", status.stderr)
      os.rename(files_dir_clean[files_dir.index(x)], "decrypted/" + files_dir_clean[files_dir.index(x)])

終了すると、スクリプトファイルは次のようになります。

〜/ python-test / decryptfiles.py

#!/usr/bin/env python3

import os
import fs
from fs import open_fs
import gnupg

gpg = gnupg.GPG(gnupghome="/home//.gnupg")
home_fs = open_fs(".")

files_dir = []
files_dir_clean = []

if os.path.exists("decrypted/"):
   print("Decrypted directory already exists")
else:
   home_fs.makedir(u"decrypted/")
   print("Created decrypted directory")

files = [f for f in os.listdir(".") if os.path.isfile(f)]
for f in files:
   files_dir.append(f)

for x in files_dir:
   length = len(x)
   endLoc = length - 4
   clean_file = x[0:endLoc]
   files_dir_clean.append(clean_file)

for x in files_dir:
   with open(x, "rb") as f:
      status = gpg.decrypt_file(f, passphrase=,output=files_dir_clean[files_dir.index(x)])
      print("ok: ", status.ok)
      print("status: ", status.status)
      print("stderr: ", status.stderr)
      os.rename(files_dir_clean[files_dir.index(x)], "decrypted/" + files_dir_clean[files_dir.index(x)])

復号化スクリプトを配置したら、複数のファイルの分離された署名の検証に進むことができます。

ステップ5-分離された署名の検証

複数のファイルのデタッチされたデジタル署名を検証するには、 `+ verifydetach.py​​ `スクリプトを記述しましょう。 このスクリプトは、作業ディレクトリ内の「 signatures / +」フォルダーを検索し、各ファイルとその署名を検証します。

`+ verifydetach.py​​ +`という新しいファイルを開きます:

nano verifydetach.py

前の例のように、必要なすべてのライブラリをインポートし、作業ディレクトリとホームディレクトリを設定し、空の `+ files_dir +`配列を作成します。

〜/ python-test / verifydetach.py

#!/usr/bin/env python3

import os
import fs
from fs import open_fs
import gnupg

gpg = gnupg.GPG(gnupghome="/home//.gnupg")
home_fs = open_fs(".")

files_dir = []

次に、確認するファイルが含まれるフォルダーをスキャンします。 ファイル名は空の `+ files_dir +`配列に追加されます:

〜/ python-test / verifydetach.py

...
files = [f for f in os.listdir(".") if os.path.isfile(f)]
for f in files:
files_dir.append(f)

最後に、「+ files_dir 」配列内を移動するループを使用して、「 signatures / +」フォルダー内の各ファイルの分離された署名を検索する、独自の分離された署名を持つ各ファイルを検証しましょう。 分離された署名を見つけると、それを含むファイルを検証します。 最後の行は、各ファイルの検証のステータスを出力します。

〜/ python-test / verifydetach.py

...
for i in files_dir:
    with open("../../signatures/" + i + ".sig", "rb") as f:
        verify = gpg.verify_file(f, i)
        print(i + " ", verify.status)

終了すると、スクリプトは次のようになります。

〜/ python-test / verifydetach.py

#!/usr/bin/env python3

import os
import fs
from fs import open_fs
import gnupg

gpg = gnupg.GPG(gnupghome="/home//.gnupg")
home_fs = open_fs(".")

files_dir = []

files = [f for f in os.listdir(".") if os.path.isfile(f)]
for f in files:
   files_dir.append(f)

for i in files_dir:
   with open("../../signatures/" + i + ".sig", "rb") as f:
       verify = gpg.verify_file(f, i)
       print(i + " ", verify.status)

次に、サーバーで実行される前にファイルの署名を検証する方法について説明します。

ステップ6-ファイルの検証

最終的なスクリプトは、スクリプトが実行される前に検証します。 この意味では、「+ verifydetach +」と似ていますが、検証済みのスクリプトを起動する追加機能があります。 スクリプト名を引数として使用し、そのファイルの署名を検証することで機能します。 検証が成功すると、スクリプトはコンソールにメッセージを投稿し、検証されたスクリプトを起動します。 検証プロセスが失敗した場合、スクリプトはコンソールにエラーを通知し、ファイルの実行を中止します。

`+ verifyfile.py +`という新しいファイルを作成します。

nano verifyfile.py

まず、必要なライブラリをインポートして、作業ディレクトリを設定しましょう。

〜/ python-test / verifyfile.py

#!/usr/bin/env python3

import os
import fs
from fs import open_fs
import gnupg

gpg = gnupg.GPG(gnupghome="/home//.gnupg")
home_fs = open_fs(".")

スクリプトが機能するためには、検証および実行するファイルの名前を保存する必要があります。 これを行うには、 `+ script_to_run +`という新しい変数を作成しましょう:

〜/ python-test / verifyfile.py

...
script_to_run = str(sys.argv[1])

この変数は最初の引数を取り、新しく作成された変数内に保存します。 次に、スクリプトは分離された署名ファイルを開き、 `+ script_to_run +`のファイルを署名で検証し、検証に合格した場合に実行します。

〜/ python-test / verifyfile.py

...
with open("../../signatures/" + script_to_run + ".sig", "rb") as f:
    verify = gpg.verify_file(f, script_to_run)
    print(script_to_run + " ", verify.status)
    if verify.status == "signature valid":
         print("Signature valid, launching script...")
         exec(open(script_to_run).read())
    else:
          print("Signature invalid or missing, ")
          print("aborting script execution")

完成したスクリプトは次のようになります。

〜/ python-test / verifyfile.py

#!/usr/bin/env python3

import os
import sys
import fs
from fs import open_fs
import gnupg

gpg = gnupg.GPG(gnupghome="/home//.gnupg")
home_fs = open_fs(".")

script_to_run = str(sys.argv[1])

with open("../../signatures/" + script_to_run + ".sig", "rb") as f:
   verify = gpg.verify_file(f, script_to_run)
   print(script_to_run + " ", verify.status)
   if verify.status == "signature valid":
       print("Signature valid, launching script...")
       exec(open(script_to_run).read())
   else:
       print("Signature invalid or missing, ")
       print("aborting script execution")

スクリプトの作成は終了しましたが、現時点では、現在のフォルダー内からのみ起動できます。 次のステップでは、権限を変更してグローバルにアクセスできるようにします。

ステップ7-スクリプトをシステム全体で使用可能にする

使いやすくするために、システム上の任意のディレクトリまたはフォルダーからスクリプトを実行可能にして、 `+ $ PATH `内に配置します。 ` chmod +`コマンドを使用して、ファイルの所有者である非ルートユーザーに実行権限を付与します。

chmod +x *.py

`+ $ PATH +`設定を見つけるために、次のコマンドを実行します:

echo $PATH
Output-bash: /home//bin:/home//.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin

ディレクトリの権限で許可されている場合、 `+ $ PATH`に保存されているファイルは、システム内の任意のフォルダーからアクセスできます。 スクリプトは `+ $ PATH `内のどこにでも配置できますが、ここでは、スクリプトを ` python-test / `ディレクトリから ` / usr / local / bin / +`に移動します。

ファイルをコピーするときに `+ .py `拡張子をドロップしていることに注意してください。 作成したスクリプトの最初の行を見ると、 `#!usr / bin / env python3 +`が表示されます。 この行はhttps://en.wikipedia.org/wiki/Shebang_(Unix)[shebang]と呼ばれ、オペレーティングシステムがコードの実行時に使用するbashインタープリターまたは環境を識別するのに役立ちます。 スクリプトを実行すると、オペレーティングシステムはPythonを環境として指定したことを認識し、実行のためにコードをPythonに渡します。 これは、作業する環境を識別するのに役立つファイル拡張子が不要になったことを意味します。

sudo mv encryptfiles.py /usr/local/bin/encryptfiles
sudo mv decryptfiles.py /usr/local/bin/decryptfiles
sudo mv signdetach.py /usr/local/bin/signdetach
sudo mv verifyfile.py /usr/local/bin/verifyfile
sudo mv verifydetach.py /usr/local/bin/verifydetach

これで、スクリプトがコマンドラインから取る引数とともにスクリプト名を実行するだけで、システム内の任意の場所でスクリプトを実行できます。 次のステップでは、これらのスクリプトの使用方法の例をいくつか見ていきます。

ステップ8-スクリプトのテスト

スクリプトを `+ $ PATH +`に移動したので、サーバー上の任意のフォルダーからスクリプトを実行できます。

最初に、 + pwd`コマンドを使用して、まだ + python-test`ディレクトリ内で作業しているかどうかを確認します。

pwd

出力は次のようになります。

Output/home//python-test

チュートリアルの前半で3つのテストファイルを作成しました。 `+ ls -l +`コマンドを実行して、フォルダー内のファイルを一覧表示します。

ls -l

`+ python-test`フォルダーに保存されている3つのファイルが表示されます。

Output-rw-rw-r-- 1 sammy sammy 15 Apr 15 10:08 test1.txt
-rwxrwxr-x 1 sammy sammy 15 Apr 15 10:08 test2.py
-rw-rw-r-- 1 sammy sammy 15 Apr 15 10:08 test3.txt

これら3つのファイルでスクリプトをテストします。 次のように、 `+ cat +`コマンドを使用して、暗号化する前にファイルの内容をすばやく表示できます。

cat test1.txt
OutputThis is the first test file

すべてのファイルの分離署名を作成することから始めましょう。 これを行うには、現在のフォルダー内から `+ signdetach +`スクリプトを実行します:

signdetach
OutputCreated signatures directory
test2.py  signature created
test1.txt  signature created
test3.txt  signature created

出力で、スクリプトが `+ signatures / +`ディレクトリが存在しないことを検出して作成したことに注意してください。 次に、ファイル署名を作成しました。

これを確認するには、 `+ ls -l +`コマンドを再度実行します。

ls -l
Outputtotal 16

-rw-rw-r-- 1 sammy sammy 15 Apr 15 10:08 test1.txt
-rwxrwxr-x 1 sammy sammy 15 Apr 15 10:08 test2.py
-rw-rw-r-- 1 sammy sammy 15 Apr 15 10:08 test3.txt

リストの項目の中にある新しい `+ signatures +`ディレクトリに注目してください。 このフォルダーのコンテンツをリストし、署名の1つを詳しく見てみましょう。

すべての署名を一覧表示するには、次を入力します。

ls -l signatures/
Outputtotal 12
-rw-rw-r-- 1 sammy sammy 473 Apr 21 14:11 test1.txt.sig
-rw-rw-r-- 1 sammy sammy 473 Apr 21 14:11 test2.py.sig
-rw-rw-r-- 1 sammy sammy 473 Apr 21 14:11 test3.txt.sig

分離された署名ファイルは、 `+ .sig `拡張子で識別できます。 繰り返しになりますが、 ` cat `コマンドはこれらの署名の1つのコンテンツを表示できます。 署名 ` test1.txt.sig +`の内容を見てみましょう。

cat signatures/test1.txt.sig
Output-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1

iQEcBAABAgAGBQJa20aGAAoJENVtx+Y8cX3mMhMH+gOZsLJX3aEgUPZzDlKRWYec
AyrXEGp5yIABj7eoLDKGUxftwGt+c4HZud1iEUy8AhtW/Ea6eRlMFPTso2hb9+cw
/MyffTrWGpa0AGjNvf4wbxdq7TNpAlw4nmcwKpeYqkUu2fP3c18oZ3G3R3+P781w
GWori9FK3eTyVPs9E0dVgdo7S8G1pF/ECo8Cl4Mrj80rERAitQAMbSaN/dF0wUKu
okRZPJPVjd6GwqRRkXoqwh0vm4c+p3nAhFV+v7uK2BOUIJKPFbbn58vmmn+LVaBS
MFWSb+X85KwwftIezqCV/hqsMKAuhkvfIi+YQFCDXElJMtjPBxxuvZFjQFjEHe8=
=4NB5
-----END PGP SIGNATURE-----

この出力は、 `+ test1.txt +`の分離された署名です。

署名を配置したら、ファイルの暗号化に進むことができます。 これを行うには、 `+ encryptfiles +`スクリプトを実行します:

encryptfiles
OutputCreated encrypted directory
ok:  True
status:  encryption ok
stderr:  [GNUPG:] BEGIN_ENCRYPTION 2 9
[GNUPG:] END_ENCRYPTION

ok:  True
status:  encryption ok
stderr:  [GNUPG:] BEGIN_ENCRYPTION 2 9
[GNUPG:] END_ENCRYPTION

ok:  True
status:  encryption ok
stderr:  [GNUPG:] BEGIN_ENCRYPTION 2 9
[GNUPG:] END_ENCRYPTION

出力から、スクリプトが `+ encrypted / `フォルダーを作成したことに注意してください。 また、すべてのファイルが正常に暗号化されたことにも注意してください。 ` ls -l +`コマンドを再度実行し、ディレクトリ内の新しいフォルダーに注目してください。

ls -l
Outputtotal 20

drwxrwxr-x 2 sammy sammy 4096 Apr 21 14:11 signatures
-rw-rw-r-- 1 sammy sammy   15 Apr 15 10:08 test1.txt
-rw-rw-r-- 1 sammy sammy   15 Apr 15 10:08 test2.py
-rw-rw-r-- 1 sammy sammy   15 Apr 15 10:08 test3.txt

暗号化された `+ test1.txt +`のメッセージがどのように見えるか見てみましょう:

cat encrypted/test1.txt.gpg
Output-----BEGIN PGP MESSAGE-----
Version: GnuPG v1

hQEMA9Vtx+Y8cX3mAQf9FijeaCOKFRUWOrwOkUw7efvr5uQbSnxxbE/Dkv0y0w8S
Y2IxQPv4xS6VrjhZQC6K2R968ZQDvd+XkStKfy6NJLsfKZM+vMIWiZmqJmKxY2OT
8MG/b9bnNCORRI8Nm9etScSYcRu4eqN7AeUdWOXAFX+mo7K00IdEQH+0Ivyc+P1d
53WBgWstt8jHY2cn1sLdoHh4m70O7v1rnkHOvrQW3AAsBbKzvdzxOa0/5IKGCOYF
yC8lEYfOihyEetsasx0aDDXqrMZVviH3KZ8vEiH2n7hDgC5imgJTx5kpC17xJZ4z
LyEiNPu7foWgVZyPzD2jGPvjW8GVIeMgB+jXsAfvEdJJAQqX6qcHbf1SPSRPJ2jU
GX5M/KhdQmBcO9Sih9IQthHDXpSbSVw/UejheVfaw4i1OX4aaOhNJlnPSUDtlcl4
AUoBjuBpQMp4RQ==
=xJST
-----END PGP MESSAGE-----

元のファイルに保存された文は、暗号化プロセスの結果として複雑な一連の文字と数字に変換されました。

ファイルの署名と暗号化が完了したので、元のファイルを削除して、暗号化されたファイルから元のメッセージを復元できます。

オリジナルを削除するには、次を入力します。

rm *.txt *.py

`+ ls -l +`コマンドを再度実行して、元のファイルがすべて削除されたことを確認します。

ls -l
Outputtotal 8
drwxrwxr-x 2 sammy sammy 4096 Apr 21 14:42 encrypted
drwxrwxr-x 2 sammy sammy 4096 Apr 21 14:11 signatures

元のファイルがなくなったら、暗号化されたファイルを復号化して確認しましょう。 `+ encrypted +`フォルダーに移動し、すべてのファイルをリストします。

cd encrypted/ && ls -l
Outputtotal 12
-rw-rw-r-- 1 sammy sammy 551 Apr 21 14:42 test1.txt.gpg
-rw-rw-r-- 1 sammy sammy 551 Apr 21 14:42 test2.py.gpg
-rw-rw-r-- 1 sammy sammy 551 Apr 21 14:42 test3.txt.gpg

ファイルを復号化するには、現在のフォルダー内から `+ decryptfiles +`スクリプトを実行します:

decryptfiles
OutputCreated decrypted directory
ok:  True
status:  decryption ok
stderr:  [GNUPG:] ENC_TO D56DC7E63C717DE6 1 0
[GNUPG:] USERID_HINT D56DC7E63C717DE6 Autogenerated Key <[email protected]>
[GNUPG:] NEED_PASSPHRASE D56DC7E63C717DE6 D56DC7E63C717DE6 1 0
[GNUPG:] GOOD_PASSPHRASE
gpg: encrypted with 2048-bit RSA key, ID 3C717DE6, created 2018-04-15
     "Autogenerated Key <[email protected]>"
[GNUPG:] BEGIN_DECRYPTION
[GNUPG:] DECRYPTION_INFO 2 9
[GNUPG:] PLAINTEXT 62 1524321773
[GNUPG:] PLAINTEXT_LENGTH 15
[GNUPG:] DECRYPTION_OKAY
[GNUPG:] GOODMDC
[GNUPG:] END_DECRYPTION

ok:  True
status:  decryption ok
stderr:  [GNUPG:] ENC_TO D56DC7E63C717DE6 1 0
[GNUPG:] USERID_HINT D56DC7E63C717DE6 Autogenerated Key <[email protected]>
[GNUPG:] NEED_PASSPHRASE D56DC7E63C717DE6 D56DC7E63C717DE6 1 0
[GNUPG:] GOOD_PASSPHRASE
gpg: encrypted with 2048-bit RSA key, ID 3C717DE6, created 2018-04-15
     "Autogenerated Key <[email protected]>"
[GNUPG:] BEGIN_DECRYPTION
[GNUPG:] DECRYPTION_INFO 2 9
[GNUPG:] PLAINTEXT 62 1524321773
[GNUPG:] PLAINTEXT_LENGTH 15
[GNUPG:] DECRYPTION_OKAY
[GNUPG:] GOODMDC
[GNUPG:] END_DECRYPTION

ok:  True
status:  decryption ok
stderr:  [GNUPG:] ENC_TO D56DC7E63C717DE6 1 0
[GNUPG:] USERID_HINT D56DC7E63C717DE6 Autogenerated Key <[email protected]>
[GNUPG:] NEED_PASSPHRASE D56DC7E63C717DE6 D56DC7E63C717DE6 1 0
[GNUPG:] GOOD_PASSPHRASE
gpg: encrypted with 2048-bit RSA key, ID 3C717DE6, created 2018-04-15
     "Autogenerated Key <[email protected]>"
[GNUPG:] BEGIN_DECRYPTION
[GNUPG:] DECRYPTION_INFO 2 9
[GNUPG:] PLAINTEXT 62 1524321773
[GNUPG:] PLAINTEXT_LENGTH 15
[GNUPG:] DECRYPTION_OKAY
[GNUPG:] GOODMDC
[GNUPG:] END_DECRYPTION

スクリプトは、各ファイルに対して `+ status:encryption ok +`を返しました。これは、それぞれが正常に復号化されたことを意味します。

新しい「+ decrypted / 」フォルダーに移動し、「 cat 」コマンドを使用して「 test1.txt +」の内容を表示します。

cd decrypted/ && cat test1.txt
OutputThis is the first test file

削除した `+ test1.txt`ファイル内に保存されているメッセージを回復しました。

次に、 `+ verifydetach +`スクリプトで署名を検証して、このメッセージが実際に元のメッセージであることを確認しましょう。

署名ファイルには、署名者のIDと、署名されたドキュメントのデータを使用して計算されたハッシュ値が含まれています。 検証中、 `+ gpg +`は送信者の公開鍵を取得し、ハッシュアルゴリズムと一緒に使用してデータのハッシュ値を計算します。 検証を成功させるには、計算されたハッシュ値と署名内に保存されている値が一致する必要があります。

元のファイル、署名ファイル、または送信者の公開キーが改ざんされると、ハッシュ値が変更され、検証プロセスが失敗します。

`+ decrypted +`フォルダー内からスクリプトを実行します:

verifydetach
Outputtest2.py  signature valid
test1.txt  signature valid
test3.txt  signature valid

出力から、すべてのファイルに有効な署名があることがわかります。これは、このプロセス中にドキュメントが改ざんされていないことを意味します。

次に、署名後にドキュメントに変更を加えたときに何が起こるかを見てみましょう。 + nano`で + test1.txt`ファイルを開きます:

nano test1.txt

次に、ファイルに次の文を追加します。

〜/ python-test / encrypted / decrypted / test1.txt

This is the first test file

ファイルを保存して閉じます。

ここで、 `+ verify detach`スクリプトを再実行し、出力がどのように変更されたかに注目してください。

verifydetach
Outputtest2.py  signature valid
test1.txt  signature bad
test3.txt  signature valid

GnuPGが `+ test1.txt `を検証するときに ` signature bad `を返したことに注意してください。 これは、署名後にファイルに変更を加えたためです。 検証プロセス中に、 ` gpg `は署名ファイルに保存されたハッシュ値を、署名したドキュメントから計算したハッシュ値と比較することに注意してください。 ドキュメントに加えた変更により、 ` test1.txt `に対して異なるハッシュ値を計算する ` gpg `が作成されました。 ハッシュアルゴリズムがどのように機能するかについての詳細な議論は、http://etutorials.org/Programming/Programming.net+security/Part+III+.NET+Cryptography/Chapter+13.+Hashing+Algorithms/13.1+Hashing+Algorithmsで見つけることができます+説明/ [こちら]。

最後のテストでは、 `+ verifyfile `を使用して、スクリプトを実行する前に検証します。 このスクリプトは、 ` verifydetach `スクリプトの拡張として見ることができますが、次の違いがあります。スクリプトが検証プロセスに合格すると、 ` verifyfile +`が起動を開始します。

`+ test2.py `スクリプトは、起動時にコンソールに文字列を出力します。 これを使用して、 ` verifyfile +`スクリプトがどのように機能するかを示します。

+ verify file`で + test.py`スクリプトを実行します:

verifyfile test2.py
Outputtest2.py  signature valid
Signature valid, launching script...
The second test file is a Python script

出力から、スクリプトがファイルの署名を検証し、その検証に基づいて適切な結果を出力し、スクリプトを起動したことがわかります。

ファイルに追加のコード行を追加して、検証プロセスをテストしましょう。 `+ test2.py +`を開き、次のコード行を挿入します。

nano test2.py

〜/ python-test / encrypted / decrypted / test2.py

print "The second test file is a Python script"

次に、 `+ verifyfile +`スクリプトを再実行します。

verifyfile test2.py
Outputtest2.py signature bad
Signature invalid,
aborting script execution

スクリプトの検証に失敗し、スクリプトの起動が中止されました。

結論

`+ python-gnupg +`モジュールを使用すると、さまざまな暗号化ツールとPythonを統合できます。 データストリームの整合性を迅速に暗号化または検証する機能は、リモートデータベースサーバーへのクエリやデータの保存など、特定の状況で非常に重要です。 GnuPGキーはhttps://www.digitalocean.com/community/tutorials/how-to-use-duplicity-with-gpg-to-back-up-data-to-digitalocean-spaces[creatingバックアップ]およびSSH認証、またはVPNセットアップとの組み合わせ。

`+ python-gnupg +`モジュールの詳細については、https://pythonhosted.org/python-gnupg/ [python-gnupgプロジェクトページ]にアクセスしてください。 ファイルハッシュの詳細については、https://www.digitalocean.com/community/tutorials/how-to-verify-downloaded-files [ダウンロードしたファイルの確認方法]でこのガイドをご覧ください。