Settings
Settings other than “Default” will be saved in local storage to persist across pages, reloads, and sessions.
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.
Formally speaking a KEM is a tuple consisting of three algorithms:
generate: Generates a public key pk and a secret key sk.
encapsulate: Takes a public key pk and produces a ciphertext ct and a shared secret ss.
decapsulate: Takes a ciphertext ct and a secret key sk and produces a shared secret ss’.
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
|
|
|
|
|
|
|
|
|
|
|
ML-KEM 768
|
|
|
|
|
|
|
|
|
|
ML-KEM 1024
|
|
|
|
|
|
|
|
|
|
Frodo
|
Approved
(BSI,
ANSSI,
NCSC)
|
Lattice (LWE)
|
FrodoKEM-640-AES
|
|
|
|
|
|
|
|
|
|
|
FrodoKEM-640-SHAKE
|
|
|
|
|
FrodoKEM-976-AES
|
|
|
|
|
|
|
|
|
|
|
FrodoKEM-976-SHAKE
|
|
|
|
|
FrodoKEM-1344-AES
|
|
|
|
|
|
|
|
|
|
|
FrodoKEM-1344-SHAKE
|
|
|
|
|
Classic McEliece
|
Approved
(BSI,
NCSC)
|
Code (Goppa-Codes)
|
mceliece348864
|
|
|
|
|
|
|
|
|
|
|
mceliece460896
|
|
|
|
|
|
|
|
|
mceliece6688128
|
|
|
|
|
|
|
|
|
mceliece6960119
|
|
|
|
|
|
|
|
mceliece8192128
|
|
|
|
|
|
|
|
HQC
|
Chosen
(NIST)
|
Code
|
hqc-128
|
|
|
|
|
|
|
|
|
|
|
hqc-192
|
|
|
|
|
|
|
|
|
|
hqc-256
|
|
|
|
|
|
|
|
|
|
BIKE
|
Approved
(ANSSI)
|
Code
|
BIKE-L1
|
|
|
|
|
|
|
|
|
|
|
BIKE-L3
|
|
|
|
|
|
|
|
|
|
BIKE-L5
|
|
|
|
|
|
|
|
|
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.
Formally speaking a signature scheme is a tuple consisting of three algorithms:
generate: Generates a public key pk and a secret key sk.
sign: Takes a secret key sk and a message m and produces a signature σ.
verify: Receives a public key pk, a message m, and a signature σ and returns a boolean value indicating whether σ is valid.
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
|
|
|
|
|
|
|
|
|
ML-DSA-65
|
|
|
|
|
|
|
|
|
ML-DSA-87
|
|
|
|
|
|
|
|
SLH-DSA “SPHINCS+”
|
Standardized
(NIST)
|
Hash-based
|
SLH-DSA-SHA2-128s
|
|
|
|
|
|
|
|
|
SLH-DSA-SHAKE-128s
|
|
|
|
|
SLH-DSA-SHA2-128f
|
|
|
|
|
|
SLH-DSA-SHAKE-128f
|
|
|
|
|
SLH-DSA-SHA2-192s
|
|
|
|
|
|
|
|
|
SLH-DSA-SHAKE-192s
|
|
|
|
|
SLH-DSA-SHA2-192f
|
|
|
|
|
|
SLH-DSA-SHAKE-192f
|
|
|
|
|
SLH-DSA-SHA2-256s
|
|
|
|
|
|
|
|
|
SLH-DSA-SHAKE-256s
|
|
|
|
|
SLH-DSA-SHA2-256f
|
|
|
|
|
|
SLH-DSA-SHAKE-256f
|
|
|
|
FN-DSA “Falcon”
|
Chosen
(NIST)
|
Lattice
|
Falcon-512
|
|
|
|
|
|
|
|
|
Falcon-1024
|
|
|
|
|
|
|
|
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.
Formally speaking a stateful signature scheme is a tuple consisting of three algorithms:
generate: Generates a public key pk and a secret key sk.
sign: Takes a secret key sk and a message m and produces a signature σ and an updated secret key sk.
verify: Receives a public key pk, a message m, and a signature σ and returns a boolean value indicating whether σ is valid.
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
|
|
|
|
|
|
|
|
|
XMSS-SHA2_10_256 XMSS-SHAKE_10_256
|
|
|
|
|
|
|
|
|
XMSS-SHA2_10_256 XMSS-SHAKE_10_256
|
|
|
|
|
|
|
|
|
XMSS-SHA2_10_512 XMSS-SHAKE_10_512
|
|
|
|
|
|
|
|
|
XMSS-SHA2_10_512 XMSS-SHAKE_10_512
|
|
|
|
|
|
|
|
|
XMSS-SHA2_10_512 XMSS-SHAKE_10_512
|
|
|
|
|
|
|
|
|
XMSS-MT
RFC 8391
|
Standardized (IRTF)
|
Hash-based
|
XMSSMT-SHA2_20/2_256 XMSSMT-SHAKE_20/2_256
|
|
|
|
|
|
|
|
|
XMSSMT-SHA2_20/4_256 XMSSMT-SHAKE_20/4_256
|
|
|
|
|
|
|
|
|
XMSSMT-SHA2_40/2_256 XMSSMT-SHAKE_40/2_256
|
|
|
|
|
|
|
|
|
XMSSMT-SHA2_40/4_256 XMSSMT-SHAKE_40/4_256
|
|
|
|
|
|
|
|
|
XMSSMT-SHA2_40/8_256 XMSSMT-SHAKE_40/8_256
|
|
|
|
|
|
|
|
|
XMSSMT-SHA2_60/3_256 XMSSMT-SHAKE_60/3_256
|
|
|
|
|
|
|
|
|
XMSSMT-SHA2_60/6_256 XMSSMT-SHAKE_60/6_256
|
|
|
|
|
|
|
|
|
XMSSMT-SHA2_60/12_256 XMSSMT-SHAKE_60/12_256
|
|
|
|
|
|
|
|
|
XMSSMT-SHA2_20/2_512 XMSSMT-SHAKE_20/2_512
|
|
|
|
|
|
|
|
|
XMSSMT-SHA2_20/4_512 XMSSMT-SHAKE_20/4_512
|
|
|
|
|
|
|
|
|
XMSSMT-SHA2_40/2_512 XMSSMT-SHAKE_40/2_512
|
|
|
|
|
|
|
|
|
XMSSMT-SHA2_40/4_512 XMSSMT-SHAKE_40/4_512
|
|
|
|
|
|
|
|
|
XMSSMT-SHA2_40/8_512 XMSSMT-SHAKE_40/8_512
|
|
|
|
|
|
|
|
|
XMSSMT-SHA2_60/3_512 XMSSMT-SHAKE_60/3_512
|
|
|
|
|
|
|
|
|
XMSSMT-SHA2_60/6_512 XMSSMT-SHAKE_60/6_512
|
|
|
|
|
|
|
|
|
XMSSMT-SHA2_60/12_512 XMSSMT-SHAKE_60/12_512
|
|
|
|
|
|
|
|
|
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
|
|
|
|
|
|
|
|
|
WOTSP-SHA2_512 WOTSP-SHAKE_512
|
|
|
|
|
|
|
|
|
LMOTS
RFC 8554
|
Standardized (IRTF)
|
Hash-based
|
LMOTS_SHA256_N32_W1
|
|
|
|
|
|
|
|
|
|
LMOTS_SHA256_N32_W2
|
|
|
|
|
|
|
|
|
|
LMOTS_SHA256_N32_W4
|
|
|
|
|
|
|
|
|
|
LMOTS_SHA256_N32_W8
|
|
|
|
|
|
|
|
|