- Handy zeichnet Begegnungen mit anderen Handys auf
- Server/Betreiber kann nie sehen, wer wem begegnet ist
- als positiv melden → nur Begegnete kriegen davon mit
📱
2e77
📱
b3b4
📱
09b5
☁️
🖥
❓
❓
❓
Corona-Warn-App
- Alice & Bob beginnen ein privates Gespräch
- Betreiber kann nicht mitlesen, selbst wenn er alle Kommunikation mithört
🙋🏽♀️
🙋🏻♂️
🤷🏼
💬
WhatsApp, Signal, …
- anonyme Währung
- ohne Zentralbank, (theoretisch) dezentral
- getätigte Zahlungen sind nicht manipulierbar
👩🏽
👨🏻
💸
🧑🏼🔬
💸
💸
🕵🏻♀️
Bitcoin

Kryptographie ✨
🤓
- Eingabedaten (beliebig groß) → "Fingerabdruck"/Prüfsumme
"Fingerabdruck"/Prüfsumme → Eingabedaten- leicht andere Eingabedaten → ganz anderes Ergebnis
Hash-Funktionen
SHA1("Hallo Welt!") // 726c3e8861ab0652a5043ea5faff6d3ef33fb209
SHA1("Hallo Welt!") // 726c3e8861ab0652a5043ea5faff6d3ef33fb209
SHA1("Hallo Welt?") // dff4b83f415b61a06594dc57c4972c77da0c833f
SHA1("") // da39a3ee5e6b4b0d3255bfef95601890afd80709
SHA1("bla".repeat(1000)) // 74def80b7bb1124c70e7572955ee286c1638abb0
Hash-Funktionen
zahlenschlossCode = "3759"
SHA1(zahlenschlossCode) // 6d7b67fb3cea9b6848db728370d40b0a200350c2
Alice: Kennst du eigentlich den Code für das Zahlenschloss?
Bob: Ja, der SHA1-Hash davon ist "6d7b6…350c2"
Alice: Stimmt, du scheinst den Code zu kennen!
Eve: 🤔
Hash-Funktionen
sehr geheimes Geheimnis
6d7b67fb68…70d40350c2
❌
Hash-Funktionen
⚙️
Hash-Funktionen
→ Beweis über Wissen
→ anonymes Nachschlagen
📱
📱
📱
☁️
🖥
Corona-Warn-App
63b9ff
75e1a5…c63e44
4fb662
initialSecret = generateKey(random())
day1Secret = hash(initialSecret)
ad8536…fd2e22
day1TraceIds = shuffle([
hash(day1Secret + 1),
hash(day1Secret + 2),
…
])
e0621c…ff3ea3
76165b
499b77
day2Secret = hash(day1Secret)
day2TraceIds = shuffle([…])
…
…
debf11…aaa683
5d8556
2559c2
…
day3Secret = hash(day2Secret)
day3TraceIds = shuffle([…])
63b9ff
4fb662
📱
499b77
5d8556
2559c2
103cc1…e11e12
34dfd8…74d8c5
2f7f6a
…
sendToServer([
[2, day2Secret],
[3, day3Secret]
])
initialSecret = generateKey(random())
day4Secret = hash(initialSecret)
day4TraceIds = shuffle([…])
📱
2f7f6a
e04156…9e1331
3944c9
…
day5Secret = hash(day4Secret)
day5TraceIds = shuffle([…])
🦠
🦠
🦠
🦠
🦠
🦠
🦠
🦠
🦠
e0621c…ff3ea3
🦠
debf11…aaa683
🦠
⚙️
⚙️
⚙️
⚙️
Schlüssel generieren
key 🔑
symmetrische Verschlüsselung
45ba26b0db53967
Verschlüsseln & Entschlüsseln
Daten
verschlüsselte Daten
🗃
🗃
🔒
key 🔑
symmetrische Verschlüsselung
Verschlüsseln & Entschlüsseln
geheimnis = "sehr geheimes Geheimnis"
key = generateKey(geheimnis)
nachricht = "Niemand weiß, dass ich Rumpelstilzchen heiß."
verschlüsselt = encrypt(nachricht, key) // afe3bbc9…bff87208…11de55b7
decrypt(verschlüsselt, key) // Niemand weiß, dass ich Rumpelstilzchen heiß.
🔑
🔑
🔑
symmetrische Verschlüsselung
geheimnis = "sehr geheimes Geheimnis"
key = generateKey(geheimnis)
// 2d43dc7…2670499
Alice 🙋🏽♀️
Bob 🙋🏻♂️
key = '2d43dc7…2670499'
💃🏽
🔑
⏳
✉️
🔒
🔑
🔑
nachricht = "Ich glaube ich mag dich!"
verschlüsselt = encrypt(nachricht, key)
// afe3bbc95cdbff87208ad67011de55b7
verschlüsselt = 'afe3bbc95cdbff87208ad67011de55b7'
decrypt(verschlüsselt, key)
// Ich glaube ich mag dich!
nachricht2 = "Lass uns mal was trinken gehen!"
verschlüsselt2 = encrypt(nachricht2, key)
// 1567ce851dd4f07c80f1a39470bd78cdb58d4908
verschlüsselt2 = '1567ce851dd4f07…70bd78cdb58d4908'
decrypt(verschlüsselt2, key)
// Lass uns mal was trinken gehen!
✉️
🔒
symmetrische Verschlüsselung
Hash-Funktionen
symmetrische Verschlüsselung
→ anonymes Nachschlagen
→ Beweis über Wissen
→ private Kommunikation
Alice 🙋🏽♀️
Bob 🙋🏻♂️
💃🏽
🔑
- für symmetrische Verschlüsselung gemeinsamer Key notwendig
- Alice & Bob generieren Key, ohne dass Dritte ihn generieren können
Diffie-Hellman Key Exchange
Alice 🙋🏽♀️
Bob 🙋🏻♂️
Eve 🙋🏼
🔑
🔑
🤷🏼
Diffie-Hellman Key Exchange
Hash-Funktionen
symmetrische Verschlüsselung
→ anonymes Nachschlagen
→ Beweis über Wissen
→ private Kommunikation
DH Key Exchange
→ Key generieren
📱
☁️
🖥
HTTPS in Browser, Apps, …
anfrage = "gib mir /wiki/SARS-CoV-2.html"
verschlüsselteAnfrage = encrypt(anfrage, key)
send(verschlüsselteAnfrage)
Diffie-Hellman Key Exchange
🔑
🔑
verschlüsselteAnfrage = empfangen()
anfrage = decrypt(verschlüsselteAnfrage, key)
// gib mir /wiki/SARS-CoV-2.html
antwort = "Das Virus SARS-CoV-2 ist ein dem…"
verschlüsselteAntwort = encrypt(antwort, key)
send(verschlüsselteAntwort)
verschlüsselteAntwort = empfangen()
antwort = encrypt(verschlüsselteAntwort, key)
// Das Virus SARS-CoV-2 ist ein dem…
wikipedia.de
Schlüsselpaar generieren
🔓 public key
private key 🔑
asymmetrische Verschlüsselung
Verschlüsseln & Entschlüsseln
Daten
verschlüsselte Daten
🗃
🗃
🔒
public key 🔓
private key 🔑
asymmetrische Verschlüsselung
{publicKey, privateKey} = generateKeyPair()
Alice 🙋🏽♀️
Bob 🙋🏻♂️
alicesPublicKey = '37e3c19…debb421'
nachricht = 'Ich glaube ich mag dich!'
verschlüsselt = encrypt(nachricht, alicesPublicKey)
send(verschlüsselt)
⏳
bobsVerschlüsselteNachricht = '1893d8…10ab18e…7ad31d0'
decrypt(alicesVerschlüsselteNachricht, privateKey)
// Ich glaube ich mag dich!
✉️
🔒
🙆🏽♀️❤️
🔒
🔑
asymmetrische Verschlüsselung
🔒
🔒
🔑
Hash-Funktionen
→ anonymes Nachschlagen
→ Beweis über Wissen
symmetrische Verschlüsselung
→ private Kommunikation
DH Key Exchange
→ Key generieren
asymmetrische Verschlüsselung:
Verschlüsseln
→ private Kommunikation
→ Idenfikation
Signieren
Daten
signierte Daten
🗃
🗃
🔑
public key 🔓
private key 🔑
(Schlossmetapher funktioniert hier nicht)
asymmetrische Verschlüsselung
{publicKey, privateKey} = generateKeyPair()
Alice 🙋🏽♀️
Bob 🙋🏻♂️
alicesPublicKey = '4c75f27…017368'
nachricht = 'Ich kenne Bob, er ist cool!'
signiert = sign(nachricht, privateKey)
send(signiert)
⏳
alicesSignierteNachricht = '635e2a2…ad7cea2…7e1c4e4'
verify(alicesSignierteNachricht, alicesPublicKey)
// Ich kenne Bob, er ist cool!
🔒
🔑
🔒
Charlie 🧑🏼🎤
alicesPublicKey = '4c75f27…017368'
🔒
🔑
alicesSignierteNachricht = '635e2a2…ad7cea2…7e1c4e4'
verify(alicesSignierteNachricht, alicesPublicKey)
// Ich kenne Bob, er ist cool!
🔒
🔒
asymmetrische Verschlüsselung
Hash-Funktionen
→ anonymes Nachschlagen
→ Beweis über Wissen
symmetrische Verschlüsselung
→ private Kommunikation
DH Key Exchange
→ Key generieren
asymmetrische Verschlüsselung:
Signieren
→ öffentl. Identifikation
→ Beglaubigen
asymmetrische Verschlüsselung:
Verschlüsseln
→ private Kommunikation
→ Idenfikation
Krankenkassenkarte
🏥
Arztpraxis
🏢
Gesundheitsministerium
{privateKey, publicKey} = generateKeyPair()
🔒
🔑
🙋🏽♀️
Alice
bmgPublicKey = '871b45…1024b7'
💳
beglaubigung = "versichert: Alice" + empfangen()
// versichert: Alice c7005d…0beaac
zertifikat = sign(beglaubigung, privateKey)
// 0cea24…36671f…69016de
send(zertifikat)
🔑
🔒
🔒
🔒
🔑
🧾
🧾
alicesZertifikat = receive()
verify(alicesZertifikat, bmgPublicKey)
// versichert: Alice c7005d…0beaac
alicesPublicKey = receive()
geheimnis = random() // 092a
challenge = encrypt(geheimnis, alicesPublicKey)
send(challenge)
beweis = receive() // 092a
{publicKey, privateKey} = genKeyPair()
beweis = decrypt(challenge, privateKey)
// 092a
send(beweis)
🧾
🔒
🔒
✅
🙋🏾♂️
🔒
✅
Bonus
Bitcoin: Blockchains
--100€--> Satoshi
Satoshi ---50€--> Alice
vorher: f65d88…9ad7f3
Alice ---20€--> Bob
Alice ----1€--> Satoshi
Satoshi ---10€--> Charlie
f65d88…9ad7f3
⚙️
b6d3eb…0eea5a
⚙️
vorher: b6d3eb…0eea5a
-
…
34a713…8c6834
⚙️
vorher: 34a713…8c6834
Bob ----1€--> Alice
Charlie ----1€--> Alice
66ca0d…1f1976
⚙️
🙋🏽♀️
🙋🏻♂️
66ca0d…1f1976
vorher: f65d88…9ad7f3
Alice ---20€--> Charlie
Alice ----1€--> Satoshi
Satoshi ---10€--> Charlie
625b46…423d93
⚙️
vorher: 625b46…423d93
-
9203f0…20832e
⚙️
vorher: 9203f0…20832e
Bob ----1€--> Alice
Charlie ----1€--> Alice
0fa056…b24458
⚙️
66ca0d…1f1976
⛓
⛓
⛓
⛓
⛓
🧑🏼🎤
👀
⛓
❌
Bitcoin: Proof of Authority
--100€--> Satoshi
Satoshi ---50€--> Alice
vorher: f65d88…9ad7f3
Alice ---20€--> Bob
Alice ----1€--> Satoshi
Satoshi ---10€--> Charlie
f65d88…9ad7f3
⚙️
b6d3eb…0eea5a
⚙️
vorher: b6d3eb…0eea5a
-
…
34a713…8c6834
⚙️
vorher: 34a713…8c6834
Bob ----1€--> Alice
Charlie ----1€--> Alice
66ca0d…1f1976
⚙️
🙋🏽♀️
🙋🏻♂️
66ca0d…1f1976
66ca0d…1f1976
👀
🧾
🧾
🧾
🧾
🔒
🔑
{publicKey, privateKey} = genKeyPair()
🏢
🔒
🔒
Bitcoin: Proof of Work
--100€--> Satoshi
Satoshi ---50€--> Alice
vorher: f65d88…9ad7f3
Alice ---20€--> Bob
Alice ----1€--> Satoshi
Satoshi ---10€--> Charlie
f65d88…9ad7f3
⚙️
b6d3eb…0eea5a
⚙️
vorher: b6d3eb…0eea5a
-
34a713…8c6834
⚙️
vorher: 34a713…8c6834
Bob ----1€--> Alice
Charlie ----1€--> Alice
🙋🏽♀️
🙋🏻♂️
🧑🏼🎤
🙋🏼
💪x1000 = $
🖥
$
$$
$$
🖥
$
$$
🖥
$
$$
🖥
$
$$
🖥
$
$$
🖥
$
$$
🖥
$
$$
Bitcoin: Proof of Work
💪x1000 = $$$
sehr geheimes Geheimnis
6d7b67fb68…70d40350c2
❌
⚙️
?
👌
Hierarchien aus Zertifikaten
{publicKey, privateKey} = genKeyPair()
🏢
T-Systems Trust Center
🔒
🔑
{privateKey, publicKey} = genKeyPair()
🏢
📱
🔒
beglaubigung = "bundeskanzlerin.de gehört dem PBA, 1949-09-15"
pbaZertifikat = encrypt(beglaubigung, privateKey)
// 957d2a7…01b34cdcb…5d1760cc
🏢
Presse- und Informationsamt der Bundesregierung (PBA)
🚶🏻
🧾
🧾
anfrage = decrypt("e781a5ad…4f472a4d…8a71d28", sharedKey)
antwort = zertifikat + "Bundeskanzlerin besucht Putin"
verschlüsselt = encrypt(antwort, sharedKey)
// 8a027482…9732bdf5…6cd54103
anfrage = "gib mir https://bundeskanzlerin.de"
verschlüsselt = encrypt(anfrage, sharedKey)
// e781a5ad…4f472a4d…8a71d28
Diffie-Hellman Key Exchange
🔑
🔑
[zertifikat, antwort] = decrypt("8a027482…", sharedKey)
beglaubigung = verify(zertifikat, tSystemsPublicKey)
// bundeskanzlerin.de gehört dem PBA, 1949-09-15
a = fromHex("4dc968ff0ee35c209572d4777b721587d36fa7b21bdc56b74a3dc0783e7b9518afbfa200a8284bf36e8e4b55b35f427593d849676da0d1555d8360fb5f07fea2")
b = fromHex("4dc968ff0ee35c209572d4777b721587d36fa7b21bdc56b74a3dc0783e7b9518afbfa202a8284bf36e8e4b55b35f427593d849676da0d1d55d8360fb5f07fea2")
// | |
MD5(a) // 008ee33a9d58b51cfeb425b0959121c9
MD5(b) // 008ee33a9d58b51cfeb425b0959121c9
SHA2 😊
SHA1 😬
MD5 😣
Hash-Funktionen: Kollisionen
Kryptographie
By Jannis R
Kryptographie
Warum Kryptographie toll ist.
- 396