Die heu­ti­ge digi­ta­le Sicher­heit stützt sich maß­geb­lich auf asym­me­tri­sche Ver­schlüs­se­lungs­ver­fah­ren wie RSA und ECC, die dar­auf basie­ren, dass bestimm­te mathe­ma­ti­sche Ope­ra­tio­nen für klas­si­sche Com­pu­ter prak­tisch nicht umkehr­bar sind. Da Quan­ten­com­pu­ter jedoch in der Lage sein wer­den, die­se mathe­ma­ti­schen „Ein­bahn­stra­ßen“ durch tech­no­lo­gi­sche Abkür­zun­gen zu über­win­den, wird die Ent­wick­lung und Imple­men­tie­rung der Post-Quan­ten-Kryp­to­gra­phie (PQC) wie ML-KEM unumgänglich.

Wäh­rend die sym­me­tri­sche Ver­schlüs­se­lung durch den AES-Stan­dard – ins­be­son­de­re bei Ver­wen­dung einer 256-Bit-Ver­schlüs­se­lung – wei­ter­hin als weit­ge­hend resis­tent gegen die­se neu­en Bedro­hun­gen gilt, liegt das Haupt­ri­si­ko bei den asym­me­tri­schen Pro­to­kol­len. Da die­se jedoch ent­schei­dend für den siche­ren Aus­tausch von Schlüs­seln zwi­schen Sen­dern und Emp­fän­gern sind, kon­zen­triert sich die aktu­el­le For­schung und Umstel­lung vor allem auf die­sen Bereich der Kryptographie

In die­sem Bei­spiel wird der gesam­te PQC Schlüs­sel­er­zeu­gungs­pro­zess zwi­schen einem Ser­ver und einem Cli­ent als Linux Shell Script abge­bil­det. Das Script kann man leicht auf zwei Linux Sys­te­me tei­len und die die Datei­en server_public.pem und ciphertext.bin zwi­schen den Sys­te­men aus­tau­schen. Das Bei­spiel erfor­dert Open­S­SL in Ver­si­on 3.5+.

#!/usr/bin/bash -v

algo=“ml-kem-512″  # ~AES-128
algo=“ml-kem-768″  # ~AES-192
algo=“ml-kem-1024# ~AES-256

### SERVER side ###

# 1. Gene­ra­te ser­ver PQC pri­va­te key
#   results:
#     server_private.pem key

open­s­sl genpkey -algo­rithm $ -out server_private.pem

# Extra­ct public key
#   results:
#     server_public.pem key

open­s­sl pkey -in server_private.pem -pubout ‑out server_public.pem

### CLIENT side ###

# 2. Encap­su­la­ti­on of secret_client.bin by the server_public key
#   results:
#     ciphertext.bin    (to be trans­fe­red to the SERVER)
#     secret_client.bin (the shared secret)

open­s­sl pkeyutl -encap ‑pubin ‑inkey server_public.pem -out ciphertext.bin -secret secret_client.bin

### back to SERVER side ###

# 3. Decap­su­la­ti­on by the server
#   results:
#     secret_server.bin (the shared secret)

open­s­sl pkeyutl -decap ‑inkey server_private.pem -in ciphertext.bin -secret secret_server.bin

# 4. Compa­re secret_client.bin & secret_server.bin
#   tip: In real world the shared secret will never be used as pass­word or encryp­ti­on key itself.
#        Ins­tead, a KDF (key deri­va­ti­on func­tion) will be used to gene­ra­te a secu­re AES-key.
sha256sum secret_client.bin secret_server.bin

Die fol­gen­de Gra­fik zeigt den Infor­ma­ti­ons­fluss zwi­schen dem SERVER und dem CLIENT, wobei die Schüs­sel­ge­nerie­rung des pri­va­ten Schlüs­sels am Ser­ver nur ein­ma­lig erfolgt und belie­big vie­le Cli­ents über open­s­sl pkeyutl ein indi­vi­du­el­les Shared Secret erzeu­gen, dass in Fol­ge für die Ses­si­on spe­zi­fi­sche Ver­schlüs­se­lung zwi­schen Ser­ver und Cli­ent ver­wen­det wer­den kann.

ML-KEM einfach erklärt

Abbil­dung: ML-KEM Schlüs­sel­ge­nerie­rung für ein ein­fa­ches PQC TLS

Hin­weis: ML-KEM ist aus­schließ­lich dafür für die Gene­rie­rung eines gemein­sa­men Geheim­nis­ses geeig­net, dass für die Ver­schlüs­se­lung genutzt wer­den kann. Der Algo­rith­mus besitzt kei­ne Funk­ti­on, um eine digi­ta­le Signa­tur zu erstel­len. Um ein X.509-Zertifikat zu signie­ren, benö­tigt man einen Signa­tur-Algo­rith­mus einen soge­nann­ten DSA (Digi­tal Signa­tu­re Algo­rithm). Für PQC ist das ML-DSA (ehe­mals Dilithium).