mirror of
				https://github.com/ItsDrike/itsdrike.com.git
				synced 2025-11-03 19:56:36 +00:00 
			
		
		
		
	Add GnuPG post
This commit is contained in:
		
							parent
							
								
									27d31ce605
								
							
						
					
					
						commit
						e293fb9aa0
					
				
					 2 changed files with 403 additions and 0 deletions
				
			
		
							
								
								
									
										403
									
								
								content/posts/gnupg/index.md
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										403
									
								
								content/posts/gnupg/index.md
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,403 @@
 | 
			
		|||
---
 | 
			
		||||
title: Introduction to encryption with GnuPG
 | 
			
		||||
date: 2022-04-10
 | 
			
		||||
tags: [privacy, linux, encryption]
 | 
			
		||||
---
 | 
			
		||||
 | 
			
		||||
GnuPG (short for GNU Privacy Guard), also known as just GPG is a public-key cryptography implementation. This allows
 | 
			
		||||
for a secure transmission of files between parties and can also be used to digitally sign files, to prove that they
 | 
			
		||||
weren't modified in any way.
 | 
			
		||||
 | 
			
		||||
However until somewhat recently, even though I knew that many people used this tool, and I knew what it was doing, I
 | 
			
		||||
mostly avoided actually using it because I simply didn't know how to. But over the last few months, I've learned a lot
 | 
			
		||||
about how it works internally, and obviously about it's basic usage, and I wanted to share some of this knowledge and
 | 
			
		||||
give you a basic guide showing what GPG can do, and perhaps an article which you can quickly refer to if you forget
 | 
			
		||||
what command to run for what thing.
 | 
			
		||||
 | 
			
		||||
## How Public Key Encryption works
 | 
			
		||||
 | 
			
		||||
In Public Key Encryption, or asymetric encryption, the issuer creates a key pair, consisting of a public key, and a
 | 
			
		||||
private key. As the name would imply, private key is kept to the issuer and should never be exposed, while the public
 | 
			
		||||
key should be given to anyone freely.
 | 
			
		||||
 | 
			
		||||
This kind of structure is very useful, because it allows others to have some information (public key) with which they
 | 
			
		||||
can encrypt files in a way that they'll only be decryptable with the private key, which they don't have, so after
 | 
			
		||||
deleting the original file, even they wouldn't then be able to decrypt that file, making it safe to have it stored on
 | 
			
		||||
their system. 
 | 
			
		||||
 | 
			
		||||
If both parties then create their own key pairs and share the public keys between each other, it allows
 | 
			
		||||
for a secure communication between them, even if there were someone monitoring their communication, because both
 | 
			
		||||
parties only ever sent the public keys, and while they can be used for encryption, the man in the middle wouldn't be
 | 
			
		||||
able to decrypt any sent files.
 | 
			
		||||
 | 
			
		||||
This also allows the issuer to "sign" a file, creating a unique signature file, which people can check against that
 | 
			
		||||
file to confirm it wasn't modified. This signature can only be generated with the issuer's secret/private key, however
 | 
			
		||||
anyone with the public key can check that the signature is genuine and was issued by the corresponding private key to
 | 
			
		||||
their public one.
 | 
			
		||||
 | 
			
		||||
In contrast, a symetric encryption scheme, which is the alternative, is when the involved parties share the same key,
 | 
			
		||||
with which they can both encrypt and decrypt files. The disadvantage of this scheme is that if someone is spying on a
 | 
			
		||||
conversation already, sending this key to the other party safely isn't possible, and if the attacker gets hold of it,
 | 
			
		||||
they can decrypt all sent conversation easily. Symetric encryption also lacks the possibility of meaningful signature
 | 
			
		||||
generation, since to verify the signature, you'd need the single key, and if you did have that key, you could easily
 | 
			
		||||
modify the file and sign in with that key, resulting in a perfectly valid signature.
 | 
			
		||||
 | 
			
		||||
## How to install GPG
 | 
			
		||||
 | 
			
		||||
If you're on basically any Linux distribution, you'll most likely already have gpg installed, since most package
 | 
			
		||||
managers require the packages to be signed by the maintainers, and this is done with the use of GnuPG. But in the
 | 
			
		||||
unlikely case that you wouldn't have it installed, you'll probably be able to find it in your package manager, under
 | 
			
		||||
`gpg`, or `gnupg` name, if neither works, try adding `2` behind them, signifying the version. If for some reason the
 | 
			
		||||
package isn't in the package manager (very unlikely), you can also build it from 
 | 
			
		||||
[source](https://github.com/gpg/gnupg).
 | 
			
		||||
 | 
			
		||||
If you're on Windows (why would you do that to yourself?), you can install 
 | 
			
		||||
[gpg4win](https://www.openpgp.org/software/gpg4win/), which is a ported version of gpg.
 | 
			
		||||
 | 
			
		||||
## Creating your key
 | 
			
		||||
 | 
			
		||||
To create your own public-private key pair, you'll need to issue this command:
 | 
			
		||||
 | 
			
		||||
```sh
 | 
			
		||||
gpg --full-gen-key
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
This will ask a few questions, that will configure the key, most notably this will be:
 | 
			
		||||
- **Key type** - Which you will most likely want to keep at the default value (RSA and RSA)
 | 
			
		||||
- **Key size** - Where you should prefer the biggest possible size (probably 4096 bits), to make brute-force attacks
 | 
			
		||||
  really hard
 | 
			
		||||
- **Expiration time** - If you want to limit the time your key will be valid for, note that with a private key, this
 | 
			
		||||
  time can later be changed, if you need to extend/shorten it.
 | 
			
		||||
- **Real name** - your name (it doesn't actually need to be real)
 | 
			
		||||
- **Email address** - You should make sure you actually have access to this email, to allow the key to be registered on
 | 
			
		||||
  key-servers (I'll describe those later)
 | 
			
		||||
- **Comment** - Usually holds the purpose of given key, but can be left empty
 | 
			
		||||
- **Passphrase** - Keys with passphrase will require entering this phrase each time the private key will be used (for
 | 
			
		||||
  each signature generation, or file decryption). This does add to security, since even if someone got access to your
 | 
			
		||||
  files and got the key, it wouldn't be useful without the passphrase. But having to enter a passphrase each time can
 | 
			
		||||
  be annoying, ultimately you have to choose if you want convenience, or more security.
 | 
			
		||||
 | 
			
		||||
After this, GPG will generate the actual keys, containing the configuration you entered using *entropy*. Entropy
 | 
			
		||||
describes the amount of unpredictability that exists in your system. This is used to securely generate a random value
 | 
			
		||||
(the key), which couldn't easily be reconstructed (computers are generally bad at creating truly random values).
 | 
			
		||||
 | 
			
		||||
Depending on the key size, this may take a while, though from my experience, it's usually very quick, but some people
 | 
			
		||||
do report it taking minutes. If this is your experience, you can try using a tool like `haveged`, which generates
 | 
			
		||||
entropy from the CPU timings, or you can just do so yourself, by moving windows around, starting random programs, etc.
 | 
			
		||||
 | 
			
		||||
## List your key(s)
 | 
			
		||||
 | 
			
		||||
If you have more keys with the same email in your GPG database, you may need to obtain the key ID instead of simply
 | 
			
		||||
using the email to refer to your key in other commands, because the email would now point to multiple keys. To list all
 | 
			
		||||
keys with a given email, you can simply run:
 | 
			
		||||
 | 
			
		||||
```sh
 | 
			
		||||
gpg --list-keys [your-email]
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
You can also leave out the email, and just run `gpg --list-keys`, to see all keys that are in your GPG database. This
 | 
			
		||||
will likely contain a lot of keys that were added by your package manager, but your key should be present in there too.
 | 
			
		||||
 | 
			
		||||
If you instead just want to see the keys which you have the secret/private key for (so probably only your own keys), 
 | 
			
		||||
you can also run `gpg --list-secret-keys`.
 | 
			
		||||
 | 
			
		||||
The key ID is the long string (probably on the second line), looking like this:
 | 
			
		||||
 | 
			
		||||

 | 
			
		||||
 | 
			
		||||
This key ID is safe to share and doesn't expose your private key nor your public key in any way.
 | 
			
		||||
 | 
			
		||||
## Generate a revocation certificate
 | 
			
		||||
 | 
			
		||||
After you've made your own private-public key pair, you'll want to make absolutely certain that you also generate a so
 | 
			
		||||
called "Revocation certificate". This is a certificate file which you generate using your private key, and it allows
 | 
			
		||||
you to immediately prove that you've been in the possession of the private key at some point. When you send this
 | 
			
		||||
certificate to others, they can apply it which will immediately revoke your key validity and the key will be considered
 | 
			
		||||
no longer valid.
 | 
			
		||||
 | 
			
		||||
Many people are instead relying on the expiration date to limit the damage, even if an attacker got access to the
 | 
			
		||||
private key, however that is not a good solution, because with a private key, it's actually possible to change the
 | 
			
		||||
expiration date and content signed with this key with a changed expiration date will be recognized and accepted by the
 | 
			
		||||
public key. An expired key isn't safe to dispose of either, since the expiration date can actually be changed even
 | 
			
		||||
after that expiration date, giving you a false sense of safety!
 | 
			
		||||
 | 
			
		||||
You should then make sure that you store your revocation certificate in a separate place, so that if the computer with
 | 
			
		||||
the private keys got compromised, and you lost the access to the private key completely, you'll still have a way to
 | 
			
		||||
prove that you did have that access at some point, and have a certificate that revokes the validity of that now
 | 
			
		||||
compromised key.
 | 
			
		||||
 | 
			
		||||
To generate this certificate, type:
 | 
			
		||||
 | 
			
		||||
```sh
 | 
			
		||||
gpg --output ./revocation.crt --gen-revoke [key-id]
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
Where the `[key-id]` should be replaced by the unique ID given to this key by GPG. This can also be the email address,
 | 
			
		||||
however that's not a good ID if you have multiple generated keys with the same email address (if you enter an email,
 | 
			
		||||
matching multiple keys, gpg will show you the possible keys it knows about with that emails, and their IDs).
 | 
			
		||||
 | 
			
		||||
After that, you'll be asked to confirm that you want to create a revocation certificate, and you'll then be asked for a
 | 
			
		||||
reason for the certificate. Since you're making this certificate ahead of time, ideally, you should make one for each
 | 
			
		||||
of the scenarios, since the revocation reason will be shown to other users.
 | 
			
		||||
 | 
			
		||||
## Importing someone else's key
 | 
			
		||||
 | 
			
		||||
GPG keys can be distributed as files, and you should ask the party you wish to communicate with for their public key,
 | 
			
		||||
so that you can import it to generate encrypted messages, that only they can read. Once they give you this key, to
 | 
			
		||||
import it you can use this command:
 | 
			
		||||
 | 
			
		||||
```sh
 | 
			
		||||
gpg --import name_of_pub_key_file
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
But files aren't the only way of sharing keys. People often import their keys to "key servers" (I'll explain those
 | 
			
		||||
later), if this is the case with your other party, you can get their key simply by searching for it on that key server,
 | 
			
		||||
usually by searching for their email address on that key server. You'll also need to know what key server is this the
 | 
			
		||||
key stored on. The common ones are: `keys.openpgp.org`, `pgp.mit.edu`, `keyserver.ubuntu.com`, but there are countless
 | 
			
		||||
others. To import a key from one of these key servers, you can use:
 | 
			
		||||
 | 
			
		||||
```sh
 | 
			
		||||
gpg --keyserver keys.openpgp.org --search-keys [search parameters]
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
You can replace `[search parameters]` with the email or key's ID, sometimes keyservers also allow searching for user
 | 
			
		||||
IDs, or other things, but some keyservers won't support those. (If you want to try this out, you can use
 | 
			
		||||
`itsdrike@protonmail.com` on `keys.openpgp.org`)
 | 
			
		||||
 | 
			
		||||
## Sign the received key
 | 
			
		||||
 | 
			
		||||
Once you receive someone's key, you should then sign it with your own key, to tell GPG that you do trust that this key
 | 
			
		||||
is legitimate and that you've verified it belongs to who it says it does. To do that, you can do:
 | 
			
		||||
 | 
			
		||||
```sh
 | 
			
		||||
gpg --sign-key [key-id]
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
Where, once again, `[key-id]` can be replaced by the received key's email address, or the ID.
 | 
			
		||||
 | 
			
		||||
After you've signed the key, you should help the key's issuer to take the advantage of your signing and send them that
 | 
			
		||||
signed version, so that when they're distributing their key to someone else, if that someone already has your key
 | 
			
		||||
imported and they trust you, they can find out that you've trusted this key in that it's information (name, email) is
 | 
			
		||||
in fact correct. 
 | 
			
		||||
 | 
			
		||||
```sh
 | 
			
		||||
gpg --output ./signed-key.key --export --armor [key-id]
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
When they then receive your signed key, they can simply import it back into their database with:
 | 
			
		||||
 | 
			
		||||
```sh
 | 
			
		||||
gpg --import ./signed-key.key
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
## Sharing your keys
 | 
			
		||||
 | 
			
		||||
Now that you've created your public-private key pair, and managed to import someone elses public key, you'll probably
 | 
			
		||||
want to know how to actually share your own keys.
 | 
			
		||||
 | 
			
		||||
### Sharing public key
 | 
			
		||||
 | 
			
		||||
For a meaningful communication between you and the other party, just having their public key isn't enough, they also
 | 
			
		||||
need to have your public key, so that they can send you encrypted messages that only you can decrypt too. To do this,
 | 
			
		||||
you will need to export your private key into a file which you can then send. You can do this with a following command:
 | 
			
		||||
 | 
			
		||||
```sh
 | 
			
		||||
gpg --output ./my-public-key.key --armor --export [key-id]
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
But in most cases, you'll likely want to make your public key available to anyone who wants it, instead of having to
 | 
			
		||||
send it individually. You can do this in many ways, for example putting this key file onto your website, but the most
 | 
			
		||||
common solution for this is to use a key server. Most key servers have a front-end which you can upload this exported
 | 
			
		||||
file to manually, and as a verification that the key does indeed belong to you, you'll be sent an email with some
 | 
			
		||||
verification link/token.
 | 
			
		||||
 | 
			
		||||
Another option is to send the keys to a keyserver directly through GPG, which you can do like this:
 | 
			
		||||
 | 
			
		||||
```sh
 | 
			
		||||
gpg --send-keys --keyserver [keyserver URL] [key-id]
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
Note that keyservers often sync with other trusted keyservers, so if you upload your key to one key-server, it may
 | 
			
		||||
actually get shared around across many other keyservers too.
 | 
			
		||||
 | 
			
		||||
### Sharing a private key
 | 
			
		||||
 | 
			
		||||
When you're moving to another computer, or you want to work on multiple machines, you may need to have your GPG keys on
 | 
			
		||||
both of these machines. This process is pretty similar to exporting a public key, but with private keys, you will need
 | 
			
		||||
to be a lot more careful in where you then put this exported file and how you get it into the other machine. This is
 | 
			
		||||
because if at any point someone else gets to your private key, you can consider the key as compromised and immediately
 | 
			
		||||
issue out your revocation certificate to everyone who currently has your public key on their system and generate a new
 | 
			
		||||
key for yourself.
 | 
			
		||||
 | 
			
		||||
For this reason, whenever you're dealing with an exported secret key, once you've imported it into the other system,
 | 
			
		||||
you should immediately shred this file so that it can't be recovered from whatever media you used to transfer it to the
 | 
			
		||||
other machine, and if you're transferring over the internet, you should always make sure your connection is end-to-end
 | 
			
		||||
encrypted before even considering to send over the exported secret key.
 | 
			
		||||
 | 
			
		||||
Now that you know the risks, to export a private/secret key, you can run this command:
 | 
			
		||||
 | 
			
		||||
```sh
 | 
			
		||||
gpg --output ./my_private_key.key --export-secret-keys [key-id]
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
Importing it afterwards is quite simple, and uses the same command as importing public keys:
 | 
			
		||||
 | 
			
		||||
```sh
 | 
			
		||||
gpg --import ./my_private_key.key
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
Note that you will want to export both private key, and a public key to then use your key on another machine.
 | 
			
		||||
 | 
			
		||||
## File encryption with GPG
 | 
			
		||||
 | 
			
		||||
Now that you've generated your key and exchanged the public parts with the other parties, you can finally actually get
 | 
			
		||||
to communicating with the other party in a fully end-to-end encrypted way! 
 | 
			
		||||
 | 
			
		||||
### Encryption
 | 
			
		||||
 | 
			
		||||
To encrypt a file, we can use this command:
 | 
			
		||||
 | 
			
		||||
```sh
 | 
			
		||||
gpg --armor --encrypt -r --armor [key-id] my_plaintext_file.txt
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
Here, the `[key-id]` points to the recipient's public key id, so either an email, or key's ID directly. This is NOT
 | 
			
		||||
your key id, it's the recipient's one!
 | 
			
		||||
 | 
			
		||||
This will generate an encrypted file with the same name as the original, but with an additional extension of `.asc`,
 | 
			
		||||
this extension means that we used ASCII readable characters in the encrypted file, instead of raw bytes. If you don't
 | 
			
		||||
need this, you can leave out the `--armor` flag, and instead get a file that ends with `.gpg` and contains the raw
 | 
			
		||||
bytes after encryption.
 | 
			
		||||
 | 
			
		||||
The use of `-r` flag is also optional, and using it will allow the encrypted file to also be decrypted by us, not just
 | 
			
		||||
by the recipient. This is something that we usually want, so that we can actually know what we sent even after deleting
 | 
			
		||||
the file on our side, but if for any reason we wouldn't want to be able to decrypt this later on, leaving out this flag
 | 
			
		||||
will ensure that without the recipient's private key, we won't be able to decrypt this file.
 | 
			
		||||
 | 
			
		||||
Optionally, if you want to let the recipient know that it was you who encrypted this file, you can also perform signing
 | 
			
		||||
on the encrypted result. You can do this separately, following the signing file section, or you can simply include
 | 
			
		||||
`--sign` flag when running this command, but note that you may also need `--sign-key [your-key-id]` if you haven't
 | 
			
		||||
already specified a signing key in your GPG settings. (More about this in the signing files section).
 | 
			
		||||
 | 
			
		||||
### Decryption
 | 
			
		||||
 | 
			
		||||
After you've managed to send an encrypted file to the other party, decryption on their side is very easy. GPG will
 | 
			
		||||
automatically detect what key was used to encrypt this file (as long as the key is in GPG's database) and if there's a
 | 
			
		||||
private part present for this key, it will decrypt it without needing to manually specify what key to use. All that's
 | 
			
		||||
needed is running this command:
 | 
			
		||||
 | 
			
		||||
```sh
 | 
			
		||||
gpg --decrypt encrypted_message.txt.gpg
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
## Signing files
 | 
			
		||||
 | 
			
		||||
Other than just encryption, GPG also supports so called "signing". This is done to prove that you've verified that
 | 
			
		||||
given signed file wasn't tampered with and is legitimate. Signing a file requires a private key, and can then be
 | 
			
		||||
verified by anyone with a matching public key. When you create a digital signature file like this, if someone were to
 | 
			
		||||
edit the original file, the signature would no longer match to that file, and they wouldn't be able to generate a new
 | 
			
		||||
one, at least not without your private key. This is why you see many linux installation media (ISOs) also provide a
 | 
			
		||||
signature file, which was signed with the private keys of the maintainers. 
 | 
			
		||||
 | 
			
		||||
### Full signatures
 | 
			
		||||
 | 
			
		||||
To sign a file, use this command:
 | 
			
		||||
 | 
			
		||||
```sh
 | 
			
		||||
gpg --sign-key [your-key-id] --sign untampered_file.txt
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
Optionally, you can go to you GPG settings at `~/.local/share/gnupg/gpg.conf`, or sometimes in `~/.gnupg/gpg.conf` and
 | 
			
		||||
specify the default signing key so you don't need to keep entering the `--sing-key` flag. To do that, just add a line
 | 
			
		||||
saying `default-key [key-id]`, note that in this case though, the `[key-id]` should be the actual ID given to the key
 | 
			
		||||
by GPG, to avoid any confusion with other keys that may be added later with the same email.
 | 
			
		||||
 | 
			
		||||
After that, you'll get a signed file, named `untampered_file.txt.gpg`, again, if you want to, you can use ASCII
 | 
			
		||||
encoding instead of just raw bytes to make it easier to share the file by simply specifying the `--armor` flag, in that
 | 
			
		||||
case, the file will instead end with `.asc`.
 | 
			
		||||
 | 
			
		||||
At this point, instead of sharing the original file, you can distribute the signed file, however this probably isn't
 | 
			
		||||
actually what you'd want, because it would require the recipients to use GPG to get the original file from the signed
 | 
			
		||||
version. Instead, what's way more common is to generate a "detached signature", described below.
 | 
			
		||||
 | 
			
		||||
### Detached signatures
 | 
			
		||||
 | 
			
		||||
A detached signature is a separate file, which is distributed along with the original file that the signature is for.
 | 
			
		||||
This detached signature only contains the actual signature contents, without also including the entire file contents.
 | 
			
		||||
That way, people don't need to do any extra work to get the original file out of a full signature file, but it's still
 | 
			
		||||
very easy to verify, that the signature does in fact match the distributed file, and that it was signed by a trusted
 | 
			
		||||
key. To generate this kind of signature, use this command:
 | 
			
		||||
 | 
			
		||||
```sh
 | 
			
		||||
gpg --sign-key [your-key-id] --detach-sign untampered_file.txt
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
This will now generate the signature file as `untampered_file.txt.sig`, but once again, you can use `--armor` to
 | 
			
		||||
instead get `untampered_file.txt.asc` in ASCII encoding.
 | 
			
		||||
 | 
			
		||||
### Checking the validity of a signature
 | 
			
		||||
 | 
			
		||||
Any time a file comes with a signature, you'll most likely want to verify that this signature is genuine and that it
 | 
			
		||||
does belong to the distributed file, and was made with the trusted key. To do this, you will need the public key part,
 | 
			
		||||
with which this signature was generated imported in your gpg database. After that, you can simply run this command:
 | 
			
		||||
 | 
			
		||||
```sh
 | 
			
		||||
gpg --verify untampered_file.txt.sig untampered_file.txt
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
This will show you who is the issuer of this signature, and would fail if it didn't match the given file (second
 | 
			
		||||
argument), reporting a BAD signature.
 | 
			
		||||
 | 
			
		||||
In case you're working with full signatures, instead of a detached signature file and an original (pretty uncommon),
 | 
			
		||||
you can simply only use the single full signature file as an argument to the `--verify` flag:
 | 
			
		||||
 | 
			
		||||
```sh
 | 
			
		||||
gpg --verify untampered_file.txt.gpg
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
After that, you'll likely want to extract the original file from the fully signed file, to do that, simply run:
 | 
			
		||||
 | 
			
		||||
```sh
 | 
			
		||||
gpg --output untampered_file.txt untampered_file.txt.gpg
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
## Misc
 | 
			
		||||
 | 
			
		||||
If you've managed to get all the way to this section, congratulations! You should now know a ton about how basic
 | 
			
		||||
asymetric encryption works and what can it do, and also how to utilize it with GPG, to sign files or send encrypted
 | 
			
		||||
messages to your friends.
 | 
			
		||||
 | 
			
		||||
However I wanted to talk a bit more about many different places where GPG is often used, and maybe where you can use
 | 
			
		||||
it:
 | 
			
		||||
- A very common use-case, which I've already mentioned a bit about is the use in package managers. This is because with
 | 
			
		||||
  package managers, it's hard for the owners of these to set up world-wide mirror servers across the entire world and
 | 
			
		||||
  maintain each and every one of them, so instead, they rely on other people to set their own mirrors and make them
 | 
			
		||||
  accessible to others. However this comes with an obvious risk, and that is that you need to trust the owner of this
 | 
			
		||||
  mirror server that they aren't tampering with the packages and putting malware into them. To do that, usually every
 | 
			
		||||
  package will be signed with the secret key of the maintainers of this package manager, and building and automatic
 | 
			
		||||
  verifier in the package manager, that ensures each package was signed with the correct key, and matches the package.
 | 
			
		||||
- Another relatively common practice amongst developers is to sign their git commits. This is done to prove that these
 | 
			
		||||
  commits are authentic and in fact made by the correct person. An unsigned commit is not trustworthy, because anyone
 | 
			
		||||
  can change their committing email to anything and there's no check ensuring that this email does in fact belong to
 | 
			
		||||
  them. However if a commit is signed with a trusted key, and you've verified that this key is authentic and does in
 | 
			
		||||
  fact belong to who it says it does, you can then trust all commits signed with this key without worrying they're
 | 
			
		||||
  faked.
 | 
			
		||||
- Encrypting emails is also very commonly done through GPG, and in fact, a lot of email software (such as Thunderbird)
 | 
			
		||||
  include native support for automatic encryption/decryption with GPG. This manual encryption in emails is necessary,
 | 
			
		||||
  because the email protocol is very old, and it doesn't actually have any encryption at all. That means that your
 | 
			
		||||
  email providers do actually receive your emails unencrypted and can read through all of them! Some providers, such as
 | 
			
		||||
  protonmail, do claim that they always store your emails encrypted, which may be true (though you have to trust them
 | 
			
		||||
  on it, you can't easily verify this claim), however this encryption only happens after the email is received, so they
 | 
			
		||||
  can still capture the contents of your email, even if they can't read the already stored ones (if they do actually
 | 
			
		||||
  encrypt them that is).
 | 
			
		||||
- Simple file encryption, for example on files that you have on a USB drive which you may worry someone may steal, or
 | 
			
		||||
  even for files on your computer directly, if they're sensitive (such as passwords, sensitive documents, ...)
 | 
			
		||||
- GPG is also good at generating random sequences from your system's entropy, often used as seeds for pseudo-random
 | 
			
		||||
  number generation, or for creation of new keys
 | 
			
		||||
- Encrypted full system backups, stored on a cloud. This prevents the cloud provider from getting into your precious
 | 
			
		||||
  files stored on your system, but still allows you to keep big backup files on their computer, that you can decrypt
 | 
			
		||||
  whenever you'd actually need them
 | 
			
		||||
 | 
			
		||||
Oh and, in case you'd want to send me something encrypted, feel free to get my public key from `keys.openpgp.org`,
 | 
			
		||||
registered under email: `itsdrike@protonmail.com`. You can also get it from my website as a file 
 | 
			
		||||
[here](https://s.itsdrike.com/gpg).
 | 
			
		||||
							
								
								
									
										
											BIN
										
									
								
								content/posts/gnupg/key-id.png
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								content/posts/gnupg/key-id.png
									
										
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| 
		 After Width: | Height: | Size: 59 KiB  | 
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue