Skip to content

Instantly share code, notes, and snippets.

@qfox
Last active April 14, 2023 15:45
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save qfox/46732a61b3d2f2ad24a459736efe199d to your computer and use it in GitHub Desktop.
Save qfox/46732a61b3d2f2ad24a459736efe199d to your computer and use it in GitHub Desktop.
Безопасно передаём файлики

Безопасно передаём файлики

TL;DR

Команда Что делает На чьей стороне
gpg --full-generate-key Генерируем ключи Получатель файла
gpg --armor --export {KEY_ID} > {KEY_ID}.pub.gpg Выгрузка ключа для передачи Получатель файла
gpg --import {KEY_ID}.pub.gpg Импорт ключа для шифрования Владелец файла
gpg -r {KEY_ID} -e {FILE} Шифрование файла Владелец файла
gpg -d {FILE}.gpg > {FILE} Дешифровка файла Получатель файла

Установка утилиты gpg

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

В большинстве случаев установлен сразу, но если команды gpg нет:

Генерируем свою пару ключей

Для создания пары ключей нужно запустить команду gpg --full-generate-key:

$ gpg --full-generate-key
gpg (GnuPG) 2.3.4; Copyright (C) 2021 Free Software Foundation, Inc.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Please select what kind of key you want:
   (1) RSA and RSA
   (2) DSA and Elgamal
   (3) DSA (sign only)
   (4) RSA (sign only)
   (9) ECC (sign and encrypt) *default*
  (10) ECC (sign only)
  (14) Existing key from card
Your selection?
Please select which elliptic curve you want:
   (1) Curve 25519 *default*
   (4) NIST P-384
   (6) Brainpool P-256
Your selection?
Please specify how long the key should be valid.
         0 = key does not expire
      <n>  = key expires in n days
      <n>w = key expires in n weeks
      <n>m = key expires in n months
      <n>y = key expires in n years
Key is valid for? (0)
Key does not expire at all
Is this correct? (y/N) y

GnuPG needs to construct a user ID to identify your key.

Real name: Иван Петров
Email address: ivan-petrov@ya.ru
Comment: Ключ для проверки
You are using the 'utf-8' character set.
You selected this USER-ID:
    "Иван Петров (Ключ для проверки) <ivan-petrov@ya.ru>"

Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? O
We need to generate a lot of random bytes. It is a good idea to perform
some other action (type on the keyboard, move the mouse, utilize the
disks) during the prime generation; this gives the random number
generator a better chance to gain enough entropy.
We need to generate a lot of random bytes. It is a good idea to perform
some other action (type on the keyboard, move the mouse, utilize the
disks) during the prime generation; this gives the random number
generator a better chance to gain enough entropy.
gpg: revocation certificate stored as '/Users/ivan-petrov/.gnupg/openpgp-revocs.d/5CBC20AE76404AAB080F97F6AADFC795DA003886.rev'
public and secret key created and signed.

pub   ed25519 2023-04-14 [SC]
      5CBC20AE76404AAB080F97F6AADFC795DA003886
uid                      Иван Петров (Ключ для проверки) <ivan-petrov@ya.ru>
sub   cv25519 2023-04-14 [E]

Проверка ключей

Все сгенерированные ключи хранятся в связке и их можно увидеть командами:

$ gpg --list-keys # публичные ключи
/Users/ivan-petrov/.gnupg/pubring.gpg
------------------------------
pub   ed25519 2023-04-14 [SC]
      5CBC20AE76404AAB080F97F6AADFC795DA003886
uid           [ultimate] Иван Петров (Ключ для проверки) <ivan-petrov@ya.ru>
sub   cv25519 2023-04-14 [E]

$ gpg --list-secret-keys
/Users/ivan-petrov/.gnupg/pubring.gpg
------------------------------
sec   ed25519 2023-04-14 [SC]
      5CBC20AE76404AAB080F97F6AADFC795DA003886
uid           [ultimate] Иван Петров (Ключ для проверки) <ivan-petrov@ya.ru>
ssb   cv25519 2023-04-14 [E]

Внимание! Не передавайте секретные ключи по незащищенным каналам во избежание утечек.

Получаем и передаём публичные ключи

Чтобы выгрузить публичный ключ — используем --export и передаём id ключа (этот ключ нужно передать партнёру):

$ gpg --export --armor 5CBC20AE76404AAB080F97F6AADFC795DA003886 > ~/pubkey.gpg
$ cat ~/pubkey.gpg
-----BEGIN PGP PUBLIC KEY BLOCK-----

mDMEZDkRlhYJKwYBBAHaRw8BAQdABErysVZojlAKyf2fGHASj1RnDz277Mtc0LFk
q+pA53i0T9CQ0LvQtdC60YHQtdC5INCv0YDQvtGI0LXQstC40YcgKNCa0LvRjtGH
INC00LvRjyDQv9GA0L7QstC10YDQutC4KSA8cWZveEB5YS5ydT6IlAQTFgoAPBYh
BFy8IK52QEqrCA+X9qrfx5XaADiGBQJkORGWAhsDBQsJCAcCAyICAQYVCgkICwIE
FgIDAQIeBwIXgAAKCRCq38eV2gA4hoc4AQDq7XJ16+bu3fkxA8sRY4n7U+rb3qKK
YPdOPDeyk6McFgEA7WS6FXh6psE+W71lhZKPryabY7eE7AW2PqTGC71g6A64OARk
ORGWEgorBgEEAZdVAQUBAQdAkWFYj4cyYZQ6J2LcTlt7vJx+trhQGLeyyGGQ4XCk
2WADAQgHiHgEGBYKACAWIQRcvCCudkBKqwgPl/aq38eV2gA4hgUCZDkRlgIbDAAK
CRCq38eV2gA4hjxlAQCC6ehdGz/jo6+aOQX/qkutDJUhu2BnArxRgOqV/3doAQD/
cQAp5F2qFOTOfJ7sr/JeTeIvZogFUP4NGzB/9hjtig8=
=THRK
-----END PGP PUBLIC KEY BLOCK-----

Чтобы загрузить ключ партнёра в хранилище для расшифровки его данных используем --import:

$ gpg --import ~/pubkey.gpg
gpg: key AADFC795DA003886: "Иван Петров (Ключ для проверки) <ivan-petrov@ya.ru>" not changed
gpg: Total number processed: 1
gpg:              unchanged: 1

Шифруем сообщение

С помощью публичного ключа партнёра мы можем зашифровать сообщение, которое сможет расшифровать только обладатель секретного ключа из пары — партнер.

Команды могут немного отличаться между разными OS

Чтобы зашифровать сообщение нужно запустить команду gpg с указанием ключа или получателя в --recipient и файла в --encrypt:

$ echo 'Приветик!' > themessage.txt
$ gpg -r 5CBC20AE76404AAB080F97F6AADFC795DA003886 -e message.txt
$ ls themessage.txt*
themessage.txt      themessage.txt.gpg

Файл themessage.txt.gpg зашифрован и чтобы его прочитать нужна секретная (приватная) часть пары.

Теперь этот файл можно безопасно передавать партнёру по незащищённому каналу.

Расшифровываем сообщение

Запускаем gpg с параметром --decrypt на той машинке, где есть секретная часть пары ключа, и файл будет расшифрован, а нам останется его записать:

$ gpg -d themessage.txt.gpg > themessage.txt
gpg: encrypted with cv25519 key, ID 38D43D06C54F4498, created 2023-04-14
      "Иван Петров (Ключ для проверки) <ivan-petrov@ya.ru>"
$ cat themessage.txt
Приветик!

Етц

Подробнее про gpg можно почитать в документации и различных статьях, например: https://habr.com/ru/articles/358182/

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment