Exkurs - Experimente mit GnuPG
OpenPGP, GnuPG
OpenPGP ist ein Standard für Verschlüsselungssoftware, der in der RFC 4880 festgelegt ist. Dieser Standard beschreibt u.a. die Verschlüsselungsmethode und die zu benutzenden Formate (Schlüssel, Signaturen, etc.) der Software.
GnuPG oder GPG (GNU Privacy Guard, englisch für GNU-Privatsphärenschutz) ist ein Softwarepaket, das den Standard OpenPGP implementiert, d.h., die Vorgaben von OpenPGP umsetzt. GnuPG gibt es für verschiedene Betriebssysteme. Wenn man das Windows-Installationspaket Gpg4win ausführt, wird u.a. auch GnuPG installiert.
Realisierung eines asymmetrische Chiffriersystems
Wir betrachten die folgende Nachricht von Alice an Bob:
Hallo Bob, was hast du heute Abend vor? Alice
Erzeugung eines Schlüsselpaars
Bevor eine nachricht an Bob verschlüsselt werden kann, muss erst einmal ein Schlüsselpaar für Bob (bestehend aus einem öffentlichen und einem privaten Schlüssel) erzeugt werden.
Wir begeben uns mit geeigneten Befehlen auf die Konsole. Mit ...>
soll hier das Prompt dargestellt
werden.
...> gpg --gen-key gpg (GnuPG) 1.4.10; Copyright (C) 2008 Free Software Foundation, Inc. This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Bitte wählen Sie, welche Art von Schlüssel Sie möchten: (1) RSA und RSA (voreingestellt) (2) DSA und Elgamal (3) DSA (nur unterschreiben/beglaubigen) (4) RSA (nur signieren/beglaubigen) Ihre Auswahl? 1 RSA Schlüssel können zwischen 1024 und 4096 Bits lang sein. Welche Schlüssellänge wünschen Sie? (2048) Die verlangte Schlüssellänge beträgt 2048 Bit Bitte wählen Sie, wie lange der Schlüssel gültig bleiben soll. 0 = Schlüssel verfällt nie= Schlüssel verfällt nach n Tagen w = Schlüssel verfällt nach n Wochen m = Schlüssel verfällt nach n Monaten y = Schlüssel verfällt nach n Jahren Wie lange bleibt der Schlüssel gültig? (0) 30 Key verfällt am Fr 08 Okt 2010 15:01:16 CEST Ist dies richtig? (j/N) j Sie benötigen eine User-ID, um Ihren Schlüssel eindeutig zu machen; das Programm baut diese User-ID aus Ihrem echten Namen, einem Kommentar und Ihrer Email-Adresse in dieser Form auf: "Heinrich Heine (Der Dichter) " Ihr Name ("Vorname Nachname"): Bob Happy Email-Adresse: bob@happy.de Kommentar: Sie haben diese User-ID gewählt: "Bob Happy " Ändern: (N)ame, (K)ommentar, (E)-Mail oder (F)ertig/(B)eenden? f Sie benötigen eine Passphrase, um den geheimen Schlüssel zu schützen. Wir müssen eine ganze Menge Zufallswerte erzeugen. Sie können dies unterstützen, indem Sie z.B. in einem anderen Fenster/Konsole irgendetwas tippen, die Maus verwenden oder irgendwelche anderen Programme benutzen. ...................+++++ ......+++++ Wir müssen eine ganze Menge Zufallswerte erzeugen. Sie können dies unterstützen, indem Sie z.B. in einem anderen Fenster/Konsole irgendetwas tippen, die Maus verwenden oder irgendwelche anderen Programme benutzen. ..........+++++ Es sind nicht genügend Zufallswerte vorhanden. Bitte führen Sie andere Arbeiten durch, damit das Betriebssystem weitere Entropie sammeln kann! (Es werden noch 37 Byte benötigt.) .+++++ gpg: Schlüssel 4FF83FC8 ist als uneingeschränkt vertrauenswürdig gekennzeichnet Öffentlichen und geheimen Schlüssel erzeugt und signiert. gpg: "Trust-DB" wird überprüft gpg: 3 marginal-needed, 1 complete-needed, PGP Vertrauensmodell gpg: Tiefe: 0 gültig: 2 signiert: 0 Vertrauen: 0-, 0q, 0n, 0m, 0f, 2u gpg: nächste "Trust-DB"-Pflichtüberprüfung am 2010-10-08 pub 2048R/4FF83FC8 2010-09-08 [verfällt: 2010-10-08] Schl.-Fingerabdruck = F2B2 A68C A4F6 18AA F4B7 9249 A2EB 1931 4FF8 3FC8 uid Bob Happy sub 2048R/E35DC13D 2010-09-08 [verfällt: 2010-10-08] ...>
Nach Eingabe einer Passphrase werden die Schlüssel erzeugt.
Achtung: Die Passphrase muss man sich merken. Die wird später beim Entschlüsseln benötigt.
Export des öffentlichen Schlüssels
Den öffentlichen Schlüssel kann man jetzt exportieren:
...> gpg --armor --output bob_public_key.asc --export "Bob Happy"
Die Datei bob_public_key.asc
mit dem öffentlichen Schlüssel von Bob
kann man an Kommunikationspartner weitergeben. Sie enthält die folgenden Zeichen:
---BEGIN PGP PUBLIC KEY BLOCK--- Version: GnuPG v2.0.14 (MingW32) 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 CDcNzdH/s4Y0o5/MvX67NDQEE20iWbzL =VPa7 ---END PGP PUBLIC KEY BLOCK---
Die in dieser Datei dargestellte Information kann man sich anzeigen lassen. Hierzu muss man Fingerabdruck 4FF83FC8 des Schlüssels benutzen.
...> gpg --with-key-data --list-keys 0x4FF83FC8
Im vorliegenden Fall erhält man u.a. die beiden Zahlen, die den öffentlichen Schlüssel nach dem RSA-Verfahren ausmachen:
Old: Public Key Packet(tag 6)(269 bytes) Ver 4 - new Public key creation time - Fri Sep 24 16:13:13 UTC 2010 Pub alg - RSA Encrypt or Sign(pub 1) RSA n(2048 bits) - a8 64 1c 41 51 83 10 75 4d ea 95 68 d0 25 1f 33 ae a2 89 ad c1 fd 82 c2 87 58 6f 97 83 a3 e7 31 7a c4 75 e1 20 3a ef 5d c7 74 cd 27 c6 28 53 cb 93 b5 ab a2 eb 97 45 70 4d 8e d1 c5 c3 9d ee 57 c9 c4 15 32 31 97 00 72 c4 b8 23 d1 41 1f ed ba 12 70 b2 4e ae ed 31 4f 1a 00 b7 69 2b 8a 6e ad 87 bb a9 71 05 4a 24 5f 1f 18 9d 85 bb b9 33 6b 84 e2 ca a7 63 84 24 24 be 1a 25 02 dd da df 62 57 66 37 2f 3e 60 ec 0d 0d 16 df 69 b7 31 3e 8e 40 1a 8e f9 a9 c1 b1 02 c6 ad f9 62 33 31 9b 1e 40 77 1f 01 6f 65 e3 79 23 1b 70 bb c3 da e0 28 ef b8 d0 e0 98 6f fe 43 1f 13 7c 2a 58 0c 87 53 ce 81 8a f2 44 46 47 21 83 6e b5 e8 04 04 be 0d 21 44 56 1a 67 61 a5 19 ad 17 04 c0 bc b4 c9 b7 4c 04 c4 98 4a 34 7a 41 c1 7c 4c e3 f7 87 7c 44 cd 9e d4 f1 6a 05 b1 bc 06 f8 cf 1f c2 d2 61 f5 RSA e(17 bits) - 01 00 01
Mit dem folgenden Python-Programm kann man die hexadezimal dargestellten Zahlen in eine dezimale Darstellung umwandeln.
n_hex = '0xa8641c41518310754dea9568d0251f33aea289adc1fd82c287586f9783a3e7317ac475e1203aef5dc774cd27c62853cb93b5aba2eb9745704d8ed1c5c39dee57c9c4153231970072c4b823d1411fedba1270b24eaeed314f1a00b7692b8a6ead87bba971054a245f1f189d85bbb9336b84e2caa763842424be1a2502dddadf625766372f3e60ec0d0d16df69b7313e8e401a8ef9a9c1b102c6adf96233319b1e40771f016f65e379231b70bbc3dae028efb8d0e0986ffe431f137c2a580c8753ce818af244464721836eb5e80404be0d2144561a6761a519ad1704c0bcb4c9b74c04c4984a347a41c17c4ce3f7877c44cd9ed4f16a05b1bc06f8cf1fc2d261f5' e_hex = '0x010001' n = int(n_hex, 16) e = int(e_hex, 16) print('n = ', n) print('e = ', e)
Es ergeben sich die folgenden Ergebnisse:
>>> n = 21257401498479011359050603733535299964981915555116347728020718941 4979927591883940053938988374917464762893307669048967202314254097150044 9207487578697971408378406024073619434737409525857176339127738486055245 7700551303631950998430608890605549738448001265354538102922007163341293 3758524894890397337770039317383201567151671922812297428367397046290582 6707287739072813102220788181993732810158057513614310683568432663710510 0723571393382869095829124235827944386268935561541442610526224069745941 6788017290549815858245587367933981252479878835433929188970275686578557 93746791410781043965045372773921120542700472045403767997358581 e = 65537
Die Modulzahl n
ist hier eine Zahl mit 617 Stellen.
Export des privaten Schlüssels
Auch den privaten Schlüssel kann man exportieren:
...> gpg --armor --output bob_private_key.asc --export-secret-keys "Bob Happy"
Der Inhalt der Datei bob_private_key.asc
sieht so ähnlich aus wie beim öffentlichen Schlüssel.
Wir zeigen ihn hier natürlich nicht.
Import des öffentlichen Schlüssels
Wenn Alice jetzt die oben beschriebene Nachricht an Bob schicken möchte, dann muss sie den öffentlichen Schlüssel von Bob importieren.
Das folgende Protokoll zeigt, wie man einen Schlüssel importiert.
...> gpg --import bob_public_key.asc gpg: Schlüssel 4FF83FC8: Öffentlicher Schlüssel "Bob Happy" importiert gpg: Anzahl insgesamt bearbeiteter Schlüssel: 1 gpg: importiert: 1 (RSA: 1)
Anzeige von Schlüsseln
Die Gesamtheit aller verwalteten Schlüssel kann man sich auch anzeigen lassen.
...> gpg --list-keys ... uid Bob Happysub 2048R/E35DC13D 2010-09-08 [verfällt: 2010-10-08]
Verschlüsselung einer Nachricht
Alice kann jetzt die Nachricht verschlüsseln. Wir gehen davon aus,
dass sie sich in der Datei alice_an_bob.txt
befindet.
...> gpg --armor --output alice_an_bob_verschluesselt.txt --recipient "Bob Happy" --encrypt alice_an_bob.txt
Der Inhalt der Datei alice_an_bob_verschluesselt.txt
sieht so aus:
---BEGIN PGP MESSAGE--- Version: GnuPG v2.0.14 (MingW32) hQEMA08y+QxRS1+9AQf/WVEEHg1swHRCOKC3zTlyDpVc5P3ZQdU+hNJgYM+JNCgv f0C92wt4k39KsvYWPSbPhgVDwS1Wsd7Ir8V2qIUjY/np1JivKuA6qtIpUVdjUFYz ycC+4RQlGiU/HQrrnR61DeegEqqrlXVu6xV4COEBF2XZBk5T5EQ7G75eS68Dv2Mr Om51hqvXhSKqA7vsR77JOW5kq3DMU+ULqrG0bCP1hHb1D07Qm26lvnUdMAhT/9mD jwG43teEczf/Jhts3jVm9LNbOA9dKqU2diL9hkFmtHwdKDI/rvY7Ip+UUF8w7GXC GLMmbu665xrzHycev7d5ol7xhSXXwRkDC2V6EyQWn9J4AYN/EwKN0DJKQLdxZWd4 xeJ8q8P3//sCLRWDXlvNvFaVJFr8e6/RQrlYf/46UowUBi4q3as4pZlPC+TllgUH X6+TvzH1CQvgPA2y/kfZDZlRUE7JDgwPxAivXwEd0Wzn0sYufd5lpflzcxP/prEG wtrvMAUvIA1m =uhSA ---END PGP MESSAGE---
Entschlüsselung einer Nachricht
Wenn Bob die verschlüsselte Nachricht entschlüsseln möchte, dann kann er folgendermaßen vorgehen:
...> gpg --armor --ootput alice_an_bob_entschluesselt.txt --decrypt alice_an_bob_verschluesselt.txt
Zusätzlich muss Bob die Passphrase eingeben.
Wenn die eingegebene Passphrase stimmt, dann wird eine neue Datei alice_an_bob_entschluesselt.txt
mit der entschlüsselten Nachricht erstellt.
Im vorliegenden Fall erhält man:
Hallo Bob, was hast du heute Abend vor? Alice
Aufgabe 1
Probiere das erst einmal selbst aus.
Aufgabe 2
Es sollen verschlüsselte Nachrichten an verschiedene Kommunikationspartner verschickt werden. Zunächst muss jeder ein Schlüsselpaar erzeugen und den exportierten öffentlichen Schlüssel alle Kommunikationspartnern zugänglich machen (z.B. indem die Daeien mit den öffentlichen Schlüsseln in einem hierfür vorgesehen Ordner abgespeichert werden). Jetzt können verschlüsselten Nachrichten an die Kommunikationspartnern erstellt (und geeignet zugestellt) werden.