Why client side is the only sane place to run PGP
A PGP tool that runs on a server has already lost the argument. To decrypt anything it needs your private key and your passphrase, which means asking you to hand over both to a machine you cannot inspect. At that point the encryption is decorative.
Everything here happens in your tab. The OpenPGP implementation is a JavaScript module delivered with the page, running against your browser’s own cryptography, and it has no network calls of its own. Your private key exists in the page’s memory for as long as the tab is open and then it is gone.
The library choice was checked rather than assumed. It has zero transitive dependencies, it does not require the cross-origin isolation headers that would break other parts of this site, and it runs identically in a browser and in a test runner, which is how the encrypt, decrypt, sign and verify paths here are tested against real generated keys rather than mocks.
Generating a key pair and using it
- Open the Generate keys tab. Fill in Name (shown on the key) and Email (shown on the key). At least one of the two is required, because an OpenPGP key carries a user ID.
- Pick a Key type. Curve25519 (recommended, modern & fast) is the default. RSA 3072-bit (legacy compatibility) and RSA 4096-bit (legacy, stronger, slower) are there for older software.
- Set a passphrase. The field is optional and the label tells you to use one anyway.
- Click Generate key pair. Save both halves with the download buttons, which produce publickey.asc and privatekey.asc.
- Switch to Encrypt, paste the recipient’s public key, type a message or attach a file, and click the encrypt button.
- The recipient uses Decrypt with their private key and passphrase.
- Sign produces a clear-signed message that anybody can read, with a signature block attached. Verify checks one against a public key.
Send the public key freely and never the private one. The two files look similar at a glance, which is exactly how people leak private keys, so check the header line before you attach anything.
Encrypting a file rather than a message
The encrypt tab accepts either, and picking a file disables the message box so there is no ambiguity about what is being encrypted.
An encrypted file keeps its whole original name and gains a .gpg extension, so report.pdf becomes report.pdf.gpg. That convention matters on the way back, because the decryption side uses it: if the sender’s software recorded a filename inside the message it is used, otherwise the trailing .gpg, .pgp or .asc is removed to recover the original name.
There is one sentinel worth knowing about. Some tools write a special marker instead of a real filename to signal that a message was meant to be read on screen and never written to disk. That marker is recognised and ignored rather than being used as a filename.
Errors that tell you what to fix
Cryptographic libraries produce accurate messages written for developers. Misformed armored text is a correct description of the problem and useless to somebody who just pasted half a key block.
Three of the most common failures are translated. Pasting something that is not a valid key or message gets a reply naming the header and footer lines you need to include. A wrong passphrase is reported as a wrong passphrase. A message that cannot be decrypted with the private key you supplied is reported as having most likely been encrypted for a different key, which is by far the usual cause.
Anything unrecognised passes through with its original wording, so a genuine bug stays diagnosable rather than being flattened into a friendly non-answer.
Related key material
PGP is not the only kind of key you might need. SSH Key Generator produces a key pair for server access rather than for messages, and CSR Generator builds the certificate signing request a TLS certificate authority asks for.
For simply putting a file behind a password without any key management at all, Encrypt File uses a passphrase and symmetric encryption, and Encrypt Text does the same for a block of text. Those are the right choice when both ends share a secret and neither wants to exchange keys. Whichever you use, generate the passphrase itself with Password Generator rather than inventing one. The rest is on the dev tools hub.

