⚛ Quantum & Post-Quantum

ML-KEM (Kyber): Post-Quantum Key Encapsulation Explained

ML-KEM, standardized in FIPS 203 and derived from CRYSTALS-Kyber, is the primary NIST-selected post-quantum key encapsulation mechanism. It lets two parties establish a shared secret over an insecure channel without relying on the factoring or discrete-logarithm problems that Shor's algorithm breaks. Because key establishment underlies TLS, VPNs, and secure messaging, ML-KEM is one of the most consequential building blocks for protecting communications against quantum adversaries. This article explains what a KEM does and walks through how ML-KEM works.

What a Key Encapsulation Mechanism Does

A key encapsulation mechanism (KEM) is a standardized way to agree on a symmetric key using public-key cryptography. Unlike classical Diffie-Hellman, where both sides contribute to a shared value, a KEM has an asymmetric shape built from three algorithms:

  • KeyGen produces a public key and a secret key.
  • Encapsulate takes a public key and outputs a ciphertext plus a shared secret.
  • Decapsulate takes the ciphertext and secret key and recovers the same shared secret.
# KEM key establishment
(pk, sk)      = ML-KEM.KeyGen()
(ct, ss_send) = ML-KEM.Encapsulate(pk)     # sender keeps ss_send, sends ct
ss_recv       = ML-KEM.Decapsulate(ct, sk) # receiver recovers ss_recv
# ss_send == ss_recv, then feed it to a KDF for symmetric keys

The resulting shared secret feeds a key derivation function to produce symmetric keys for a cipher such as AES-256. This split design lets the sender contribute fresh randomness and bind it to the recipient's public key, and it provides indistinguishability under chosen-ciphertext attack (IND-CCA2), the strong security notion expected of a modern KEM.

The Module-LWE Foundation

ML-KEM's security rests on Module-LWE, a structured variant of Learning With Errors. Working over a polynomial ring lets the scheme represent keys compactly and compute fast using the Number Theoretic Transform, while the module structure allows the same core code to target different security levels by adjusting a small dimension parameter.

How ML-KEM Works

Internally, ML-KEM is built from a chosen-plaintext-secure public-key encryption scheme (K-PKE) that is hardened into a chosen-ciphertext-secure KEM.

Key Generation

Key generation samples a public matrix A of ring elements, a small secret vector s, and a small error vector e, then computes t = A·s + e. The public key is (A, t), usually with A compressed to a seed, and the secret key is s along with data needed for the security transform.

Encapsulation

To encapsulate, the sender hashes a random message to derive coins, encrypts that message under the public key to form ciphertext ct, and derives the shared secret from the message and ciphertext. The encryption adds fresh small noise, so the ciphertext is an LWE-style function of the random message that only the holder of s can invert.

Decapsulation

The receiver decrypts ct with the secret key to recover the message, then re-derives the shared secret. Correctness relies on the noise staying small enough to round away; the parameters are chosen so decapsulation failures are astronomically rare.

The Fujisaki-Okamoto Transform

A raw lattice encryption scheme is only secure against passive attackers. ML-KEM applies a variant of the Fujisaki-Okamoto transform to reach chosen-ciphertext security. During decapsulation the receiver re-encrypts the recovered message and checks that it reproduces the received ciphertext. If it does not, the scheme returns a deterministic pseudorandom value derived from a secret, rather than an error. This implicit rejection prevents an attacker from learning anything by submitting malformed ciphertexts.

Parameter Sets

ML-KEM defines three parameter sets that scale the module dimension:

  • ML-KEM-512 targets the lowest standardized security category.
  • ML-KEM-768 targets a middle category and is a common default for general use.
  • ML-KEM-1024 targets the highest category for the most sensitive data.

Larger sets increase key and ciphertext sizes and computation, though all remain efficient enough for interactive protocols. Public keys and ciphertexts are on the order of a kilobyte, larger than classical elliptic-curve values but small enough to carry inside protocols such as TLS.

Security and Implementation Considerations

  • Constant-time code. Implementations must avoid secret-dependent branches and memory accesses, since timing side channels can leak the secret.
  • Strong randomness. Encapsulation depends on high-quality entropy; weak randomness undermines the shared secret.
  • Hybrid deployment. Many rollouts combine ML-KEM with a classical exchange like X25519 so security holds if either component survives, a cautious posture during the post-quantum migration.
  • Domain separation. The hashing steps bind the shared secret to the ciphertext and public key, which must not be altered when integrating the KEM into a protocol.

Key Takeaways

  • ML-KEM (FIPS 203), derived from Kyber, is the standardized post-quantum key encapsulation mechanism.
  • A KEM uses KeyGen, Encapsulate, and Decapsulate to agree on a shared secret without factoring or discrete logs.
  • Its security comes from Module-LWE, giving compact keys and fast polynomial arithmetic.
  • The Fujisaki-Okamoto transform with implicit rejection provides chosen-ciphertext security against malformed ciphertexts.
  • Correct use requires constant-time implementations, strong randomness, and often hybrid deployment alongside a classical algorithm.
ml-kemkyberkey-encapsulationmodule-lwepost-quantum

Frequently asked questions

What is ML-KEM?

ML-KEM, standardized in FIPS 203 and derived from CRYSTALS-Kyber, is the primary NIST-selected post-quantum key encapsulation mechanism. It lets two parties establish a shared secret over an insecure channel without relying on the factoring or discrete-logarithm problems that Shor's algorithm breaks. Because key establishment underlies TLS, VPNs, and secure messaging, ML-KEM is one of the most consequential building blocks for protecting communications against quantum adversaries.

What is a key encapsulation mechanism?

A key encapsulation mechanism, or KEM, is a standardized way to agree on a symmetric key using public-key cryptography. It consists of three algorithms: KeyGen produces a public and secret key, Encapsulate takes the public key and outputs a ciphertext plus a shared secret, and Decapsulate uses the ciphertext and secret key to recover the same shared secret. The shared secret then feeds a key derivation function to produce symmetric keys.

Is ML-KEM the same as Kyber?

ML-KEM is the NIST standard derived from CRYSTALS-Kyber, so they are closely related but not identical. Kyber was the algorithm submitted to and selected in the NIST post-quantum competition, while ML-KEM is the finalized, standardized version published as FIPS 203 with some refinements. In practice ML-KEM is the name to use for the official standard.

What are the ML-KEM parameter sets?

ML-KEM defines three parameter sets that scale the module dimension: ML-KEM-512 targets the lowest standardized security category, ML-KEM-768 targets a middle category and is a common default, and ML-KEM-1024 targets the highest category for the most sensitive data. Larger sets increase key and ciphertext sizes and computation. Public keys and ciphertexts are on the order of a kilobyte, larger than classical elliptic-curve values but small enough to carry inside protocols like TLS.

How does ML-KEM achieve security against chosen-ciphertext attacks?

ML-KEM is built from a chosen-plaintext-secure encryption scheme that is hardened using a variant of the Fujisaki-Okamoto transform. During decapsulation the receiver re-encrypts the recovered message and checks that it reproduces the received ciphertext. If it does not match, the scheme returns a deterministic pseudorandom value rather than an error, a technique called implicit rejection that prevents an attacker from learning anything by submitting malformed ciphertexts.

What implementation risks does ML-KEM have?

ML-KEM implementations must be constant-time, avoiding secret-dependent branches and memory accesses, because timing side channels can leak the secret key. They also depend on high-quality randomness during encapsulation, since weak entropy undermines the shared secret. Many deployments pair ML-KEM with a classical exchange like X25519 in a hybrid arrangement so security holds if either component survives.

Try it hands-on

K0G is an open toolkit of browser-based security utilities — hashing, encoding, JWT, certificates, crypto and more, all running locally in your browser.

Explore the tools →