ToolAdda

🔐 Developer Tools · SSH / DevOps

PPK to PEM Converter

Convert PuTTY .ppk private keys (v2 & v3, RSA/ECDSA/Ed25519, encrypted or not) into OpenSSH PEM format — with fingerprints, integrity checks, and optional passphrase protection. Runs 100% in your browser; your key never touches a server.

Your private key is parsed and converted entirely on your device — nothing is uploaded, logged, or stored on any server.

🔒 100% browser-based 🚫 Zero uploads 🧾 No logging 🆓 Free forever 🏢 Enterprise ready
1 Upload 2 Validate 3 Options 4 Convert 5 Download
Upload your key, then convert

Drop your .ppk file here

or choose an option below — nothing is uploaded, ever

Tip: you can also paste a copied .ppk file, or paste its text below

Or paste the .ppk file contents as text
Conversion options

OpenSSH-format output is always unencrypted in this tool. To passphrase-protect it, use PEM output with encryption enabled, or re-encrypt with ssh-keygen -p.

Parsing, decryption (AES-256-CBC / Argon2id), and re-encoding all run locally in your browser via node-forge and (only when needed) a lazy-loaded Argon2 WebAssembly module — your key is never uploaded.

PrivateNo server upload
VerifiedBest-effort integrity check
CompleteRSA / ECDSA / Ed25519
FreeNo watermark ever
PPK → PEM

SSH workflow

How This Tool Processes Your Key

A private key never has to touch a network to change formats. Here's exactly what happens, in order, entirely inside your browser tab.

UploadFile read locally via the File API
ParsePPK header, blobs, and MAC read
DecryptAES-256-CBC or Argon2id, if encrypted
Re-encodeDER/PEM or OpenSSH format built
DownloadBlob URL, never a network request

Why ToolAdda

Why Use This Free PPK to PEM Converter

Zero uploads

Your key is parsed, decrypted, and re-encoded entirely in JavaScript on your device.

3 algorithms

RSA, ECDSA (nistp256/384/521), and Ed25519 — not just RSA like most converters.

v2 & v3 support

Both PuTTY PPK format versions, including Argon2-encrypted v3 keys.

Integrity checking

PPK v2 MAC verification flags corrupted files or wrong passphrases honestly.

Real fingerprints

SHA256 and MD5 fingerprints computed the same way ssh-keygen -lf does.

Two output formats

Traditional PEM and modern OpenSSH format, generated side by side.

Session history

Reopen recent conversions instantly — kept in memory only, never persisted.

No signup, no watermark

No account, no email capture, and output files are never watermarked.

Use cases

Where a PEM Key Is Needed

AWS EC2
Google Cloud
Azure
DigitalOcean
GitHub SSH
GitLab SSH
Linux servers
CI/CD pipelines
Terraform
Ansible
Docker
Kubernetes

Comparison

ToolAdda vs. PuTTYgen & Typical Online Converters

We can't verify every claim other tools make, so this compares our approach against PuTTYgen's desktop workflow and the general pattern of most online PPK converters.

FeatureToolAddaPuTTYgenTypical online converters
Install requiredNone — runs in browserDesktop download (Windows)None
Key ever leaves your deviceNeverNeverOften uploaded to a server
PPK v3 (Argon2) supportYes, incl. encryptedYes (it's the reference tool)Rarely supported
ECDSA / Ed25519 supportYesYesOften RSA-only
SHA256 + MD5 fingerprints shownBoth, automaticallyManual, one at a timeRarely shown
Integrity (MAC) checkShown for PPK v2Internal, not surfacedNot offered
Works cross-platformAny modern browserWindows-first (Linux/macOS builds exist but less common)Usually yes
CostFreeFreeOften freemium

Complete technical guide

PPK vs PEM: SSH Private Key Formats Explained

What Is a PPK File?

A .ppk file is PuTTY's own private key container, introduced alongside the PuTTY SSH client for Windows. It's a plain-text format: a header line naming the key algorithm and format version, an Encryption: field, a free-text Comment:, the public key as base64 (Public-Lines), the private key material as base64 (Private-Lines, encrypted if a passphrase was set), and — for format v2 — a Private-MAC line that lets PuTTY detect a corrupted file or wrong passphrase before it ever tries to use the key. Format v3 (introduced in 2017 after weaknesses were found in v2's SHA-1-based key derivation) replaces that scheme with the memory-hard Argon2 password-hashing function for anything encrypted.

What Is a PEM File?

PEM (Privacy-Enhanced Mail) is a much older, general-purpose container format — originally designed for email encryption in the late 1980s, but now the near-universal way to store X.509 certificates and private keys as base64 text wrapped in -----BEGIN ... ----- / -----END ... ----- lines. An RSA private key in PEM form is typically PKCS#1 (-----BEGIN RSA PRIVATE KEY-----); other algorithms and passphrase-encrypted keys generally use the more generic PKCS#8 container (-----BEGIN PRIVATE KEY----- or -----BEGIN ENCRYPTED PRIVATE KEY-----). This is the format OpenSSH, cloud providers, and essentially all Linux/macOS SSH tooling expect.

PPK vs PEM: The Real Difference

Neither format is more "secure" than the other in principle — they're both just containers around the same underlying RSA, ECDSA, or Ed25519 key material, using well-understood encryption schemes when a passphrase is set. The practical difference is ecosystem: PPK is essentially PuTTY-only, while PEM (and the closely related modern OpenSSH format) is what everything else — ssh, scp, git, cloud consoles, infrastructure-as-code tools — expects. Converting a key doesn't change what it can do; it only changes which tools can read the file directly.

PuTTY vs OpenSSH: Two Ecosystems, One Underlying Protocol

Both implement the same SSH protocol (RFC 4251-4254 and successors), so a key generated in one is cryptographically usable by the other — only the private key file's container differs. PuTTY ships as a Windows-native GUI toolkit (PuTTY, PuTTYgen, Pageant, WinSCP, FileZilla) that predates OpenSSH's widespread availability on Windows. OpenSSH is the reference implementation bundled with virtually every Linux distribution, macOS, and — since Windows 10 1809 — Windows itself. Many teams end up needing both: PuTTY/WinSCP for a Windows workstation, and PEM/OpenSSH format for servers, CI pipelines, and cloud provisioning.

How SSH Keys Work

SSH key authentication uses asymmetric (public-key) cryptography: a mathematically linked key pair where the public key can be shared freely (placed in a server's ~/.ssh/authorized_keys, or uploaded to GitHub/GitLab/a cloud console) while the private key never leaves your machine. During authentication, the server issues a challenge that only someone holding the matching private key can correctly sign; the server verifies that signature against the public key it already has on file. No secret ever crosses the network — which is exactly why protecting the private key file itself (via file permissions, and ideally a passphrase) matters so much.

Public Key vs Private Key

The private key is the secret half — it's what proves your identity and must never be shared, uploaded, or committed to a repository. The public key is derived from the private key (for RSA and EC, via the underlying math; for Ed25519, directly as part of key generation) and is safe to distribute widely — that's literally its purpose. This tool always keeps decrypted private key material in memory only for as long as the conversion takes, and never transmits it.

RSA

RSA is the oldest and most widely compatible SSH key algorithm, based on the difficulty of factoring the product of two large primes. A modern RSA key should be at least 2048 bits (3072+ increasingly recommended for long-lived keys); it's supported by essentially every SSH client and server ever built, which is why it remains the default choice for maximum compatibility with older infrastructure.

ECDSA

ECDSA (Elliptic Curve Digital Signature Algorithm) uses elliptic-curve cryptography to achieve equivalent security to RSA with much smaller keys and faster operations — a 256-bit ECDSA key (nistp256) is roughly as strong as a 3072-bit RSA key. SSH supports the NIST curves P-256, P-384, and P-521 (named nistp256/384/521 in key files). All three are supported by this converter.

Ed25519

Ed25519 is a modern EdDSA signature scheme over Curve25519, designed specifically to avoid several classes of implementation pitfalls that affected earlier ECDSA deployments (weak randomness in signing, in particular). It produces small, fast keys and is now the recommended default for new SSH keys wherever compatibility allows. Because Ed25519 has no legacy PKCS#1-style PEM form, this tool always outputs it as PKCS#8 (-----BEGIN PRIVATE KEY-----) or OpenSSH format.

Why Convert PPK to PEM?

The single most common trigger is moving between operating systems or tools: a key generated years ago in PuTTYgen on a Windows machine now needs to authenticate from a Linux CI runner, a macOS terminal, or a cloud provider's console that only accepts PEM. Rather than regenerating a new key pair (which means updating every server's authorized_keys, every Git host, every CI secret), converting the existing key preserves its identity — its fingerprint stays the same — while making it usable everywhere PEM is expected.

AWS EC2

EC2 instance SSH access is authenticated with a PEM key pair (traditionally PKCS#1 for RSA) supplied at launch or imported into the console. If your existing key lives only as a .ppk file, convert it to PEM here, keep the .pem extension, and set restrictive file permissions (chmod 400 on Linux/macOS) before use with ssh -i key.pem.

Google Cloud & Azure

Both GCP's gcloud compute ssh / metadata-based SSH keys and Azure's VM SSH key resources expect standard OpenSSH public/private key pairs — PEM or OpenSSH-format private keys work directly with their CLI tooling and consoles, sidestepping any PuTTY-specific setup.

DigitalOcean

DigitalOcean droplets are provisioned with a public key uploaded to your account and use the corresponding PEM/OpenSSH private key locally for ssh root@your-droplet-ip -i key.pem — the same conversion applies if your only copy is a PuTTY .ppk file.

GitHub SSH & GitLab SSH

Both platforms authenticate Git operations over SSH using your public key, added once under account settings; your local Git client then uses the matching private key (PEM or OpenSSH format) automatically via your SSH agent or ~/.ssh/config. PuTTY users on Windows historically used Pageant instead — converting to PEM/OpenSSH format lets the same key work with Git for Windows' built-in OpenSSH client too.

Linux Servers

Any Linux server's sshd authenticates against public keys listed in each user's ~/.ssh/authorized_keys; the corresponding private key, wherever you connect from, needs to be in PEM or OpenSSH format for the standard ssh/scp/rsync command-line tools (PuTTY's own .ppk format is only understood by the PuTTY family of clients).

CI/CD Pipelines

Build systems like GitHub Actions, GitLab CI, Jenkins, and CircleCI universally expect an SSH private key secret in PEM or OpenSSH format to be injected into the job environment (e.g. via ssh-agent or a mounted file) for deploying to servers or pulling private dependencies — a .ppk file is not directly usable in these pipelines without conversion first.

Terraform

Terraform's connection blocks (for provisioners) and many providers' resource arguments expect a private_key value that's a standard PEM or OpenSSH-format string — exactly what this tool's PEM/OpenSSH output can be pasted directly into or loaded from a file via file("~/.ssh/key.pem").

Ansible

Ansible's ansible_ssh_private_key_file inventory variable (or the --private-key CLI flag) points at a PEM/OpenSSH-format file used to authenticate to managed hosts — a PuTTY .ppk file must be converted first, since Ansible relies on the system's OpenSSH client under the hood.

Docker

Dockerfiles and container build contexts that need SSH access (for private Git dependencies via BuildKit's --ssh flag, or SSH-based deployment scripts) expect a standard PEM/OpenSSH private key mounted or forwarded into the build — never a .ppk file, since the SSH client inside the container is OpenSSH.

Kubernetes

SSH private keys used by Kubernetes (as Secrets for Git-sync sidecars, SSH-based deploy jobs, or bastion-host access) are stored and mounted as plain PEM/OpenSSH text — the same format this tool produces, ready to kubectl create secret generic ssh-key --from-file=id_rsa=./key.pem.

Jenkins

Jenkins' SSH Credentials plugin stores a private key directly (pasted or uploaded) in PEM format for use by SSH-based build steps, Publish-over-SSH, or the SSH Agent plugin — a .ppk file needs converting first, since Jenkins runs on the JVM's own SSH implementations, not PuTTY.

Common Errors

  • "Invalid format" when uploading a key to a cloud console — almost always means you uploaded a .ppk file where a PEM/OpenSSH key was expected; convert it here first.
  • "Load key: invalid format" in OpenSSH — the classic symptom of pointing ssh -i at a raw PPK file, since OpenSSH's client has never understood PuTTY's native format.
  • Passphrase prompt loops or silently fails — usually a typo'd passphrase; this tool's structural validation after decryption catches this and reports it clearly instead of producing a corrupted key.
  • Fingerprint doesn't match what you expected — check whether you're comparing an MD5 fingerprint against a SHA256 one, or a public-key fingerprint against a private-key one; this tool always shows both.
  • "UNPROTECTED PRIVATE KEY FILE" warning from OpenSSH — appears when the downloaded key's file permissions are too open (e.g. group/world-readable); run chmod 600 (or 400) on Linux/macOS after downloading.

Security Best Practices

  1. Always set a strong passphrase on a private key that will live on disk for any length of time — an unencrypted private key is a single point of compromise if the file is ever exposed.
  2. Set restrictive file permissions immediately after downloading a converted key (chmod 600 or 400 on Linux/macOS); Windows users should restrict NTFS permissions to their own account.
  3. Never commit a private key (PPK or PEM) to a Git repository, even a private one — use a secrets manager or CI-native secret storage instead.
  4. Prefer Ed25519 for new keys where compatibility allows, and RSA 3072+/ECDSA nistp256+ otherwise; avoid RSA keys smaller than 2048 bits.
  5. Rotate keys periodically and immediately after any suspected exposure, and remove unused public keys from authorized_keys and cloud consoles promptly.

Passphrase Protection

A passphrase encrypts the private key material at rest — even if the file is copied or stolen, it's useless without the passphrase (subject to how strong that passphrase is). This tool fully supports decrypting passphrase-protected PPK v2 (AES-256-CBC) and v3 (Argon2id/i/d) keys, and can add a fresh passphrase to your PEM output using standard PKCS#8 encryption (AES-256, PBKDF2-SHA256) — openable by OpenSSL and any standards-compliant SSH tooling.

Fingerprint Verification

Before trusting a converted key, compare its fingerprint against a fingerprint you already trust (from your original PuTTYgen session, a server's known fingerprint, or your cloud provider's console) — a mismatch means something changed, and you should investigate before proceeding. This tool computes both the SHA256 fingerprint (the modern default, shown as SHA256:base64…) and the legacy MD5 fingerprint (colon-separated hex) directly from the public key blob, matching what ssh-keygen -lf would report.

Developer Tips

  • Keep both the PEM and OpenSSH outputs from a single conversion — some older tools still prefer the traditional PKCS#1 RSA PEM, while modern OpenSSH generates (and prefers) its own format by default.
  • When scripting key rotation across a large fleet, verify the fingerprint programmatically after each conversion rather than eyeballing it — a single transposed character is easy to miss visually.
  • For CI secrets, store the PEM output as a single-line base64 or a properly-escaped multi-line secret depending on your CI platform's requirements — most support multi-line secrets natively now.
  • If a PPK v3 encrypted key takes several seconds to unlock, that's Argon2 working as designed — don't mistake it for the page hanging.

Security

Security & Privacy Architecture

A private key is one of the most sensitive files a developer handles. This tool is built to earn that trust.

  • 100% browser processing: Parsing, decryption, and re-encoding run entirely in your browser's JavaScript engine (plus WebAssembly for Argon2 when needed).
  • No uploads, ever: Your file never leaves your device via any network request — there's no server endpoint that even accepts key data.
  • No server storage, no logging: There is nothing to store or log, because the key material never reaches a server in the first place.
  • No registration: No account, email, or personal details are required to use this tool.
  • Unlimited usage: No rate limits or paywalled features gate core conversion.
  • SSL secure delivery: The page itself is served over HTTPS.
  • Session-only history: Conversion history lives in a JavaScript variable and disappears on refresh — never localStorage, cookies, or disk.
  • Enterprise ready: Safe to use behind a corporate proxy or on an air-gapped-adjacent workstation, since no key data is transmitted regardless of network monitoring.

FAQ

Frequently Asked Questions

What is a PPK file?

A .ppk file is PuTTY's own private key format, used by PuTTY, WinSCP, FileZilla, and other Windows SSH tools. It stores the key's algorithm, an optional encrypted private section, a comment, and an integrity MAC in a simple text format.

What is a PEM file?

PEM (Privacy-Enhanced Mail) is a base64 text container format used across almost every non-Windows SSH client and cloud provider. An SSH private key in PEM form is Base64-encoded DER wrapped in "-----BEGIN ... PRIVATE KEY-----" lines — the format ssh-keygen, OpenSSH, AWS EC2, and most Linux tooling expect.

What's the difference between PPK and PEM?

They store the same underlying key material in different containers. PPK is PuTTY-specific (Windows-focused); PEM is the cross-platform standard used by OpenSSH, cloud providers, and nearly all Linux/macOS tooling. Converting between them changes only the container, never the actual cryptographic key.

Is my private key uploaded anywhere?

No. Every parsing, decryption, and re-encoding step runs locally in your browser. Your key is never sent to ToolAdda's servers or any third party.

Is this PPK to PEM converter free?

Yes — completely free, with no watermark, no signup, and no limit on conversions.

What PPK versions are supported?

Both PPK format v2 and v3 are supported, including encrypted keys of both versions — v2 uses AES-256-CBC with a SHA-1-derived key, and v3 uses Argon2id/Argon2i/Argon2d, both handled entirely client-side.

Does this tool support ECDSA and Ed25519 keys, or just RSA?

All three: RSA, ECDSA (nistp256, nistp384, nistp521), and Ed25519. Each is re-encoded into its correct native PEM form — PKCS#1 for RSA, SEC1 for ECDSA, and PKCS#8 for Ed25519.

My PPK file is passphrase-protected — can I still convert it?

Yes. Enter the passphrase in the Unlock step; it's used only in-memory to decrypt the key locally and is never transmitted or stored.

What happens to the passphrase when I convert?

It's held in a JavaScript variable for the duration of the decryption and eligible for garbage collection immediately afterward — never written to disk, localStorage, or any network request.

Can I add a new passphrase to the PEM output?

Yes. Enable "Encrypt output with a passphrase" and enter a new one — the PEM output is encrypted as a standard PKCS#8 EncryptedPrivateKeyInfo (AES-256, PBKDF2/SHA-256). OpenSSH-format output is always exported unencrypted in this tool.

What's the difference between PEM and OpenSSH output format?

PEM (PKCS#1/SEC1/PKCS#8) is the older, universally-compatible container. OpenSSH format ("-----BEGIN OPENSSH PRIVATE KEY-----") is the modern container OpenSSH generates by default today, with cleaner Ed25519 support. Both are provided; use whichever your target tool expects.

Which output format should I use for AWS EC2?

AWS EC2 SSH access expects a traditional PEM file (PKCS#1 for RSA) — use the PEM output and save it with a .pem extension.

Which output format should I use for GitHub/GitLab SSH?

Either works — GitHub and GitLab authenticate using your public key regardless of which private key container you keep locally. Modern OpenSSH clients handle both transparently.

Can I use the converted PEM with Terraform or Ansible?

Yes. Terraform's connection blocks and Ansible's ansible_ssh_private_key_file both expect a standard PEM (or OpenSSH-format) private key file — exactly what this tool produces.

Does this tool verify the integrity of my PPK file?

For PPK v2 files, yes — the file's Private-MAC is recomputed and checked, showing a verified/mismatch badge. For PPK v3, integrity verification isn't implemented (the key material still converts correctly; only the extra MAC badge is unavailable), shown honestly rather than faked.

What is an SSH key fingerprint?

A fingerprint is a short hash of a public key, used to visually verify you're connecting to the right key without comparing the entire (much longer) key blob. This tool computes both the SHA256 and legacy MD5 fingerprint formats.

What's the difference between the MD5 and SHA256 fingerprint?

They're two different hash algorithms applied to the same public key blob. SHA256 (shown as "SHA256:base64…") is the modern default since OpenSSH 6.8; MD5 (colon-separated hex) is the legacy format some older tools and cloud console screens still show.

Why does my fingerprint not match what my cloud provider shows?

Double-check whether your provider displays an MD5 or SHA256 fingerprint (this tool shows both), and whether it's fingerprinting the public or private key file.

Does this tool support PPK v3's Argon2 encryption?

Yes. The Argon2id/Argon2i/Argon2d WebAssembly module is loaded only when you open an encrypted PPK v3 file, keeping the page lightweight for the common case while still fully supporting v3.

Is Argon2 decryption slow?

It can take a few seconds, and that's intentional — Argon2 is deliberately memory- and time-hard to resist brute-force passphrase guessing, using the exact parameters stored in your PPK v3 file.

What happens if I enter the wrong passphrase?

The tool detects the resulting garbage data structurally (invalid field lengths) and shows a clear "could not unlock" error rather than producing a corrupted or nonsensical key file.

Does converting a key change its fingerprint?

No. The fingerprint is derived purely from the public key material, which is identical before and after conversion — only the private key's container format changes.

Can I convert multiple keys in one session?

Yes. Convert a key, then use "Convert another" to load a new file — each conversion is added to your session history.

What is a session conversion history, and is it saved anywhere?

It's a simple in-memory list of this session's conversions (filename, algorithm, fingerprint) so you can quickly reopen a recent result. It's never written to localStorage, cookies, or disk, and disappears when you close or refresh the tab.

Does this tool work offline?

Core RSA/ECDSA conversion works offline once the page and its cryptography library are loaded. PPK v3 encrypted-key support loads a small Argon2 module on first use, which requires a connection at that moment.

Can I use this on my phone?

Yes. The interface is fully responsive and touch-friendly, including file upload from your device's file picker.

Is this tool open source?

The page uses the open-source node-forge and hash-wasm libraries for cryptographic primitives; the PPK parsing and key re-encoding logic is original code written for ToolAdda.

How is this different from PuTTYgen?

PuTTYgen is a desktop application you must download and install on Windows. This tool does the same PPK↔PEM conversion instantly in any modern browser, on any OS, with no install — plus fingerprints, integrity checking, and a conversion history.

How is this different from other online PPK to PEM converters?

Most online converters either upload your key to a server (a serious concern for a private key) or only support unencrypted RSA. This tool processes everything client-side and supports encrypted PPK v2 and v3, plus ECDSA and Ed25519.

Can I convert PEM back to PPK?

Yes — use ToolAdda's dedicated PEM to PPK Converter for the reverse direction.

Explore more

Ready to Convert Your SSH Key?

Upload, unlock if needed, and get a clean PEM or OpenSSH key in seconds — free, private, and built for real DevOps workflows.

🔁 Convert PPK to PEM Now