Settings

Settings other than “Default” will be saved in local storage to persist across pages, reloads, and sessions.

Practical Post-Quantum Cryptography

🅭🅯🄎
Abstract: This page collects asymmetric cryptographic schemes that have been approved by some major government or standardization body with the expectation that they can withstand quantum computers. In other words, the schemes listed here are post-quantum schemes that are potentially reasonable to be used in practice. The specific schemes described herein are KEMs, signatures, and stateful signatures.

Key Encapsulation Mechanisms (KEMs)

Key Encapsulation Mechanisms (“KEMs” for short) are used to encapsulate a shared secret that can be used to symmetrically encrypt and authenticate a message. In essence they are a more purpose-built alternative to asymmetric encryption schemes that does not allow the encapsulating party to chose the encrypted message. While this makes them a less powerful primitive, the vast majority of practical uses of asymmetric encryption only ever boilt down to that use-case in the first place, making this a largely theoretical limitation.

Formalisms

Formally speaking a KEM is a tuple consisting of three algorithms:

We say that a KEM offers δ-correctness, if the probability, that, upon honest execution of all algorithms, ss=ss’ is at least 1−δ.

We say that a KEM offers perfect correctness, if δ=0.

We say that a KEM offers Indistinguishability under Chosen Ciphertext Attacks (IND-CCA), if there is no Quantum Polynomial Time (QPT) adversary that can distinguish the shared secret ss encapsulated in a ciphertext ct* from a random value, even if she receives the public key pk, the challenge ciphertext ct*, and access to a decapsulation-oracle that can decapsulate all ciphertexts except for ct*.

Established Schemes

As of March 2025, there are four KEMs that can be considered established enough for practical use. All of them were originally designed for NIST’s post-quantum competition and subsequently either chosen for standardization by NIST or approved by various European Government bodys:

ML-KEM (Module Lattice - Key Encapsulation Mechanism)
NIST’s primary choice for KEMs. It is a slightly modified version of “Kyber”, a highly efficient KEM based on module-lattices. One of the remaining issues with this scheme is that there are effectively several formats for the secret key: As a very short seed (slightly slower but much more compact and arguably more secure), semi-expanded (slightly faster, significantly bigger), and both (worst of all worlds, standardized by IETF)
Frodo
Another lattice-based KEM. Unlike ML-KEM it uses unstructured lattices, which is generally assumed to be more conservative, though it bears stressing that this is merely an assumption and could also turn out to be wrong. The lack of structure gives Frodo significant overhead in size, when compared to ML-KEM.
Classic McEliece
The oldest code-based KEM. With the primary components having been designed in 1978 it is generally considered to be a very conservative choice that manage to stand up to many years of cryptanalysis. It offers a fairly unique performance profile, in that it has tiny ciphertexts, with very fast encapsulation and decapsulation, at the cost of slow key-generation and huge public keys. This makes it primarily interessting for use-cases that involve long-lived keys that are only very rarely transmitted, not so much as a general purpose KEM. but While various European government agencies approved it for use, NIST decided against standardizing it, citing a concurrent standardization-effort by ISO, recent results that, while not directly affecting the security of McEliece, could be taken as indicative that the security of the scheme is not quite as well understood as was once expected, and a lack of stated interest in a scheme with McElice’s performance profile.
HQC (Hamming Quasi-Cyclic)
Another code-based scheme that was chosen by NIST as fallback for ML-KEM. It is significantly outperformed by kyber in all size- and runtime-characteristics, and primarily intended as a backup, in case of breakthroughs regarding lattices.
BIKE (Bit-Flipping Key Encapsulation)
The final code-based finalist in NIST’s competition. It was not selected by NIST, who considered it less trustworthy than its primary competitor, but approved by ANSSI, though similarly with less confidence than HQC. It’s size-characteristics are worse than those of HQC, but it does offer better runtime-performance.

While other post-quantum KEMs have seen practical use, this was primarily (but not exclusively) in the context of experiments and using these schemes at this point could be considered as the equivalent to the use of non-winning AES-finalists: While there is nothing known to be inherently wrong with them, they are nowadays much more obscure schemes that are the subject to far less scrutiny by public research and should thus generally be avoided.

Table 1.1: Overview over established KEMs.
All measurements were performed on an Intel i5-1135G7 using OQS version 0.12.0. The results are rounded to two significant digits only meant to provide a very rough overview and some comparison between the listed schemes.
Name Status Type Variant λ δ Size [Bytes] Average Runtime [µs]
PK Ct SK SS Gen. Enc Dec
ML-KEM
“Kyber”
Standardized
(NIST)
Module Lattice
(M-LWE)
ML-KEM 512 11 21392^{−139} 800800 768768 1 6321632 3232 1515 1515 1414
ML-KEM 768 33 21642^{−164} 1 1841184 1 0881088 2 4002400 2323 2323 2222
ML-KEM 1024 55 21742^{−174} 1 5681568 1 5681568 3 1683168 3232 3333 3232
Frodo Approved
(BSI, ANSSI, NCSC)
Lattice
(LWE)
FrodoKEM-640-AES 11 2138.72^{−138.7} 9 6169616 9 7209720 19 88819888 1616 250250 340340 330330
FrodoKEM-640-SHAKE 1 8001800 1 9001900 1 9001900
FrodoKEM-976-AES 33 2199.62^{−199.6} 15 63215632 15 74415744 31 29631296 2424 490490 660660 660660
FrodoKEM-976-SHAKE 4 1004100 4 4004400 4 3004300
FrodoKEM-1344-AES 55 2252.52^{−252.5} 21 52021520 21 63221632 43 08843088 3232 980980 1 2001200 1 3001300
FrodoKEM-1344-SHAKE 7 7007700 7 8007800 7 8007800
Classic McEliece Approved
(BSI, NCSC)
Code
(Goppa-Codes)
mceliece­348864 11 00 261 120261120 9696 6 4926492 3232 30 00030000 2323 3434
mceliece­460896 33 524 160524160 156156 13 60813608 110 000110000 4545 6666
mceliece­6688128 55 1 044 9921044992 208208 13 93213932 160 000160000 9898 7575
mceliece­6960119 1 047 3191047319 194194 13 94813948 250 000250000 9696 7070
mceliece­8192128 1 357 8241357824 208208 14 12014120 180 000180000 130130 7474
HQC Chosen
(NIST)
Code hqc-128 11 <2128< 2^{-128} 2 2492249 4 4974497 5656 6464 1 5001500 3 0003000 4 9004900
hqc-192 33 <2192<2^{-192} 4 5224522 9 0429042 6464 4 6004600 9 2009200 14 00014000
hqc-256 55 <2256<2^{-256} 7 2457245 14 48514485 7272 8 6008600 17 00017000 26 00026000
BIKE Approved
(ANSSI)
Code BIKE-L1 11 21282^{−128} 12 32312323 12 57912579 2 5002500 3232 160160 3434 310310
BIKE-L3 33 21922^{−192} 24 65924659 24 91524915 3 6023602 470470 7171 960960
BIKE-L5 55 22562^{−256} 40 97340973 41 22941229 4 8964896 1 1001100 140140 2 5002500

Signatures

signature-schemes are primitives that can be used to authenticate a message. Unlike KEMs, they are a traditional primitive that continues to be used unchanged.

Formalisms

Formally speaking a signature scheme is a tuple consisting of three algorithms:

We say that a signature scheme is complete, if verify accepts every honestly generated signature for a given key-pair.

We say that a signature scheme offers Existential UnForgability under Chosen Message Attacks (EUF-CMA), if there is no Quantum Polynomial Time (QPT) adversary that can with non-negligible probability create a valid and fresh signature-message-pair for an honestly generated key-pair, even if she receives the public key pk and access to a signing-oracle.

Established Schemes

As of March 2025, there are three signature schemes that can be considered established enough for practical use. All of them were originally designed for NIST’s post-quantum competition and subsequently chosen for standardization by NIST:

ML-DSA (Module Lattice - Digital Signature Algorithm)
NIST’s primary choice for Signatures. It is a slightly modified version of “Dilithium” and based on module-lattices.
SLH-DSA (StateLess Hash - Digital Signature Algorithm
NIST’s much more conservative choice for signatures whose security only relies on the security of hash-functions. It is strongly based on “SPHINCS+”.
FN-DSA (FFT over NTRU-lattice - Digital Signature Algorithm.)
A more compact alternative to ML-DSA that NIST announced for standardization based on Falcon. Its big downside is that it relies on floating-point operations, which makes it notoriously hard to implement securly.
Table 2.1: Overview over established signature schemes.
All measurements are rounded to two significant digits and were performed on an Intel i5-1135G7 using OQS version 0.12.0 and only meant to provide a very rough overview.
Name Status Type Variant λ Size [Bytes] Average Runtime [µs]
PK σ SK Gen. Sign(“”) Vfy(“”)
ML-DSA
“Dilithium”
Standardized
(NIST)
Module Lattice
(M-LWE)
ML-DSA-44 22 1 3121312 2 4202420 2 5602560 4747 100100 4343
ML-DSA-65 33 1 9521952 3 3093309 4 0324032 8383 170170 7575
ML-DSA-87 55 2 5922592 4 6274627 4 8964896 140140 220220 120120
SLH-DSA
“SPHINCS+”
Standardized
(NIST)
Hash-based SLH-DSA-SHA2-128s 11 3232 7 8567856 6464 20 00020000 150 000150000 200200
SLH-DSA-SHAKE-128s 34 00034000 260 000260000 370370
SLH-DSA-SHA2-128f 17 08817088 320320 7 4007400 590590
SLH-DSA-SHAKE-128f 550550 13 00013000 930930
SLH-DSA-SHA2-192s 33 4848 16 22416224 9696 30 00030000 280 000280000 360360
SLH-DSA-SHAKE-192s 52 00052000 460 000460000 620620
SLH-DSA-SHA2-192f 35 66435664 470470 12 00012000 910910
SLH-DSA-SHAKE-192f 800800 21 00021000 1 3001300
SLH-DSA-SHA2-256s 55 6464 29 79229792 128128 20 00020000 250 000250000 490490
SLH-DSA-SHAKE-256s 45 00045000 510 000510000 880880
SLH-DSA-SHA2-256f 49 85649856 1 2001200 25 00025000 910910
SLH-DSA-SHAKE-256f 2 6002600 53 00053000 1 7001700
FN-DSA
“Falcon”
Chosen
(NIST)
Lattice Falcon-512 11 897897 666666 1 2811281 6 3006300 190190 4040
Falcon-1024 55 1 7931793 1 2801280 2 3052305 18 00018000 380380 7474

Stateful Signatures

Disclaimer: This Section is still Work in Progress!

Stateful signature-schemes are primitives that can be used to authenticate a message. Unlike regular signature schemes, they maintain a state that gets updated after every signing-operation. Old states must never be used to sign a new message, as doing so can severely damage the security of the entire scheme.

Formalisms

Formally speaking a stateful signature scheme is a tuple consisting of three algorithms:

We say that a signature scheme is complete, if verify accepts every honestly generated signature for a given key-pair.

Established Schemes

As of March 2025, there are two families of stateful signature schemes that can be considered established enough for practical use: XMMS (eXtended Merkle Signature Scheme) and LMS (Leighton-Micali Signatures).

Table 3.1: Overview over standardized stateful signature schemes.
Name Status Type Variant 𝑛 λ Size [Bytes] Average Runtime [µs]
PK σ SK Gen. Sign(“”) Vfy(“”)
XMSS
RFC 8391
Standardized
(IRTF)
Hash-based XMSS-SHA2_10_256
XMSS-SHAKE_10_256
2102^10 6767 2 5002500
XMSS-SHA2_10_256
XMSS-SHAKE_10_256
2162^16 6767 2 6922692
XMSS-SHA2_10_256
XMSS-SHAKE_10_256
2202^20 6767 2 8202820
XMSS-SHA2_10_512
XMSS-SHAKE_10_512
2102^10 131131 9 0929092
XMSS-SHA2_10_512
XMSS-SHAKE_10_512
2162^16 131131 9 4769476
XMSS-SHA2_10_512
XMSS-SHAKE_10_512
2202^20 131131 9 7329732
XMSS-MT
RFC 8391
Standardized
(IRTF)
Hash-based XMSSMT-SHA2_20/2_256
XMSSMT-SHAKE_20/2_256
2202^20 6767 4 9634963
XMSSMT-SHA2_20/4_256
XMSSMT-SHAKE_20/4_256
2202^20 6767 9 2519251
XMSSMT-SHA2_40/2_256
XMSSMT-SHAKE_40/2_256
2402^40 6767 5 6055605
XMSSMT-SHA2_40/4_256
XMSSMT-SHAKE_40/4_256
2402^40 6767 9 8939893
XMSSMT-SHA2_40/8_256
XMSSMT-SHAKE_40/8_256
2402^40 6767 18 46918469
XMSSMT-SHA2_60/3_256
XMSSMT-SHAKE_60/3_256
2602^60 6767 8 3928392
XMSSMT-SHA2_60/6_256
XMSSMT-SHAKE_60/6_256
2602^60 6767 14 82414824
XMSSMT-SHA2_60/12_256
XMSSMT-SHAKE_60/12_256
2602^60 6767 27 68827688
XMSSMT-SHA2_20/2_512
XMSSMT-SHAKE_20/2_512
2202^20 131131 18 11518115
XMSSMT-SHA2_20/4_512
XMSSMT-SHAKE_20/4_512
2202^20 131131 34 88334883
XMSSMT-SHA2_40/2_512
XMSSMT-SHAKE_40/2_512
2402^40 131131 19 39719397
XMSSMT-SHA2_40/4_512
XMSSMT-SHAKE_40/4_512
2402^40 131131 36 16536165
XMSSMT-SHA2_40/8_512
XMSSMT-SHAKE_40/8_512
2402^40 131131 69 70169701
XMSSMT-SHA2_60/3_512
XMSSMT-SHAKE_60/3_512
2602^60 131131 29 06429064
XMSSMT-SHA2_60/6_512
XMSSMT-SHAKE_60/6_512
2602^60 131131 54 21654216
XMSSMT-SHA2_60/12_512
XMSSMT-SHAKE_60/12_512
2602^60 131131 104 520104520
LMS
RFC 8554
Standardized
(IRTF)
Hash-based LMS_SHA256_M32_H5
LMS_SHA256_M32_H10
LMS_SHA256_M32_H15
LMS_SHA256_M32_H20
LMS_SHA256_M32_H25
WOTS+
RFC 8391
Standardized
(IRTF)
Hash-based WOTSP-SHA2_256
WOTSP-SHAKE_256
11 6767 2 1442144
WOTSP-SHA2_512
WOTSP-SHAKE_512
11 131131 8 3848384
LMOTS
RFC 8554
Standardized
(IRTF)
Hash-based LMOTS_SHA256_N32_W1 11 8 5168516
LMOTS_SHA256_N32_W2 11 4 2924292
LMOTS_SHA256_N32_W4 11 2 1802180
LMOTS_SHA256_N32_W8 11 1 1241124