Как проверить код и зашифровать данные с помощью Python-GnuPG и Python 3

_Автор выбрал Open Internet / Free Speech Fund для получения пожертвования в рамках https://do.co/w4do-cta [Писать для DOnations] программа.

Вступление

Https://www.gnupg.org/[GnuPG package] предлагает комплексное решение для генерации и хранения криптографических ключей. Это также позволяет шифровать и подписывать данные и сообщения.

В этом руководстве вы создадите серию сценариев, использующих Python 3, с модулем python-gnupg. Эти сценарии позволят вам подписывать и шифровать несколько файлов, а также проверять целостность сценария перед его выполнением.

Предпосылки

Прежде чем продолжить этот урок, выполните следующие предварительные условия:

  • Настройте сервер Ubuntu 16.04, следуя учебному руководству Initial Настройка сервера для Ubuntu 16.04. После ознакомления с этим руководством вы должны иметь доступ к учетной записи пользователя sudo без полномочий root. В этом уроке наш пользователь будет называться * sammy *.

  • Убедитесь, что у вас установлены Python 3 и + pip +, выполнив шаг 1 из https://www.digitalocean.com/community/tutorials/how-to-install-python-3-and-set-up-a-local -programming-environment-on-ubuntu-16-04 # step-1-% E2% 80% 94-setting-up-python-3 [Как установить Python 3 и настроить среду локального программирования в Ubuntu 16.04].

  • Создайте пару ключей 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 для обеспечения взаимодействия между GnuPG и Python 3. Используя этот модуль, вы сможете создавать скрипты Python, которые делают следующее:

  • Создавайте отдельные подписи для файлов, добавляя уровень безопасности в процесс подписи, отделяя подписи от файлов.

  • Шифровать файлы.

  • Расшифровывать файлы.

  • Проверьте отдельные подписи и скрипты.

Сначала вы создадите сценарии вместе с некоторыми тестовыми файлами, а затем перейдете к тестированию сценариев для этих файлов.

Для начала давайте установим модуль + python-gnupg + вместе с пакетом + fs +, который позволит вам открывать, читать и писать тестовые файлы. Обновите индекс вашего пакета и установите эти пакеты с помощью + pip +:

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

С этими пакетами мы можем перейти к созданию сценариев и тестовых файлов.

Чтобы сохранить сценарии и тестовые файлы, создайте папку в вашем домашнем каталоге с именем + python-test +:

cd ~/
mkdir python-test

Переместить в этот каталог:

cd python-test/

Теперь давайте создадим три тестовых файла:

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 / +, которая будет создана при запуске скрипта.

Откройте новый файл с именем + signdetach.py ​​+, используя + nano + или ваш любимый текстовый редактор:

nano signdetach.py

Давайте сначала импортируем все необходимые модули для скрипта. К ним относятся пакеты + os + и + fs +, которые включают навигацию по файлам, и + gnupg +:

~ / Python-тест / signdetach.py

#!/usr/bin/env python3

import os
import fs
from fs import open_fs
import gnupg

Давайте теперь установим каталог, где GnuPG найдет свои ключи шифрования. GnuPG хранит свои ключи в + .gnupg + по умолчанию, поэтому давайте настроим это с нашим именем пользователя. Обязательно замените * sammy * на имя вашего пользователя без полномочий root:

~ / Python-тест / signdetach.py

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

Далее, давайте создадим переменную + home_fs + для хранения текущего местоположения каталога в виде файлового объекта. Это позволит сценарию работать в каталоге, в котором он выполняется:

~ / Python-тест / signdetach.py

...
home_fs = open_fs(".")

Теперь ваш скрипт будет выглядеть так:

~ / Python-тест / 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-тест / 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-тест / 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-тест / 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-тест / 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-тест / 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-тест / encryptfiles.py

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

Прежде чем искать файлы для шифрования, давайте создадим пустой массив для хранения имен файлов:

~ / Python-тест / encryptfiles.py

...
files_dir = []

Затем создайте цикл для сканирования папок на наличие файлов и добавьте их в массив:

~ / Python-тест / encryptfiles.py

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

Наконец, давайте создадим цикл для шифрования всех файлов в папке. После завершения все зашифрованные файлы будут перенесены в папку + encrypted / +. В этом примере ++ - это идентификатор электронной почты для ключа, который будет использоваться во время шифрования. Обязательно замените это на адрес электронной почты, который вы указали в шаге 1:

~ / Python-тест / 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 +, и вы хотите использовать определенный открытый ключ или несколько открытых ключей для шифрования, вам нужно изменить массив + receients +, добавив дополнительных получателей или заменив текущего. ,

Ваш скрипт + encrypt files.py будет выглядеть следующим образом:

~ / Python-тест / 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")

Теперь давайте посмотрим на вторую часть процесса: расшифровку и проверку нескольких файлов одновременно.

Шаг 4 - Расшифровка файлов

Сценарий дешифрования работает почти так же, как сценарий шифрования, за исключением того, что он предназначен для выполнения в каталоге + encrypted / +. При запуске + decryptfiles.py + сначала идентифицирует используемый открытый ключ, а затем ищет соответствующий закрытый ключ в папке + .gnupg +, чтобы расшифровать файл. Расшифрованные файлы будут храниться в новой папке с именем + decrypted / +.

Откройте новый файл с именем + decryptfiles.py + с помощью + nano + или вашего любимого редактора:

nano decryptfiles.py

Начните с вставки настроек конфигурации:

~ / Python-тест / 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(".")

Затем создайте два пустых массива для хранения данных во время выполнения скрипта:

~ / Python-тест / decryptfiles.py

...
files_dir = []
files_dir_clean = []

Целью здесь является сценарий, чтобы поместить расшифрованные файлы в их собственную папку; в противном случае зашифрованные и дешифрованные файлы будут смешаны, что затруднит поиск конкретного дешифрованного файла. Чтобы решить эту проблему, вы можете добавить код, который будет сканировать текущую папку, чтобы увидеть, существует ли папка + decrypted / +, создавая ее, если она не существует:

~ / Python-тест / 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-тест / 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-тест / 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-тест / 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-тест / 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-тест / 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-тест / 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-тест / 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-тест / 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-тест / 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-тест / verifyfile.py

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

Эта переменная принимает первый аргумент и сохраняет его во вновь созданной переменной. Затем скрипт откроет отсоединенный файл подписи, проверит файл в + script_to_run + со своей подписью, а затем выполнит его, если пройдет проверку:

~ / Python-тест / 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-тест / 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 +, чтобы дать исполняемые права доступа владельцу файлов, вашему пользователю без полномочий root:

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 +. Эта строка называется 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 +, мы можем запустить их из любой папки на сервере.

Во-первых, проверьте, работаете ли вы в каталоге + python-test с помощью команды` + pwd`:

pwd

Выход должен быть:

Output/home//python-test

Вы создали три тестовых файла ранее в этом уроке. Запустите команду + ls -l +, чтобы получить список файлов в папке:

ls -l

Вы должны увидеть три файла, которые хранятся в вашей папке + python-test +:

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

Мы будем тестировать сценарии этих трех файлов. Вы можете быстро отобразить содержимое файлов перед шифрованием, используя команду + 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 + среди элементов в списке. Давайте перечислим содержимое этой папки и рассмотрим одну из подписей.

Чтобы перечислить все подписи, введите:

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 + может отображать содержимое одной из этих подписей. Давайте посмотрим на содержимое подписи + 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: decryption ok + для каждого файла, что означает, что каждый файл был успешно расшифрован.

Перейдите в новую папку + decrypted / + и отобразите содержимое + test1.txt + с помощью команды + cat +:

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

Мы восстановили сообщение, сохраненное в файле + test1.txt, который мы удалили.

Далее, давайте подтвердим, что это сообщение действительно является исходным сообщением, проверив его подпись с помощью сценария + verifydetach +.

Файл подписи содержит личность подписавшего, а также хеш-значение, рассчитанное с использованием данных из подписанного документа. Во время проверки + gpg + возьмет открытый ключ отправителя и использует его вместе с алгоритмом хеширования для вычисления значения хеш-функции для данных. Вычисленное значение хеш-функции и значение, хранящееся в подписи, должны совпадать, чтобы проверка прошла успешно.

Любое вмешательство в исходный файл, файл подписи или открытый ключ отправителя приведет к изменению значения хеш-функции и сбоя процесса проверки.

Запустите скрипт из папки + decrypted +:

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

Из результатов видно, что все файлы имеют правильную подпись, что означает, что документы не были подделаны в ходе этого процесса.

Давайте теперь посмотрим, что происходит, когда вы вносите изменения в свой документ после его подписания. Откройте файл + test1.txt с помощью` + nano`:

nano test1.txt

Теперь добавьте следующее предложение в файл:

~ / Питон-тест / зашифрованный / расшифровка / test1.txt

This is the first test file

Сохраните и закройте файл.

Теперь перезапустите скрипт + verify detach и обратите внимание, как изменился вывод:

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

Обратите внимание, что GnuPG вернул + signature bad + при проверке + test1.txt +. Это потому, что мы внесли изменения в файл после того, как он был подписан. Помните, что в процессе проверки + gpg + сравнивает значение хеша, хранящееся в файле подписи, со значением хеша, которое оно вычисляет из подписанного вами документа. Изменения, которые мы внесли в документ, привели к тому, что + gpg + вычислило другое значение хеш-функции для + test1.txt +. Более подробное обсуждение того, как работают алгоритмы хеширования, можно найти по адресу 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 +.

Запустите скрипт + test.py с` + verify file`:

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

Из вывода видно, что скрипт проверял подпись файла, печатал соответствующий результат на основе этой проверки, а затем запускал скрипт.

Давайте проверим процесс проверки, добавив в файл дополнительную строку кода. Откройте + test2.py + и вставьте следующую строку кода:

nano test2.py

~ / Питон-тест / зашифрованный / расшифровка / 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 могут также использоваться для таких вещей, как creating резервные копии и аутентификация SSH, или в сочетании с настройкой VPN.

Чтобы узнать больше о модуле + python-gnupg +, вы можете посетить страницу проекта python-gnupg. Для получения дополнительной информации о хешировании файлов ознакомьтесь с этим руководством по адресу How To Verified Downloaded Files.

Related