OpenSSL – Kryptologie in C - Institut für Mathematik - Hu
Transcription
OpenSSL – Kryptologie in C - Institut für Mathematik - Hu
Vorlesungsmitschrift OpenSSL – Kryptologie in C Dozent: Dr. Ernst-Günter Giessmann Peter Haider, Ulf Hermann, Mathias Jeschke, Jens Kleine & Henryk Plötz (haider|uhermann|jeschke|jkleine|ploetz)@informatik.hu-berlin.de WS 2004/2005 und SS 2005 8. Juli 2009 (Revision: 1.93 ) Humboldt-Universität zu Berlin Institut für Informatik 1 Inhaltsverzeichnis 1 Einführung 1.1 1.2 1.3 1.4 1.5 1.6 Verschlüsselung . . . . . . . . . . . Beispiel: rot13 . . . . . . . . . . . . Block-Chiffre . . . . . . . . . . . . Strom-Chiffre . . . . . . . . . . . . Angriffstypen . . . . . . . . . . . . 1.5.1 Differentielle Kryptoanalysis Base64 . . . . . . . . . . . . . . . . 5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 6 7 8 8 9 10 2 OpenSSL 10 3 Symmetrische Verschlüsselungsverfahren 12 3.1 3.2 3.3 3.4 3.5 3.6 2 Feistel-Chiffren . . . . . . . . . . . . . . . . . DES - Data Encryption Standard . . . . . . . . 3.2.1 Schlüsselauswahl . . . . . . . . . . . . 3.2.2 Funktionsweise . . . . . . . . . . . . . 3.2.3 Schwachstellen und Unsinnigkeiten . . 3.2.4 spezielle Optionen bei openssl . . . . . 3.2.5 DES:ECB - Electronic Code Book . . . 3.2.6 DES:CBC - Cipher Block Chaining . . 3.2.7 DES:OFB - Output Feed Back . . . . . 3.2.8 DES:CFB - Cipher Feed Back . . . . . 3.2.9 CTR Mode, CCM . . . . . . . . . . . 3.2.10 TEA-Algorithmus . . . . . . . . . . . 3.2.11 DES-X . . . . . . . . . . . . . . . . . IDEA: International Data Encryption Algorithm 3.3.1 Schlüsselauswahl . . . . . . . . . . . . 3.3.2 Funktionsweise . . . . . . . . . . . . . 3.3.3 Pseudocode-multiplikation . . . . . . . 3.3.4 Schwachstellen . . . . . . . . . . . . . Blowfish . . . . . . . . . . . . . . . . . . . . . 3.4.1 Initialisierung . . . . . . . . . . . . . . 3.4.2 Verschlüsselung . . . . . . . . . . . . . AES: Advanced Encryption Standard . . . . . . 3.5.1 Wiederholung-Byteoperation . . . . . . 3.5.2 Überblick . . . . . . . . . . . . . . . . 3.5.3 mathematische Grundlagen . . . . . . . RC4: Ron’s Cipher 4 . . . . . . . . . . . . . . 3.6.1 Geschichte . . . . . . . . . . . . . . . 3.6.2 Beschreibung . . . . . . . . . . . . . . 3.6.3 Der Pseudo-Zufalls-Algorithmus . . . . 3.6.4 Der Schlüsselerzeugungs-Algorithmus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 14 15 16 17 18 20 21 23 24 25 26 28 28 29 29 30 31 31 33 34 35 35 35 38 39 40 41 41 42 3.7 3.8 3.9 4 3.6.5 Implementation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.6.6 Sicherheit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.6.7 Fluhrer, Mantin und Shamir Angriff . . . . . . . . . . . . . . . . . . . RC5: Ron’s Cipher 5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.7.1 Verschlüsselung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.7.2 Schlüsselexpansion . . . . . . . . . . . . . . . . . . . . . . . . . . . . GOST 28147-89: Gosudarstvennyi Standard Soyuza SSR, nicht in OpenSSL . . Fazit:Wie könnte bei einen Symmetrischen Algorithmus die Sicherheit erhöhen?? 43 43 44 44 44 45 45 47 Asymmetrische Verschlüsselungsverfahren 47 4.1 47 48 48 49 49 49 51 54 54 55 56 56 56 57 58 58 59 4.2 4.3 4.4 4.5 4.6 4.7 4.8 4.9 4.10 4.11 4.12 4.13 4.14 4.15 4.16 Einführung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.1.1 Beispiel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Geschichte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Einige Theoretische Grundlagen . . . . . . . . . . . . . . . . . . . . . . . . . 4.3.1 Kleiner Fermat (oder kleiner Fermat’scher Satz) . . . . . . . . . . . . . 4.3.2 Euklidischer Algorithmus . . . . . . . . . . . . . . . . . . . . . . . . 4.3.3 Beispiel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . RSA: Rivest, Shamir, Adleman . . . . . . . . . . . . . . . . . . . . . . . . . . 4.4.1 Funktionsweise des RSA-Verfahrens . . . . . . . . . . . . . . . . . . . 4.4.2 Beweis der Funktionsweise . . . . . . . . . . . . . . . . . . . . . . . . Schwächen von RSA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Fuktionen in OpenSSL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.6.1 genrsa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.6.2 rsa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.6.3 rsautl . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.6.4 PKCS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.6.5 OAEP - Optimal Asymmetric Encryption Padding . . . . . . . . . . . 4.6.6 Wie erkennt man an Ciphertexten den Verschlüsselungsalgorithmus- DER / ASN1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.6.7 Umgehen mit den Schlüsselkomponenten . . . . . . . . . . . . . . . . Miller-Rabin Test . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Diffie-Hellman-Schlüsselaustausch . . . . . . . . . . . . . . . . . . . . . . . . ElGamal-Cryptosystem . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Wiederholung DH . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.10.1 Beispiel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . was anderes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Elliptische Kurven . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Elliptische Kurven Nachtrag . . . . . . . . . . . . . . . . . . . . . . . . . . . Rucksack-Verschlüsseln . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.14.1 Beispiel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Merkle Puzzle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Rabin-Verfahren und Wurzelziehen . . . . . . . . . . . . . . . . . . . . . . . . 4.16.1 Schlüsselgenerierung . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.16.2 Kongruenzbedingung . . . . . . . . . . . . . . . . . . . . . . . . . . . 60 61 62 64 66 66 67 67 67 70 71 71 71 72 72 73 3 4.16.3 Verschlüsselung . . . . . . . . . . . . . . . . . 4.16.4 Entschlüsselung . . . . . . . . . . . . . . . . 4.17 Angriffe auf asymmetrische Verschlüsselungsverfahren 4.17.1 1. Angriff: Common modulus attack . . . . . . 4.17.2 2. Angriff: kleiner geheimer Exponent d . . . . 4.17.3 3. Angriff: Faktorisieren . . . . . . . . . . . . 4.17.4 Echt schlechte RSA-Schlüssel . . . . . . . . . 4.17.5 Schnelles Faktorisieren bei Fehler im System . 4.17.6 Angriff mit gewähltem Chiffretext . . . . . . . 5 5.2 5.3 5.4 5.5 5.6 5.7 5.8 6.2 6.3 4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Integritätsschutz und Hashfunktionen . . . . . . . . . . . . . . . . . . . . . 5.1.1 Schlüssellose Hashfunktion (Prüfsummen ohne Schlüssel) . . . . . . 5.1.2 Demonstration Fälschung . . . . . . . . . . . . . . . . . . . . . . . Unterschied MD5 und SHA . . . . . . . . . . . . . . . . . . . . . . . . . . . Secure Hash Standard, SHA-2 . . . . . . . . . . . . . . . . . . . . . . . . . 5.3.1 Problem bei MD5 und SHA-0 . . . . . . . . . . . . . . . . . . . . . 5.3.2 MACs (Message Authentication Codes) (Prüfsummen mit Schlüsseln) Whirlpool . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Zusammenfassung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Digitale Signaturen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.6.1 RSA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.6.2 Eigenschaften eines asymmetrischen Verschlüsselungsverfahren . . . 5.6.3 RSASSA-PSS-Padding . . . . . . . . . . . . . . . . . . . . . . . . . 5.6.4 DSA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.6.5 ECDSA - DSA mit Elliptischen Kurven . . . . . . . . . . . . . . . . Widerrufen von Zertifikaten . . . . . . . . . . . . . . . . . . . . . . . . . . Was es noch so gibt . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.8.1 blinde Signaturen . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.8.2 anonyme Signaturen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6.0.3 X509 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6.0.4 Erweiterungen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6.0.5 Erzeugung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6.0.6 Gültigkeit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Praktische Ausschlachtung von kryptografischen Algorithmen mit S/MIME und PKCS#7 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . PKCS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6.2.1 PKCS#7: 1.5 November 93 RFC 3852 . . . . . . . . . . . . . . . . . . CMS(Cryptographic Message Syntax) . . . . . . . . . . . . . . . . . . . . . . Wichtige Neuerungen bei den Versionsänderungen 73 74 74 75 75 75 75 76 76 77 Zertifikate 6.1 7 . . . . . . . . . Signaturmechanismen 5.1 6 . . . . . . . . . 77 80 83 84 85 86 87 89 89 91 92 93 95 97 99 103 105 105 105 105 107 108 111 112 114 115 115 116 119 8 OpenSSL hintergehen 8.1 8.2 8.3 8.4 9 120 die eine Primzahl ganz klein erzeugen . . . . . . . . . . . . . . . . beide Primzahlen nah beieinander . . . . . . . . . . . . . . . . . . Vorschrift des BSI . . . . . . . . . . . . . . . . . . . . . . . . . . . Programmierung: Zufallszahlenerzeugung und andere nette features . . . . . . . . . . . . . . . . . . . . . . . . Zusammenfassung 121 10 Mathematische Techniken 10.1 Multiplikatives Inverses . . . . . . . . . . . . . . . . . . . . 10.1.1 Behauptung . . . . . . . . . . . . . . . . . . . . . . 10.1.2 Beweis . . . . . . . . . . . . . . . . . . . . . . . . 10.2 Kleiner Fermatscher Satz . . . . . . . . . . . . . . . . . . . 10.2.1 Behauptung . . . . . . . . . . . . . . . . . . . . . . 10.2.2 Beweis . . . . . . . . . . . . . . . . . . . . . . . . 10.2.3 Verallgemeinerung . . . . . . . . . . . . . . . . . . 10.2.4 Praktische Anwendung auf Primzahlen . . . . . . . 10.3 Chinesischer Restklassensatz . . . . . . . . . . . . . . . . . 10.3.1 Behauptung . . . . . . . . . . . . . . . . . . . . . . 10.3.2 Beweis . . . . . . . . . . . . . . . . . . . . . . . . 10.4 Square and multiply . . . . . . . . . . . . . . . . . . . . . . 10.5 Montgomery Reduktion (Moduloberechnung ohne Division) 10.6 Nochwas? . . . . . . . . . . . . . . . . . . . . . . . . . . . 120 120 120 121 122 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122 123 123 123 123 123 124 125 125 126 126 127 127 131 1 Einführung Literaturempfehlungen: • Alfred J. Menezes, Paul C. van Oorschot, Scott A. Vanstone - Handbook of Applied Cryptography. CRC Press, 1996. ISBN 0849385237. http://www.cacr.math.uwaterloo.ca/hac/ • John Viega, Matt Messier, Pravier Chandra - Network Security with OpenSSL. O’Reilly, 2002. ISBN 059600270X. • Michael Welschenbach - Kryptographie in C und C++. Springer, 2001. ISBN 3540420614. • Bruce Schneier - Applied Cryptography. Wiley, 2nd rev, 1996. ISBN 3540420614. Prüfung: 24. 08. 2009 In der Vorlesung wird öfters der ’Magma Calculator’ verwendet. Dabei handelt es sich um die Online-Version eines Computer Algebra Systems (http://magma.maths.usyd.edu.au/calc/). Im folgenden werden Berechnungen die mit Magma durchgeführt wurden mit ’Magma:’ gekennzeichnet. 5 Kryptographie ist einer der beiden Bestandteile der Kryptologie, der andere ist Kryptoanalyse. Kryptographie: Entwurf von Sicherheitsalgorythmen, die Daten vor Mitlesen und Verändern schützen Kryptoanalyse: Aktives Analysieren von kryptographischen Verfahren 1.1 Verschlüsselung Verschlüsselung benötigt Menge von Schlüsseln E N - Algorithmus (z.B. DES) - c 6 K N Menge der Nachrichten K Menge der Schlüssel c Verschlüsselte Nachricht ∀n ∈ N, k ∈ K: c = E(n, k) eindeutig ∃ Algorithmus D (decrypt) mit: aus c = E(n, k) folgt ∃k0 ∈ K mit n = D(c, k0 ) 1.2 Beispiel: rot13 N = Alphabet n∈N c = n + 13 mod 26 Dies ist kein Verschlüsselungsalgorithmus, da es nur einen Schlüssel gibt! c = n + k mod 26 Dies ist ein Verschlüsselungsalgorithmus, da es eine Menge von Schlüsseln gibt! c = E(n, k) = n + k n = D(c, k) = c − k E(n, 13) = D(n, 13) 6 Variante der Betrachtung: k0 = 26 − k ⇒ D(c, k0 ) = E(c, k0 ) Verschlüsseln = Entschlüsseln = Vorteil: nur ein Algorithmus Berechnung: k → k0 (vernünftig im allgemeinen Sinne) E · D = IdC D · E = IdN Man unterscheidet bei Verschlüsselungsverfahren: symmetrisch: k ⇔ k0 kennt man einen Schlüssel, kennt man beide asymmetrisch: k ⇒ k0 oder k ⇐ k0 aus dem einen Schlüssel kann man den anderen nicht erfahren 1.3 Block-Chiffre Ausdehnung der Verschlüsselung von Alphabet auf Zeichenketten mi . Die Originalnachricht wird in Blöcke zerlegt, die gleich verschlüsselt werden. Zum Beispiel: m = (m1 , m2 , m3 , ...) k = (k1 , k2 , k3 , ...) ci = mi ⊕ ki Aus der Wikipedia (unter GNU Free Documentation License): Symmetrische Verschlüsselungsalgorithmen sind oft Blockverschlüsselungsalgorithmen (auch Blockchiffre). Bevor sie Daten verschlüsseln, werden diese zunächst in Blöcke unterteilt, deren Größe durch den Algorithmus vorgegeben ist. Die Verschlüsselungsroutinen setzen jedoch ganze Blöcke voraus, somit muss meistens der letzte Block mit Zufallsdaten aufgefüllt werden (bei einer Blockgröße von 128 Bit werden die verschlüsselten Daten somit 0 bis 127 Bit größer als der Klartext). Die Blöcke werden anschließend nacheinander verschlüsselt. Dabei ist es durchaus üblich, dass das Ergebnis der Verschlüsselung eines Blocks bei der Verschlüsselung des nächsten Blocks als Eingangswert mitverwendet wird. Wichtige Parameter einer Blockchiffre sind somit die Blocklänge (auch Blockgröße) und die Schlüssellänge. 7 1.4 Strom-Chiffre Aus der Wikipedia (unter GNU Free Documentation License): Eine Strom-Chiffre ver- bzw. entschlüsselt Nachrichten Bit für Bit bzw. Zeichen für Zeichen. Dies steht im Gegensatz zu Block-Chiffren, wo Nachrichten immer in gleich großen Blöcken verarbeitet werden. Strom-Chiffren sind symmetrische Verschlüsselungsalgorithmen, die sehr schnell arbeiten. Zur Generierung eines Geheimtextes wird zunächst ein Schlüsselstrom erzeugt. Dieser Schlüsselstrom ist eine Folge von Zeichen die nur mit Kenntnis des geheimen Schlüssels erzeugt werden kann (in der Regel eine Pseudozufallsfolge). Danach wird jedes Zeichen des Schlüsselstroms mit einem Zeichen des Klartextes verknüpft. Die Verknüpfungsoperation ist XOR. Um Geheimtexte wieder zu entschlüsseln, wird der Geheimtext mit dem Schlüsselstrom verknüpft. Beispiele für Strom-Chiffren sind die XOR-Verschlüsselung oder die Entwicklung von Ronald L. Rivest namens RC4. 1.5 Angriffstypen m Nachricht c verschlüsselte Nachricht k Schlüssel Kommunikation zwischen Alice und Bob mit Angreifer Eve. Vorraussetzung: Eve kennt das Verfahren 1. Chiffre ist bekannt (ciphertext only / Chiffre allein Angriff) m, k gesucht 2. (mi , ci )-Paare sind bekannt, ci = E(k, mi ) (known plain text / bekannter Klartext Angriff) gesucht k und weitere mi 3. wählbarer Klartext / chosen plaintext (z.B. Eve hat Encoder in die Hände bekommen) 4. wählbarer Chiffretext / chosen ciphertext (z.B. Eve hat Decoder in die Hände bekommen) Generelle Schutzmechanismen zum sicherer machen: 8 1. Klartextbits breit auf Chiffre verteilen und Schlüsselbits überall einbringen, um die Sicherheit zu erhöhen, bzw. einen anderen Algorithmus verwenden um dies zu erreichen. 2. Algorithmus skalieren: Länge des Schlüssels, mehr Runden. 3. Schwachen zusätzlichen Schutz bietet doppeltes verschlüsseln, zum Beispiel: Algorithmus hat 64-Bit Sicherheit (Brute Force Angriff: Aufwand von 264 ), doppelt verschlüsselt hat er 65-Bit Sicherheit, wegen: meet in the middle Angriff“: Ist known plain text attack: m ist der Klartext, k der Schlüssel ” für den ersten Algorithmus, n der daraus resultierende “Zwischentext”, l der Schlüssel für den zweiten Algorithmus und c die endgültige verschlüsselte Nachricht. Der Angreiferin ist ein m und das dazu gehörige c bekannt. Sie erzeugt sich nun alle Werte, die k annehmen kann und alle Werte die l annehmen kann und berechnet zu jedem ki sowie zu jedem li ein ni als E(ki , m) bzw. D(li , c). Damit muss sie 2 ∗ 264 Paare von Schlüsseln und “Zwischentexten” erzeugen und speichern. In der Menge der ni gibt es nun (da beide Verschlüsselungen eindeutig sind) genau zwei - eines als Entschlüsselung von c, eines als Verschlüsselung von m -, die übereinstimmen. Deren Schlüssel sind diejenigen, die auch bei der Erzeugung von c verwendet wurden. Das Auffinden dieses Paares kann durch geschickte Speicherung der ni , ki und li zum Beispiel in einer Hashtabelle in logarithmischer Zeit bewerkstelligt werden. Daher: Sicherheit des Algorithmus ist mindestens so stark wie jeder einzelne Algorithmus, aber möglicherweise nicht viel besser. 4. Dreifach verschlüsseln und Kombination von Algorithmen: Der Meet-in-the-middle attack schlägt hier fehl, da der Speicher- und Rechenaufwand nun quadratisch mit dem Werteraum der Schlüssel wächst. Bei der Verwendung eines schwachen Algorithmus, der anderweitig gebrochen werden kann wird die Kombination jedoch wieder anfällig für meet-in-the-middle. 5. Block-Chiffre + Strom-Chiffre kombinieren: Strom-Chiffre sehr langer Schlüssel c = p ⊕ k, k zufällig gewählt (möglichst echter physikalischer Zufall), zwei Folgen C, K → in Block-Chiffre → Blockweise: C2 = E(S 1 , K), C1 = E(S 2 , C) Eine Strom-Chiffre und zwei Block-Chiffren: Brechen dieser Kombination = Aufwand addiert sich, aber doppelte Ausgabelänge. 1.5.1 Differentielle Kryptoanalysis man wähle Klartexte P1 , P2 mit ganz bestimmten Unterschied P1 ⊕ P2 = D. Bei der Verschlüsselung ergibt sich dann für die Chiffretexte C1 , C2 mit bestimmten D0 = C1 ⊕ C2 das in einen bestimmetn Zusammenhang zu D steht. Bleiben die Schlüssel immer gleich, so kann man sich langsam mit D1 , . . . , Dn an den Klartext ranprobieren. (?) 9 1.6 Base64 Aus der Wikipedia (unter GNU Free Documentation License): Base64 [...] beschreibt ein Verfahren zur Kodierung von 8-Bit-Binärdaten (z. B. ausführbare Programme, ZIP-Dateien), in eine Zeichenfolge, die nur aus wenigen Codepage-unabhängigen ASCII-Zeichen besteht. Im Zusammenhang mit OpenPGP wird noch eine Prüfsumme (CRC24) angehängt und es als Radix-64 bezeichnet. Es findet im Internet-Standard MIME (Multipurpose Internet Mail Extensions) Anwendung und wird damit hauptsächlich zum Versenden von E-Mail-Anhängen verwendet. Nötig ist dies, um den problemlosen Transport von beliebigen Binärdaten zu gewährleisten, da SMTP in seiner ursprünglichen Fassung nur für den Versand von 7-Bit ASCII-Zeichen ausgelegt war. Zur Kodierung werden die Zeichen A-Z, a-z, 0-9, + und /, verwendet, sowie = am Ende. Da diese Zeichen auch in EBCDIC vorkommen (wenn auch an anderen Code-Positionen), ist damit auch ein Datenaustausch zwischen nicht-ASCII-Plattformen möglich. Zur Kodierung werden jeweils drei Byte des Bytestroms (=24 bit) in vier 6-bit-Blöcke aufgeteilt. Jeder dieser 6-bit-Blöcke bildet eine Zahl zwischen 0 und 63. Diese Zahlen werden an Hand der nachfolgenden Umsetzungstabelle in “druckbare ASCII-Zeichen” umgewandelt und ausgegeben. Nach jeweils 76 ausgegebenen Zeichen wird spätestens ein Zeilenumbruch eingefügt, welcher jedoch ansonsten für die Kodierung nicht von Belang ist. Falls die Gesamtanzahl der Eingabebytes nicht durch drei teilbar ist, wird der zu kodierende Text am Ende mit Füllbytes aufgefüllt. Um dem Dekodierer mitzuteilen, wie viele Füllbytes angefügt wurden, werden die 6-Bit-Blöcke, die vollständig aus Füllbytes entstanden sind, mit ’=’ kodiert. Somit können am Ende einer Base64-kodierten Datei 0, 1 oder 2 ’=’-Zeichen auftreten. Die angesprochene Transitionstabelle ist eine alphabetisch bzw numerisch aufsteigende Anordnung zuerst der Großbuchstaben, dann der Kleinbuchstaben, schließlich der Ziffern und am Ende der beiden Zeichen ’+’ und ’/’ in dieser Reihenfolge. 2 OpenSSL Optionen für openssl ciphername oder openssl enc -ciphername: OPTIONS -in filename the input filename, standard input by default. -out filename the output filename, standard output by default. 10 -pass arg the password source. -salt use a salt in the key derivation routines. -nosalt don’t use a salt in the key derivation routines. -e encrypt the input data: this is the default. -d decrypt the input data. -a base64 process the data. This means that if encryption is taking place the data is base64 encoded after encryption. If decryption is set then the input data is base64 decoded before being decrypted. -A if the -a option is set then base64 process the data on one line. -k password the password to derive the key from. This is for compatibility with previous versions of OpenSSL. Superseded by the -pass argument. -kfile filename read the password to derive the key from the first line of filename. This is for compatibility with previous versions of OpenSSL. Superseded by the -pass argument. -S salt the actual salt to use: this must be represented as a string comprised only of hex digits. -K key the actual key to use: this must be represented as a string comprised only of hex digits. If only the key is specified, the IV must additionally specified using the -iv option. 11 When both a key and a password are specified, the key given with the -K option will be used and the IV generated from the password will be taken. It probably does not make much sense to specify both key and password. -iv IV the actual IV to use: this must be represented as a string comprised only of hex digits. When only the key is specified using the -K option, the IV must explicitly be defined. When a password is being specified using one of the other options, the IV is generated from this password. -p print out the key and IV used. -P print out the key and IV used then immediately exit: don’t do any encryption or decryption. -bufsize number set the buffer size for I/O -nopad disable standard block padding -debug 3 Symmetrische Verschlüsselungsverfahren 3.1 Feistel-Chiffren Aus der Wikipedia (unter GNU Free Documentation License): Feistel-Chiffre (auch als Feistelnetzwerk bezeichnet) ist eine Block-Chiffre. Ein Mitarbeiter von IBM, Horst Feistel, gilt als der Erfinder dieser Chiffre. Er arbeitete mit anderen am sog. Projekt Lucifer“, dessen Ziel es war, eine effiziente Verschlüsselungstechnologie zu entwi” ckeln. Die Feistel-Chiffre war später dann die Grundlage für den DES-Algorithmus. Viele moderne symmetrische Verschlüsselungsalgorithmen basieren auf Feistelnetzwerken. Dies rührt u.a. auch daher, dass die Struktur von sehr vielen Kryptografen analysiert und für gut befunden wurde. 12 Wie es der Name Block-Chiffre“ schon nahe legt, wird der Klartext zuerst in einzelne ” Blöcke zerlegt. Die Größe dieser Blöcke kann frei gewählt werden, üblich sind oftmals Vielfache von 64 Bit. Jeder dieser Blöcke wird danach in zwei gleichgroße Hälften (L0 und R0 ) geteilt und in mehreren Runden mit verschiedenen Schlüsseln verschlüsselt. Nach den Runden werden die Hälften wieder zusammen gesetzt. Innerhalb der i-ten Runde (i ist die Nummer der aktuellen Runde und reicht von 1 bis n) wird folgende Formel angewendet: Li = Ri−1 Ri = Li−1 ⊕ f (Ri−1 , Ki ) Dabei bildet f die sog. Runden- oder Transformationsfunktion und Ki ist der jeweilige Rundenschlüssel. Der verschlüsselte Text am Ende der Runden ist die Zusammenführung von (Ln , Rn ). Feistelnetzwerke ermöglichen eine Entschlüsselung, ohne dass die Umkehrfunktion von f benötigt wird. Will man einen Geheimtext dechiffrieren, wendet man die obige Formel leicht modifiziert an: Ri−1 = Li Li−1 = Ri ⊕ f (Ri−1 , Ki ) 13 (Quelle: http://en.wikipedia.org/wiki/Image:Feistel.png) 3.2 DES - Data Encryption Standard DES ist eine 64 Bit Block-Chiffre mit einer festgelegten Schlüssellänge von 56 Bit. Die Funktionsweise entspricht einem 16-Runden Feistel-Netzwerk. DES ist der erste VerschlüsselungsAlgorithmus der weite Verbreitung fand und dessen Spezifikation öffentlich zugänglich ist. Er wurde in den 70er Jahren entwickelt und ist im amerikanischen Standard FIPS 46-2 beschrieben. 14 3.2.1 Schlüsselauswahl Zunächst steht nominal ein 64-Bit Schlüssel zur Verfügung. Von diesem ist jedoch je ein Bit pro Byte als Paritätsbit deklariert, so dass 56 Bit effektives Schlüsselmaterial übrigbleiben. Diese 56 Bit werden in 2 mal 28 Bit aufgeteilt, die in jeder der 16 Runden um 1 oder 2 Bit rotiert werden, insgesamt um 28 Bit, so dass am Ende wieder das Original vorliegt. Aus der Konkatenation der beiden Hälften wird in jeder Runde ein 48-Bit Rundenschlüssel ausgewählt. (Quelle: http://en.wikipedia.org/wiki/Image:DES-key-schedule.png) 15 3.2.2 Funktionsweise Die so gewonnenen Rundenschlüssel ki werden für die Runden der Feistelchiffre genutzt: E(k1 , k2 , ..., k16 , m) = c E(k16 , k15 , ..., k1 , c) = m D(k1 , k2 , ..., k16 , c) = E(k16 , k15 , ..., k1 , c) = m Jeder 64 Bit Eingabe-Block wird in zwei 32 Bit Blöcke (L und R) aufgeteilt und weiterverarbeitet. L und R werden in jeder Runde durch eine festgelegte Permutation E auf 48 Bit ausgedehnt, anschließend mit dem Rundenschlüssel verknüpft, mittels einer weiteren, rundenspezifischen, Permutation S wieder auf 32 Bit komprimiert und dann schließlich noch einer weiteren festgelegten Permutation P unterzogen: Li = Ri−1 Ri = Li−1 ⊕ f (Ri−1 , Ki ), wobei: f (Ri−1 , Ki ) = P(S (E(Ri−1 ) ⊕ Ki )) rechts: Feistelstruktur (Quelle: http://en.wikipedia.org/wiki/Image:DES-main-network.png) links: F Funktion (Quelle: http://en.wikipedia.org/wiki/Image:DES-f-function.png) 16 (Quelle: http://de.wikipedia.org/wiki/Bild:DES_resize.png) 3.2.3 Schwachstellen und Unsinnigkeiten • Die Anfängliche Permutation der Klartexteingabe sollte Softwareimplementation erschweren. Per Hardware ist diese sehr einfach, universell verwendbare Rechner hatten in den 70er Jahren jedoch noch Probleme mit so etwas. • Das Paritätsbit ist eine Schwachstelle, da es - soweit es gesetzt ist - ein Durchmustern des Speichers nach dem Schlüssel erlaubt. Gesucht wird dann nach dem relativ ungewöhnlichen Auftreten von 8 nahe bei einander liegenden Byte, bei denen je das letzte Bit die Parität angibt. 17 • Mit heutigen Rechnern ist es möglich einen 56-Bit Schlüssel mittels brute force zu knacken. Die Länge des Schlüssels ist bei DES aber auf diesen Wert festgelegt. • Es wird vermutet, dass die “magischen” S-Permutationen, über deren Qualität nichts bewiesen ist, eine Hintertür darstellen, da die NSA hierbei ihre Finger im Spiel hatte. Es konnte jedoch nie bewiesen werden. 3.2.4 spezielle Optionen bei openssl • Option -nopad: Schaltet Auffüllung der letzten Bits zu Block von 64 Bits aus. Auch wenn die Nachricht genau in 64 Bit Blöcken einteilbar ist, wird ein 64 Bit Padding Block angehängt. Der Block besteht aus x mal der Zahl x. So lässt er sich beim Entschlüsseln wieder entfernen. • Option -nosalt: Schaltet die Voranstellung des salt-Werts aus. Der salt-Wert verlängert die Nachricht um insgesamt 16 Bytes: Salted__ gefolgt von 8 Bytes salt-Wert. Aus Passwort und salt-Wert wird der Key für die eigentliche Verschlüsselung erzeugt. Damit wird verhindert, dass Schlüssel wegen Mehrfachverwendung von Passwörtern leichter zu brechen sind. Gleiche Passwörter beim Aufruf der Verschlüsselung mit OpenSSL führen durch den zufälligen salt-Wert zu verschiedenen Keys bei der Verschlüsselung. • Neben des gibt es auch des-ede und des-ede3. Diese bieten einen gewissen Schutz gegen Bruteforce-Angriffe: TDES (Triple DES), DES3, DES-EDE (Encrypt, Decrypt, Encrypt) mit effektiv 168 Bit E3DES (k1 , k2 , k3 , m) = EDES (k3 , DDES (k2 , EDES (k1 , m))) In OpenSSL arbeitet des-ede mit zwei Schlüsseln: E(K1 ), D(K2 ), E(K1 ) Um in OpenSSL 3 Schlüssel angeben zu können, muss man des-ede3 verwenden. Verwendet man bei des-ede zweimal oder bei des-ede3 dreimal den selben Schlüssel, erhält man eine einfache DES-Verschlüsselung. So kann man Abwärtskompatibilität erreichen. • In OpenSSL können DES Verschlüsselungen mit folgenden Befehlen aufgerufen werden: – – – – – – 18 -des -des-cbc -des-cfb -des-ecb -des-ede -des-ede-cbc – – – – – – – – – – -des-ede-cfb -des-ede-ofb -des-ede3 -des-ede3-cbc -des-ede3-cfb -des-ede3-ofb -des-ofb -des3 -desx -desx-cbc OpenSSL des-ecb -salt für den Schlüsseleintrag aus Passphrase passphrase = 123450 +0 S alt − Wert → K . . . 64 . . . 12345 → 2 Möglichkeiten . . . s Damit man keine Tabelle generieren kann, die aus den schwachen Schlüssel besteht, denn für 12345 gibt es 264 Möglichkeiten aufgrund des salts: (P, C12345 ) (P, C1234 ) .. . P- (Klartext) bekannt S- (Saltwert) bekannt C- (Chiffretext) unbekannt welcher Schlüssel wurde verwendet ? 1 12 → K 123 1234 s1 s2 s3 c1 c1 c1 c12 c12 c12 c123 c123 c123 c1234 c1234 c1234 Dazu kommt aber später noch mehr. 19 3.2.5 DES:ECB - Electronic Code Book Die Eingabe wird in Blöcke aufgeteilt und jeder Block für sich verschlüsselt. Dieses Verfahren ist potentiell unsicher, weil in der Abfolge der Blöcke eine Struktur enthalten ist, die der Algorithmus nicht verbirgt. Ein Fehler beim Ver- oder Entschlüsseln eines Blockes führt allerdings auch nur zu einem einzigen verlorenen Block. To do: Initialisierungsvektor?! (Quelle: http://en.wikipedia.org/wiki/Image:Ecb_encryption.png) (Quelle: http://en.wikipedia.org/wiki/Image:Ecb_decryption.png) Bem: Reicht für einen Block, dann wird auch kein Initialisierungsvektor benötigt. 20 Man kann für den Initialisierungsvektor auch einen vorher vereinbarten Wert (z.B. Unix Sekunden) wählen. Aus der Wikipedia (unter GNU Free Documentation License): Die 64-bit Klartextblöcke werden nacheinander und getrennt voneinander kontextfrei verschlüsselt. Dies ist die einfachste Anwendungsmöglichkeit eines Block-Chiffre. 3.2.6 DES:CBC - Cipher Block Chaining Aus der Wikipedia (unter GNU Free Documentation License): Vor der Verschlüsselung eines Klartextblockes wird der bereits verschlüsselte vorhergehende Block hinzuaddiert. Auf den ersten Klartextblock, der ja keinen Vorgänger besitzt, wird statt dessen ein Initialisierungsvektor, der geheim gehalten werden muss, addiert. Dadurch entsteht eine Verkettung (engl. chain) der Blöcke. Trotz dieser Verkettung ist die CBC-Verschlüsselung selbstkorrigierend“: Fehler/Manipulationen in einem Block wirken sich bei der Entschlüsse” lung nur auf den fehlerhaften/manipulierten und den nächsten Block aus. Man kann relativ einfach beliebige Blöcke des Geheimtextes einzeln entschlüsseln, da zusätzlich zum Schlüssel nur der vorhergehende (verschlüsselte) Block benötigt wird. Fehler im c breiten sich nicht aus beim Entschlüsseln. Ein Initialisierungsvektor IV für ersten Block wird benötigt. • Klartext ⊕ Cipher und dann Encryption • Vorteil: Muster im Klartext werden zerstört • Nachteil: Fehler im Ciphertext eines Blocks verändern Bits an genau der Stelle im folgenden Block (aber nur in diesem, spätere Blöcke sind nicht betroffen), so kann gezielt eine Stelle im Block angegriffen werden (siehe Skizze) To do: Skizze zur Fehlerausbreitung erläutern 21 m1 IV m∗2 m∗3 /⊕ ⊕ ⊕ ⊕ D D D DES DES DES DES c1 c2 c3 E ... c4 Vergleich DES:ECB und DES:CBC Zum Vergleich bietet es sich, an ein Bild (Abbildung 1) mit DES im ECB- und im CBC-Modus zu verschlüsseln: Deutlich zu erkennen ist, dass die Struktur im ECB-Modus (Abbildung 2) erhalten bleibt, während sie bei CBC (Abbildung 3) vollkommen zerstört wird. Abbildung 1: Bild im Klartext (24 Bit RGB mit 182 × 183 Pixeln) Abbildung 2: Bild aus Abbildung 1 ECB-verschlüsselt 22 Abbildung 3: Bild aus Abbildung 1 CBC-verschlüsselt 3.2.7 DES:OFB - Output Feed Back Aus der Wikipedia (unter GNU Free Documentation License): In diesem Modus werden die Klartextblöcke nicht direkt mit DES verschlüsselt, sondern DES erzeugt einen pseudozufälligen Bitstrom, der dann ohne Übertrag (vgl. XOR) auf den Klartext addiert wird. Dazu muss DES mit einem kontinuierlichen Eingabestrom gefüttert werden. Als Eingabe von DES dient hier ein Schieberegister, dass zunächst mit einem Initialisierungsvektor geladen wird. Anschließend wird immer ein Teil der Ausgabe von DES in dieses Register hineingeschoben und so als Eingabe wiederverwendet (daher output feedback). • Output der Encrpytion als Input für Encryption erzeugt Pseudozufallsstrom ⊕ Klartext • Vorteil: Beliebige Blockgrößen möglich, wie Stromchiffre verwendbar • Nachteil: Durchsatz verringert sich auf neue Blockgröße pro erzeugtem Block, kann aber vorberechnet werden • Vorteil: Ein Bit Fehler führt zu nur einem invertierten Bit nach der Entschlüsselung • Nachteil: Keine Selbstsynchronisierung möglich, wenn Bits komplett verloren gehen 23 (Quelle: http://de.wikipedia.org/wiki/Bild:Ofb_encryption.png) (Quelle: http://de.wikipedia.org/wiki/Bild:Ofb_decryption.png) 3.2.8 DES:CFB - Cipher Feed Back Aus der Wikipedia (unter GNU Free Documentation License): Identisch mit OFB, aber statt die Ausgabe des DES wieder als Eingabe zu verwenden, wird der Kryptotextstrom als Eingabe wiederverwendet. • Cipher als Input für Encryption erzeugt Pseudozufallsstrom ⊕ Klartext 24 • Vorteil: Beliebige Blockgrößen möglich, wie Stromchiffre verwendbar • Nachteil: Durchsatz verringert sich auf neue Blockgröße pro erzeugtem Block (Quelle: http://de.wikipedia.org/wiki/Bild:Cfb_encryption.png) (Quelle: http://de.wikipedia.org/wiki/Bild:Cfb_decryption.png) 3.2.9 CTR Mode, CCM Dieser Modus spielt für DES keine Rolle. Ist auch nicht in OpenSSL implementiert. Aber diese Betriebsart ist für 128 Bit Verschlüsselungen ist zum Beispiel vom BSI als sicher eingestuft worden. ’Die Betriebsart der Zukunft.’ Wird zum Beispiel für W-LAN Verschlüsselung verwendet. 25 Eingabe sind Klartext mit einen Zähler ctr0 ctr1 ctr2 ctr3 → → → → Block Block Block Block .. . → → → → ⊕T ⊕p1 ⊕p2 ⊕p3 → → → → c0 c1 c2 c3 ctrn → Block → ⊕pn → cn Standardisiert als ’SP 800-38c’. (N, A, P) mit N Zufallswerten, A Assoziierte Daten, P Klartext produziert Blöcke B0 , B1 , . . . , Br http://csrc.nist.gov/publications/nistpubs/800-38C/SP800-38C_updated-July20_ 2007.pdf To do: algorithmus überarbeiten / übersetzen 1. Apply the formatting function to (N, A, P) to produce the blocks B0 , B1 , . . . , Br . 2. Set Y0 = CIPHK (B0 ). 3. For i = 1 to r, do Yi = CIPHK (Bi ⊕ Yi−1 ). 4. Set T = MS BT len (Yr ). 5. Apply the counter generation function to generate the counter blocks Ctr0 , Ctr1 , . . . , Ctrm , where m = dPlen/128e . 6. For j = 0 to m, do S j = CIPHK (Ctr j ). 7. Set S = S 1 ||S 2 ||. . . ||S m . 8. Return C = P ⊕ MS BPlen (S ) || T ⊕ MS BT len(S 0) . T stellt einen Prüfwert dar. 3.2.10 TEA-Algorithmus To do: überarbeiten 26 Nicht in OpenSSL implementiert. Universitärer Algorithmus. (Quelle: http://de.wikipedia.org/wiki/Bild:TEA_InfoBox_Diagram.png) Man sieht die Feistel Idee, allerdings die grünen Quadrate sind Additionen modulo 64 Bit. To do: erläutern, Pfeilspitzen Es gibt ein Extended TEA, struktur recht ähnlich, aber beim Algorithmus an der Stelle... Byte: 0i ... ... 28 − 1 | ... ... 28 b · k = (b · k mod (28 + 1)) mod 28 Es gibt auch eine Inverse: b · K → c → c · k0 = b geht nur bei 22 + 1, 24 + 1, 28 + 1, 216 + 1 27 3.2.11 DES-X In OpenSSL: desx K, K1 , K2 EncK (m ⊕ K2 ) ⊕ K1 = DES − X(m) c1 ⊕ c2 = EncK (m1 ⊕ K2 ) ⊕ EncK (m2 ⊕ K2 ) Ist unsymetrisch. Hat sich nicht so ganz durchgesetzt... 3.3 IDEA: International Data Encryption Algorithm IDEA gilt als sehr sicher, ist schneller als DES bei Hardwareimplementation, tauchte zuerst als PES auf. Unterschied PES und IPES ist die untere XOR-Vertauschung (siehe Wikipedia Skizze), die es im PES nicht gab. War nur zur privaten Nutzung frei, ansonsten patentiert, weshalb er nicht so verbreitet war. IDEA verschlüsselt 64-Bit Eingabe-Blöcke in 64-Bit Ausgabe-Blöcke und verwendet dabei einen 128-Bit Schlüssel. Der Algorithmus basiert im wesentlichen auf 8 identischen Runden, die den Runden einer Feistel-Chiffre ähnlich sind und einer abschließenden Transformation der Ausgabe. In jeder Runde werden 6 16-Bit Subschlüssel, in der AusgabenTransformation weitere 4 davon verwendet. Sämtliche Subschlüssel werden aus dem Originalschlüssel berechnet. Die 64 Bit Eingabe jeder Runde werden dabei als 4 16-Bit-Blöcke verarbeitet. Der Algorithmus benutzt verschiedene algebraische Operationen: • Polynomaddition mod 2: XOR (blau-verbraucht wenig Strom) • Addition mod 216 : ADD (grün-verbraucht wenig Strom, etwas Zeit - Überlauf wird ignoriert) • Multiplikation mod |{z} 216 +1: MULT (rot-viel Strom) prim Aus der Wikipedia (unter GNU Free Documentation License): Der IDEA-Algorithmus (International Data Encryption Algorithm) wurde 1990 als ein Gemeinschaftsprojekt zwischen der ETH Zürich von James L. Massey und Xueija Lai, und der Ascom Systec AG entwickelt. IDEA ist ein symmetrischer Algorithmus und gehört zu den Blockchiffren. Der Algorithmus benutzt einen 128-Bit langen Schlüssel (DES nur 64 Bit, davon sind 8 Bits für den Paritäts-Check vorgesehen, so dass die eigentliche Schlüssellänge nur 56 Bits beträgt). Bei der Verschlüsselung wird der Klartext in 64 Bit große Blöcke unterteilt und der Schlüssel in Teilstücke zu je 16 Bit zerlegt. Die Verschlüsselung geschieht durch Kombina- 28 tion der logischen Operation XOR, der Addition modulo 216 und der Multiplikation modulo 216 +1. Die Kombination dieser drei Operationen aus unterschiedlichen algebraischen Gruppen soll ein hohes Maß an Sicherheit gewährleisten. Das Verfahren ist dazu optimiert, Angriffen durch differentielle Kryptoanalyse zu widerstehen. Es gibt bei IDEA leider eine ganze Reihe von schwachen Schlüsseln, die sich in zwei Klassen einteilen lassen. Die erste Klasse umfasst 232 schwache Schlüssel. Sie sind insofern schwach, als man sie mit gewähltem Klartext nachweisen kann. Danach ist ein Brute Force Angriff selbst für Privatpersonen mit älteren PCs machbar. Die zweite Klasse umfasst sogar 265 schwache Schlüssel. Bei diesen Schlüsseln kann man mit nur 20 gewählten Klartexten 72 Bit des Schlüssels ermitteln. Die restlichen 56 Bit muss man mit Brute Force ermitteln. Allerdings liegt die Wahrscheinlichkeit dafür einen schwachen Schlüssel zu erwischen bei eins zu 263 oder eins zu 9 Trillionen. Weil die Ascom Systec AG an der Entwicklung des Algorithmus beteiligt war, hält sie die Patente für IDEA. In Europa verfällt der Patentschutz am 16.05.2011. In den USA wird der Algorithmus bereits ein Jahr früher kostenlos nutzbar sein. Da das Patent in der Schweiz erteilt wurde, greift das Patent auch in Deutschland, unabhängig davon, dass in Deutschland Softwarepatente nicht legal sind. Der Algorithmus beruht wesentlich darauf, dass 216 + 1 eine Primzahl ist. Deshalb lässt sich IDEA nicht auf andere Blockläengen adaptieren. 3.3.1 Schlüsselauswahl Aus den 128 Bit des ursprünglichen Schlüssels werden in insgesamt 52 16-Bit Teilschlüssel erzeugt. Dabei werden aus dem aktuellen Schlüsselwert (initial der ursprüngliche 128-Bit Schlüssel) 8 der Teilschlüssel durch aufteilen gewonnen. Dann wird der aktuelle Schlüssel subsequent um 25 Bit nach links rotiert und so je ein neuer aktueller Schlüssel erzeugt, der wieder zu Teilschlüsseln aufgeteilt wird - solange bis alle Teilschlüssel belegt sind. Es werden 6 · 16-Bit in einer Runde verbraucht, in 8 Runden also 48 Teilschlüssel. Hinzu kommen 4 Teilschlüssel die nach der letzten Runde für weitere Operation verwendet werden. Insgesamt werden also 52 Teilschlüssel mit je 16-Bit aus 128-Bit Rohschlüssel erzeugt und auch verbraucht. → 832-Bit Schlüsselmaterial 3.3.2 Funktionsweise In jeder Runde r finden folgende Transformationen statt: 1. X1 = X1 MULT K1r , X4 = X4 MULT K4r , X2 = X2 ADD K2r , X3 = X3 ADD K3r 2. t0 = K5r MULT (X1 XOR X3 ), t1 = K6r MULT (t0 ADD (X2 XOR X4 )), t2 = t0 ADD t1 29 3. X1 = X1 XOR t1 , X4 = X4 XOR t2 , a = X2 XOR t2 , X2 = X3 XOR t1 , X3 = a Dabei sind X1 bis Xi die 16-Bit Blöcke die aus der 64 Bit Eingabe gewonnen wurden, Kir ist der Teilschlüssel mit der Nummer r · 6 + i. Die abschließende Transformation ergibt sich wie folgt: Y1 = X1 MULT K19 , Y4 = X4 MULT K49 , Y2 = X3 ADD K29 , Y3 = X2 ADD K39 Dabei sind die Yi 4 16-Bit Wörter, die die Ausgabe darstellen. (Quelle: http://de.wikipedia.org/wiki/Bild:International_Data_Encryption_Algorithm_InfoBox_Diagram.png) • In OpenSSL können IDEA Verschlüsselungen mit folgenden Befehlen aufgerufen werden: – – – – – -idea -idea-cbc -idea-cfb -idea-ecb -idea-ofb 3.3.3 Pseudocode-multiplikation To do: als Pseudocode machen? 30 if(a==0){return ((216 +1)-b) mod 216 } if(a==0){return ((216 + 1)-a) mod 216 } if(a · b) mod 216 > (a · b) div 216 { return (a · b) mod 216 − (a · b) div 216 } if(a · b) mod 216 ≤ (a · b) div 216 { return (216 + 1) + (a · b) mod 216 − (a · b) div 216 } wenn a==0 ⇒ a = 216 ≡ −1 mod 216 3.3.4 Schwachstellen Bei schlechter implementation können die XOR-Berechnungen am Stromverbrauch erkannt werden. Es können Rückschlüsse auf bestimmte Werte (insbesondere Null) gemacht werden. Nach 218 Testrechnungen kann der Klartext bestimmt werden. Solche Angriffe nennt man Seiten Kanal Atacken, in diesem Fall ist der Stromverbrauch der Seitenkanal (Zeitverbrauch spielt beim Idea keine Rolle). Bei guter Implementation gilt aber der Algorithmus als sicher. To do: Skizze Stromverbrauch? 3.4 Blowfish Blowfish ist eine sehr schnelle 64-Bit, 16-Runden Block-Chiffre, die 1993 von Bruce Schneier erfunden wurde. Die Länge der Schlüssel ist variabel zwischen 32 und 448 Bit. Als Teilschlüssel werden aus dem Ausgangsschlüssel eine P-Box mit 18 mal 32 Bit und 4 S-Boxen mit 256 mal 32 Bit generiert: (P1 , ..., P18 ), (S 1 , ..., S 4 ) Blowfisch Algorithmus von Bruc Schreier ist völlig Patentfrei, dies hat sehr zu seiner Verbreitung beigetragen. 31 F 14 weitere Runden F (Quelle: http://de.wikipedia.org/wiki/Bild:Blowfish_structure_(de).svg) P1 , . . . , P18 die XOR auf den Klartext kommen. Schlüssel: -P1 , . . . , P1 8 und -S-Boxen 32 (Quelle: http://en.wikipedia.org/wiki/Image:BlowfishFFunction.svg) S ist 256 32 Bit Werte ⇒ 4 · 256 · 32 Werte ⇒ kann man sich nicht merken, also wird P1 , . . . , P1 8, S 1 , . . . , S 4 werden als Hexadezimalwerte von π gewählt. (K)n ⊕ (P1 , . . . , P1 8) Der so initialisierte Algorithmus wird auf den Klartext 0, . . . , 0 angewendet. Das Ergebnis ersetzt | {z } 64 (P1 , P2 ). . . . Der so initialisierte Algorithmus wird auf den Klartext 0, . . . , 0 angewendet. Das Ergebnis | {z } 64 ersetzt (Pi , Pi+1 ). . . . Der so initialisierte Algorithmus wird auf den Klartext 0, . . . , 0 angewendet. | {z } Das Ergebnis ersetzt (S 1 , S 2 ). . . . 64 Auf kosten eines sehr aufwendigen Schlüsselmanagment wird ein schneller Algorithmus erreicht. Für Prozessoren mit wenig Speicher unpraktisch. 3.4.1 Initialisierung Teilschlüsselmanagement: Sehr viele Teilschlüssel werden aus wenig Schlüsselmaterial generiert. 1. P und S werden mit einer Hexadezimal-Expansion von Pi initialisiert. 2. Der Schlüssel, als Sequenz von 32-Bit-Werten wird mittels XOR auf die P-Box addiert, wobei er eventuell “wiederholt” wird, um die ganze Länge der Box abzudecken: P1 ⊕ K1 , P2 ⊕ K2 , ..., P18 ⊕ K18 3. Sowohl die P-Box als auch die S-Boxen werden verschlüsselt: 33 • Verschlüssle mit Blowfish den Nullstring → 64-Bit Ausgabe = 2 * 32-Bit = neue P1 , P2 • Verschlüssle mit Blowfish (Pi , Pi+1 ), die Ausgabe verwende als (Pi+2 , Pi+3 ). Wiederhole diesen Schritt für i von 1 bis zum Ende der P-Box. • Anschließend: S 1,0 , S 1,1 → S 1,2 , S 1,3 , .... Im gleichen Verfahren wie bei der P-Box werden die S-Boxen verschlüsselt. Insgesamt ist so ein langer Vorlauf nötig bevor die eigentliche Verschlüsselung der Daten beginnt. 3.4.2 Verschlüsselung In jeder Runde r (insgesamt 16 Runden) wird folgendes Verfahren angewendet: 1. Der 64-Bit Eingabeblock wird in zwei 32-Bit-Hälften L und R zerlegt. 2. L = L ⊕ Pr , R = R ⊕ f (L). f (L) ist dabei folgendermaßen charakterisiert: Zunächst wird das Argument L als Konkatenation von 4 8-Bit Vektoren a, b, c und d aufgefasst, die als natürliche Zahlen zwischen 0 und 255 verwendet werden. f (a, b, c, d) := ((S 1,a + S 2,b mod 232 ⊕ S 3,c ) + S 4,d mod 232 3. L und R werden vertauscht, konkateniert und als Eingabe für die nächste Runde verwendet. Nach der letzten Runde wird noch R = R ⊕ P17 und L = L ⊕ P18 durchgeführt. Aus der Wikipedia (unter GNU Free Documentation License): Blowfish ist ein sehr schneller und nicht patentierter Algorithmus, der besonders auf 32Bit-Prozessoren eine exzellente Performance bietet. Ein weiterer Vorteil ist seine variable Schlüssellänge von 32 bis zu 448 Bit. Die Blockgröße beträgt 64 Bit. • In OpenSSL können Blowfish Verschlüsselungen mit folgenden Befehlen aufgerufen werden: – – – – – – 34 -bf -bf-cbc -bf-cfb -bf-ecb -bf-ofb -blowfish 3.5 AES: Advanced Encryption Standard 3.5.1 Wiederholung-Byteoperation Wir hatten folgende Byteoperationen kennengelernt: • Multiplikation mod 256 bzw. mod 257 ohne 0 • Addition mod 256 • XOR-Addition (⊕) Die Operationen werden in der dementsprechenden Basisdarstellung modulo 256 durchgeführt. 3.5.2 Überblick AES wurde im Standard FIPS 197 festgeschrieben. Aus der Wikipedia (unter GNU Free Documentation License): AES ist, eine Block-Chiffre, dessen Blocklänge und Schlüssellänge unabhängig voneinander die Werte 128, 192 oder 256 Bit erhalten kann. Jeder Block wird zunächst in eine zweidimensionale Tabelle mit vier Zeilen geschrieben, dessen Zellen ein Byte groß sind. Die Anzahl der Spalten variiert somit je nach Blockgröße von 4 (128 Bit) bis 8 (256 Bit). Zum Beispiel für 16 Byte werden die Bytes wie folgt eingetragen: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 Jeder Block wird nun nacheinander bestimmten Transformationen unterzogen. Aber anstatt jeden Block einmal mit dem Schlüssel zu verschlüsseln, wendet AES verschiedene Teile des Schlüssels nacheinander auf den Klartext-Block an. Die Anzahl dieser Runden (r) variiert und ist von Schlüssellänge (k) und Blockgröße (b) abhängig: Je nach Blocklänge b und Schlüssellänge k wird die Anzahl der Runden bestimmt (10, 12 oder 14) r k=128 k=192 k=256 b=128 10 12 14 b=192 12 12 14 b=256 14 14 14 S-Boxen: Eine Substitutionsbox (S-Box) dient als Basis für eine monoalphabetische Verschlüsselung. 35 Sie ist meist als Array implementiert und gibt an, welches Byte wie getauscht wird. Die S-Box in AES basiert auf einem mathematischen Zusammenhang und ist somit fest im Algorithmus implementiert. Doch dies ist kein Schwachpunkt, da die S-Box lediglich zur Vermischung der Bytes in Kombination mit weiteren Operationen und dem Schlüssel genutzt wird. Ablauf: • Schlüsselexpansion (nach Fips-197 S.23 Kapitel 5.2) Der Schlüssel ’key’ wird auf den Anfang des expandierten Schlüssels ’w’ übernommen (i < Nk). Danach berechnet sich w[i] wie folgt: w[i − 1] i mod Nk , 0 w[i] = (1) S ubWord(RotWord(w[i − 1])) ⊕ Rcon i mod Nk = 0 S ubWord(w[i − 1]) Nk > 6i (mod N)k = 4 w[i] = w[i] ⊕ w[i − Nk] Der zugehörige Quelltext (Fips-197 entnommen): KeyExpansion(byte key[4*Nk], word w[Nb*(Nr+1)], Nk) begin word temp i = 0 while (i < Nk) w[i] = word(key[4*i], key[4*i+1], key[4*i+2], key[4*i+3]) i = i+1 end while i = Nk while (i < Nb * (Nr+1)] temp = w[i-1] if (i mod Nk = 0) temp = SubWord(RotWord(temp)) xor Rcon[i/Nk] else if (Nk > 6 and i mod Nk = 4) temp = SubWord(temp) end if w[i] = w[i-Nk] xor temp i = i + 1 end while end 36 (2) Für Beispiele siehe Fips-197 Appendix A.1 ... • Vorrunde – KeyAddition (XOR-des Rundenschlüssels) • Verschlüsselungsrunden – Substitution - Jedes Byte b wird ersetzt durch b0 = b1 wie bei Polynommultiplikation. Weiter wird jedes Byte als ein 8-dimensionaler Vektor aufgefasst und folgende Operation angewendet: 1 1 b1 1 b 2 1 .. = . 1 0 b8 0 0 0 1 1 1 1 1 0 0 0 0 1 1 1 1 1 0 0 0 0 1 1 1 1 1 1 0 0 0 1 1 1 1 1 1 0 0 0 1 1 1 1 1 1 0 0 0 0 1 1 1 1 b1 c1 1 b2 c2 · + 0 ... ... 0 b8 c8 0 0 – ShiftRow - Erste Zeil wird nicht verschoben, die zweite Zeil um eins, die dritte Zeile um zwei, die vierte um drei. (siehe Wikipedia) b1 b – MixColumn - Zu jeder Spalten 2 des Blocks wird folgende Polynommultiplikab3 b4 tion durchgeführt (b1 x3 + b2 x3 + b3 x + b4 ) · (03X 3 + 04X 2 + 01X + 02) mod (X 4 + 1) und die Koeffizienten in gleicher Weise wieder in die jeweilige Spalte eingetragen. Wobei (X 4 + 1) das Inverse (0BX 3 + 0DX 2 + 09X + DE) hat. – KeyAddition • Schlussrunde – Substitution – ShiftRow – KeyAddition Für die Entschlüsselung gehe die oben angegebene Reihenfolge rückwärts durch. Beachte dabei, dass ShiftRow und Subst vertauschbar sind. Bei ShiftRow wird in umgekehrter Weise verschoben. Ebenso sind KeyAdd und MultColumn vertauschbar, wenn der Rundenschlüssel modifiziert wird. (B(X) ∗ (S (X) ⊕ K(X)) = S (X) ∗ B(X) ⊕ B(X) ∗ K(X) also ist der modifiziert Schlüssel B(X) ∗ K(X)). Die Entschlüsselung entspricht also der Verschlüsselung mit modifizierten Schlüsseln. 37 3.5.3 mathematische Grundlagen Speziell der Schritt Mix-Column beinhaltet einige interessante mathematische Überlegungen. Er soll zu einer möglichst effektiven Vermischung der 32 Bit in jeder Spalte führen, die die Suche von dem unverschlüsselten Text ähnlichen Mustern im verschlüsselten Text erschwert. Dabei werden arithmetische Operationen aus zwei algebraischen Gruppen angewandt: 1. Die Gruppe der Bytes F28 : Jedes Byte b7 b6 ...b0 wird als ein Polynom b7 · X 7 + b6 · X 6 + ...b0 · X 0 angesehen. Diese Polynome können addiert und multipliziert werden. Damit dabei der Werteraum des Byte nicht verlassen wird, finden diese Operationen modulo m(X) = X 8 + X 4 + X 3 + X + 1 statt. m ist dabei irreduzibel, es gilt also ggT (b(X), m(X)) = 1 für jedes Byte b. Somit ist F 2 [X]/m(X) ein Körper und die Multiplikation ist abgeschlossen. Es gilt für jedes Paar von Bytes b, c eindeutig: b · c = d → d/c = b. Multiplikationen können also eindeutig rückgängig gemacht werden, so dass eine Entschlüsselung möglich ist. Bei Zahlen die größer als m(X) sind werden also durch die modulo Operation die Koeffizienten von x4 , x3 , x1 , x0 verändert. Beispiel in Magma: Q := IntegerRing(2); P<x> := PolynomialRing(Q); f:=xˆ7+1; g:=xˆ3+xˆ2+x+1; f*g; f*g mod(xˆ8 +xˆ4+xˆ3+x+1); IsPrime(xˆ8 +xˆ4+xˆ3+x+1); Ausgabe: xˆ10 + xˆ9 + xˆ8 + xˆ7 + xˆ3 + xˆ2 + x + 1 xˆ7 + xˆ6 + xˆ3 + xˆ2 + x true 4 : Die 4 Bytes einer Spalte w w w w werden wieder als Po2. Die Gruppe der Wörter F256 3 2 1 0 lynom aufgefasst: w3 · X 3 + w2 · X 2 + w1 · X + w0 . Diese können wieder multipliziert und addiert werden, wobei die arithmetischen Operationen auf den jeweiligen Bytes in F28 4 werden modulo M(X) = X 4 + 1 ausgeführt. M(X) ist stattfinden. Die Operationen in F256 zwar nicht irreduzibel, aber da der Algorithmus nur eine beschränkte Gruppe von Operanden verwendet, bleiben auch hier alle Operationen invertierbar. 4 ) nun jede Spalte mit c(X) = 3 · X 3 + X 2 + X + 2. Die so Mix-Column multipliziert (in F256 beschriebene lineare Funktion erreicht beweisbar eine große Diffusion der Eingabe. 38 • In OpenSSL können AES Verschlüsselungen mit folgenden Befehlen aufgerufen werden: – – – – – – – – – – – – – – – -aes-128-cbc -aes-128-cfb -aes-128-ecb -aes-128-ofb -aes-192-cbc -aes-192-cfb -aes-192-ecb -aes-192-ofb -aes-256-cbc -aes-256-cfb -aes-256-ecb -aes-256-ofb -aes128 -aes192 -aes256 3.6 RC4: Ron’s Cipher 4 Geheimes Chiffreverfahren mit Strom-Chiffre von Ron Rivest, 1987 Entstehungsjahr, 1994 im Netz aufgetaucht, 1999 tauchte im Internet ein Draft ARCFOUR (ARC4) auf, der die gleichen Ergebnisse lieferte Byte orientiert zwei Bytes m, k dann wird berechnet: m⊕k =c Der Algorithmus basiert auf S-Boxen (Permutationen) —— Skizze Seite 2b ganz oben ??? PRG (Pseudo Random Generator) —— weitere Skizze??? Initialisierung: K = L Bytes als Schlüssel s[i] = i (identische Permutation) L = 1...255 für RC4 mit 40-Bit: L = 5, mit 64-Bit: L = 8, mit 128-Bit: L = 16 j = 0 für i = 0...255 → j = ( j + s[i] + K[ j mod L]) mod 256 Problem: K-Masterkey → salted key, Initialwert (frei, bekannt), HashInitial (K) = Kaktuell → RC4 39 Anfangsstücke von PRG RC4 sind nicht richtig zufällig“, verraten viel über Kaktuell ” Regel für RC4: Die ersten 256-Byte wegschmeißen Aus der Wikipedia (unter GNU Free Documentation License): RC4 (Ron’s Cipher 4) ist ein für Software optimierter Stromchiffrierer, welcher zur Verschlüsselung von Daten eingesetzt wird. Er wurde 1987 von Ronald L. Rivest für RSA Data Security Inc. (heute RSA Security) entwickelt. Der Algorithmus war sieben Jahre lang geheim (“security by obscurity”), bis 1994 der Quellcode anonym veröffentlicht wurde. RC4 hat, im Gegensatz zu DES, eine variable Schlüssellänge. Die Schlüssellänge kann bis zu 2048 Bit betragen. RC4 verschlüsselt immer ein Byte auf einmal. Er besteht aus einer so genannten S-Box, die sich während der Verschlüsselung fortlaufend ändert. Diese wird durch ein Passwort initialisiert, das für jede Verschlüsselung einmalig sein muss. Jedes Klartextzeichen wird XOR mit einem bestimmten, vom Paßwort abhängigen, Zeichen aus der S-BOX verknüpft. Theoretisch sind somit ca. 2 hoch 1700 verschiedene Zustände möglich. Der Algorithmus ist sehr kompakt und fünf- bis zehnmal schneller als der weitverbreitete DES. Deshalb findet der RC4 Algorithmus in einigen Echtzeit-Systemen Anwendung, wie beispielsweise Mobilfunk (Cellular Digital Packet Data), SSH (Secure Shell), WLAN (Wireless LAN) oder den Dateiverschlüsselungs-Programmen SecurePC und Cryptext. Die Verarbeitungsgeschwindigkeit des DES ist jedoch selbst in kleinsten Mikrokontrollern meist ausreichend. Der Schlüssel beim DES und anderen Blockchiffren wie dem AES (CBC-Mode) kann im Gegensatz zum RC4 auch mehrfach verwendet werden. Vergleichbare Stromchiffren wie SEAL sind vergleichbar schnell und gelten als sicher. Aus der Wikipedia (unter GNU Free Documentation License): übersetzt aus dem Englischen, nach http://en.wikipedia.org/wiki/RC4 RC4 (oder ARCFOUR) ist die am weitesten verbreitete Stromchiffre und wird in vielen bekannten Protokollen, beispielsweise SSL oder WEP, verwendet. Trotzdem entspricht RC4 nicht mehr dem heutigen Sicherheitsstandard und manche Verwendungsweisen von RC4 führen zu sehr unsicheren Kryptosystemen (z.B. WEP). Daher wird es nicht für die Verwendung in neuen Systemen empfohlen. Allerdings gibt es auch RC4-basierte Systeme die sicher genug für den praktischen Gebrauch sind. 3.6.1 Geschichte Aus der Wikipedia (unter GNU Free Documentation License): übersetzt aus dem Englischen, nach http://en.wikipedia.org/wiki/RC4 RC4 wurde 1987 von Ron Rivest von RSA Security erfunden. Offiziell bedeutet die Abkürzung 40 “Rivest Cipher 4”, alternativ wird sie aber als “Ron’s Code” verstanden (s. auch die anderen RC?-Algorithmen). Zunächst war RC4 ein Betriebsgeheimnis, jedoch wurde im September 1994 eine Beschreibung anonym auf der “Cypherpunks” Mailingiste gepostet. Es wurde bald in die sci.crypt newsgroup weitergepostet und von dort auf viele Internet-Seiten verbreitet. Nachdem der Algorithmus nun bekannt ist, ist er kein Betriebsgeheimnis mehr. Der Name “RC4” unterliegt jedoch weiterhin dem Markenschutz. Zur Zeit sieht es so aus, als seien “inoffizielle” Implementationen zwar legal, können aber nicht den Namen “RC4” verwenden. Um dieses Problem zu umgehen wird RC4 oft als “ARCFOUR” bezeichnet. RC4 wird inzwischen in einigen weit verbreiteten Verschlüsselungsprotokollen und Standards, unter anderem WEP und WPA für WLAN Karten und SSL, verwendet. 3.6.2 Beschreibung Aus der Wikipedia (unter GNU Free Documentation License): übersetzt aus dem Englischen, nach http://en.wikipedia.org/wiki/RC4 RC4 generiert einen pseudo-zufälligen Bitstrom (einen “Schlüsselstrom”), der bei der Verschlüsselung mit dem Klartext mittels XOR verknüpft wird. Die Entschlüsselung funktioniert genauso. Um den Schlüsselstrom zu generieren benutzt die Chiffre einen internen Zustand, der aus zwei Teilen besteht: 1. eine Permutation aller 256 möglichen Bytes (wird im Folgenden als S bezeichnet) 2. zwei 8-Bit Index-Zeiger (mit i und j bezeichnet) Die Permutation wird mit einem Schlüssel von variabler Länge, üblicherweise zwischen 40 und 256 Bit, initialisiert, wobei der Schlüsselerzeugungs-Algorithmus verwendet wird. Anschließend wird der Bit Strom durch den Pseudo-Zufalls-Algorithmus generiert. 3.6.3 Der Pseudo-Zufalls-Algorithmus Aus der Wikipedia (unter GNU Free Documentation License): übersetzt aus dem Englischen, nach http://en.wikipedia.org/wiki/RC4 In jeder Iteration wird der Zustand verändert und ein Byte des Schlüsselstroms ausgegeben. Dabei wird i inkrementiert, der Wert von S an der Stelle i auf j addiert, S [i] und S [ j] vertauscht und der Wert von S an der Stelle S [i]+S [ j] mod 256 ausgegeben. Jeder Wert von S wird dabei mindestens einmal alle 256 Iterationen vertauscht. In Pseudocode lässt sich der Algorithmus folgendermaßen darstellen: i := 0 j := 0 41 while GeneratingOutput: i := (i + 1) mod 256 j := (j + S[i]) mod 256 swap (S[i], S[j]) output (S[(S[i] + S[j]) mod 256]) (Wobei i öffentlich ist und j geheim ist) j i 0 1 2 S[i]+S[j] i j 253 254 255 S S[i] K S[j] S[i]+S[j] (Quelle: http://de.wikipedia.org/wiki/Bild:RC4.svg) 3.6.4 Der Schlüsselerzeugungs-Algorithmus Aus der Wikipedia (unter GNU Free Documentation License): übersetzt aus dem Englischen, nach http://en.wikipedia.org/wiki/RC4 Der Schlüsselerzeugungs-Algorithmus wird benutzt, um die Permutation in S zu initialisieren. l wird als die Zahl der Bytes des Schlüssels definiert und kann zwischen 1 und 255 liegen, üblicherweise liegt l zwischen 5 und 32, so dass eine Schlüssellänge von 40 bis 128 Bit zustande kommt. Zunächst wird S mit der Identitätspermutation initialisiert. Anschließend wird S in 256 Iterationen mit einem Algorithmus, der dem Pseudo-Zufalls-Algorithmus ähnelt aber zusätzlich die Schlüsselbits hineinmischt, weiterverarbeitet. Der folgende Pseudocode drückt dies aus: for i from 0 to 255 S[i] := i j: = 0 for i from 0 to 255 42 j := (j + S[i] + key[i mod l]) mod 256 swap(S[i],S[j]) 3.6.5 Implementation Aus der Wikipedia (unter GNU Free Documentation License): übersetzt aus dem Englischen, nach http://en.wikipedia.org/wiki/RC4 Viele Stromchiffren basieren auf “linear feedback shift registers” und sind damit sehr effizient in Hardware aber weniger effizient in Software implementierbar. RC4 hat dieses Manko nicht und kommt zudem ausschließlich mit 8-Bit Operationen aus. Damit ist RC4 ideal für SoftwareImplementationen. 3.6.6 Sicherheit Aus der Wikipedia (unter GNU Free Documentation License): übersetzt aus dem Englischen, nach http://en.wikipedia.org/wiki/RC4 RC4 verfehlt die üblichen Standards für sichere Chiffren an mehreren Stellen und wird somit nicht zur Verwendung in neuen Anwendungen empfohlen. Der von RC4 generierte Schlüsselstrom tendiert dazu, bestimmte Sequenzen von Bytes häufiger zu enthalten als andere und ist somit nicht wirklich zufällig. Der beste Angriff, der auf diesem Sachverhalt beruht, wurde von Fluhrer und McGrew entdeckt und kann aus einem Gigabyte verschlüsseltem Text den Schlüsselstrom berechnen. Zudem verwendet RC4 keine “nonce”, einen für jeden Klartext neu generierten Zusatzschlüssel. Eine solche “nonce” wird im allgemeinen als zentrales Sicherheitskriterium betrachtet, da so gewährleistet ist, dass eine zweimal nacheinander verschlüsselte Nachricht zwei verschiedene verschlüesselte Texte erzeugt. Natürlich kann eine solche “nonce” im Nachhinein aufgesetzt werden indem als RC4-Schlüssel nicht der eigentliche Benutzerschlüssel sondern beispielsweise ein Hashwert des Schlüssels mit einer nonce verwendet wird. Die einfachere Methode, den Schlüssel nur mit der nonce zu konkatenieren, die von einigen Anwendungen genutzt wird, führt aufgrund des schwachen SchlüsselerzeugungsAlgorithmus wieder zu neuen Problemen. To do: anmerkungen zu k=1-Angriffsmöglichkeiten 43 3.6.7 Fluhrer, Mantin und Shamir Angriff Aus der Wikipedia (unter GNU Free Documentation License): übersetzt aus dem Englischen, nach http://en.wikipedia.org/wiki/RC4 2001 wurde eine erstaunliche Entdeckung gemacht: Die statistische Verteilung der ersten paar Bytes des Schlüsselstroms ist über alle RC4-Schlüssel stark nicht-zufällig und enthält Informationen über den Schlüssel selbst. Falls die nonce lediglich mit dem Schlüssel konkateniert wurde (oder gar keine nonce verwendet wurde) kann der Schlüssel durch die Analyse einer großen Zahl verschlüsselter Nachrichten herausgefunden werden. Mit Hilfe dieses Sachverhaltes und einiger damit zusammenhängender Effekte wurde dann die WEP-Verschlüsselung (“wireless equivalent privacy”), die in 802.11 WLAN-Netzen verwendet wird, gebrochen. Dies führte zu einer Suche nach einem Ersatz für WEP und letztlich zu den Bemühungen um 802.11i sowie zu WPA. Der geschilderte Angriff kann natürlich umgangen werden, wenn die ersten (ca. 256) Bytes des Schlüsselstroms verworfen werden. • In OpenSSL können RC4 Verschlüsselungen mit folgenden Befehlen aufgerufen werden: – -rc4 – -rc4-40 3.7 RC5: Ron’s Cipher 5 Die zentrale Neuerung des RC5-Algorithmus sind datenabhängige Rotationen, bei denen ein Zwischenergebnis um eine Zahl von Bytes rotiert wird, die weder fest vorgegeben noch vom Schlüssel bestimmt, sondern aus einem Teil des Klartextes berechnet ist. Diese Operation wird folgendermaßen notiert: a <<< b bedeutet, dass a um b Bits nach links rotiert wird. Ein weiterer interessanter Aspekt ist die universelle Parametrisierbarkeit des Algorithmus: Sowohl die Länge der Wörter w als auch die Zahl der Runden r und die Länge des Schlüssels b sind wählbar, so dass der Algorithmus offen ist für zukünftige Bedürfnisse; die weitere Operation + wird nun als Addition modulo 2w definiert. In openssl ist RC5 mit den Parameters w = 32, r = 12, b = 16 implementiert. Sämtliche Algorithmen gehen im folgenden von einer little-endian Byte-Anordnung aus. Der Algorithmus besteht aus einem Verschlüsselungs- und einem Schlüsselexpansions-Teil: 3.7.1 Verschlüsselung Gegeben ein auf t = 2(r + 1) Wörter expandierter Schlüssel S und ein aus zwei Wörtern A und B bestehender Eingabeblock, gibt folgender Pseudocode den Verschlüsselungs-Algorithmus an: 44 A = A + S[0] b = B + S[1] for i = 1 to r do: A = ((A XOR B) <<< B) + S[2i] B = ((B XOR A) <<< A) + S[2i + 1] Die Entschlüsselung läuft dementsprechend folgendermaßen ab: for i B A A = A B = B = = = - r downto 1 do: ((B - S[2i + 1]) >>> A) XOR A ((A - S[2i]) >>> B) XOR B S[0] S[1] 3.7.2 Schlüsselexpansion Zunächst wird S mit einer Kombination aus e und ϕ (dem goldenen Schnitt) initialisiert und der Schlüssel in ein Array L kopiert, das wortweise indiziert wird. Anschließend wird mit folgendem Algorithmus der Schlüssel in S hinein gemischt: i = j = 0 A = B = 0 do 3 * max(t, 8b/w) times: A = S[i] = (S[i] + A + B) <<< 3 B = L[j] = (L[j] + A + B) <<< (A + B) i = (i+1) mod t j = (j+1) mod (8b/w) 3.8 GOST 28147-89: Gosudarstvennyi Standard Soyuza SSR, nicht in OpenSSL GOST ist das russische Normungsinstitut, vergleichbar mit DIN oder ANSI. (siehe auch: http://en.wikipedia.org/wiki/GOST_(block_cipher)) Gost-Chiffre ist eine relativ simple Feistel-Chiffre auf 64 Bit mit 32 Runden, 256 Bit Schlüssellänge und 8 S-Boxen von zusammen 512 Bit, die - da sie geheim gehalten werden können - als Schlüsselerweiterung gelten können. Die Rundenfunktion besteht aus der Addition eines 32Bit-Substrings des Schlüssels, der Anwendung der S-Boxen (parallel, da jede S-Box 4 Bit als Ein- und Ausgabe hat) und einer 11-Bit-Rotation. Die Sicherheit des Algorithmus beruht auf 45 der Verwendung sehr langer Schlüssel, geheimer S-Boxen und der gegenüber DES verdoppelten Rundenzahl. In jeder einzelnen Runde wird jedoch ein geringerer Durchmischungseffekt erreicht als bei DES-Runden. Geheimer Algorithmus, S-Boxen auch geheim (Quelle: http://en.wikipedia.org/wiki/Image:GOSTDiagram.png) 46 Feistel Chiffre Addition, Substitution, Rotation Die S-Boxen sind Gruppenschlüssel, die extra zugewiesen werden. 16 4 Bit Werte werden Permutiert. 32 Runden. Schlüsselmaterial 32 die 256 Bit werden jeweils in 8 32 Bit Unterschlüssel eingeteilt, wobei die Schlüssel wie folgt verwendet werden: 1234567123456712345677654321 (Dann einmal S-Box, einmal rotieren und dann Feistelschritt) Die Sicherheit steckt in den 32 Runden. Der Algorithmus wurde bisher nicht geknackt. 3.9 Fazit:Wie könnte bei einen Symmetrischen Algorithmus die Sicherheit erhöhen?? (Das wäre z.B. für eine Interessante Frage für eine Klausur) • komplexes Schlüsselmanagment • viele Runden • komplexe vermischung pro Runde (AES) 4 Asymmetrische Verschlüsselungsverfahren 4.1 Einführung Alice,Bob, Chris, Dave, Eve... Alice kA Enck1 (M) = C −→ Bob kA M = Deck2 Verschlüsselungsverfahren kA , kB , Enc, Dec Aus kA kann kB nicht bestimmt werden, dann kann kA sogar öffentlich sein. Ziel ist es, dass je- 47 der verschlüsseln kann, aber nur einer kann (in realistischer Zeit) entschlüsseln. Solche Verfahren mit öffentlichen Schlüssel werden auch asymmetrisch genannt. Mit großen Aufwand kann natürlich der Schlüssel immer noch bestimmt werden: Man wählt einen Text m0 Verschlüsselt ihn (Enck (m0 ) = c0 ) und probiert dann solange alle k durch, bis man Deck (c0 ) = m0 erhält Das kB kann aber immer bestimmt werden: for k_B =00000... to FFFF... M_0 C_0 sind gegeben Dec_{k_B}(C_0) ?= M_0 Wichtig ist nur das dies nicht in ’vernünftiger’ Zeit gemacht werden kann. To do: text sortieren Klartext −→ E(K) Chiffretext Klartext D(K 0 ) ←− Chiffretext E(K, p) = c und zu jedem K∃K 0 mit D(K 0 , c) = p und K wird öffentlich gemacht Die Berechnung von K 0 aus K ist schwer, Bruteforce ist nicht ausgeschlossen, die Bestimmung von K aus K 0 ist leicht leicht: EnckA , DeckB , (kA , kB )−Erzeugung schwer: aus kA allein kB erzeugen 4.1.1 Beispiel Bob möchte von Alice verschlüsselte Nachrichten lesen. Bob überlegt sich ein asymmetrisches Verfahren, wählt K 0 , berechnet K und veröffentlicht K. Alice nimmt K, berechnet E(K, p) = c und sendet c an Bob. Bob berechnet aus c mit K 0 das ursprüngliche p. 4.2 Geschichte Whitfield, Diffie New Directions in Cryptographie. Idee wurde auch schon mal von Ralf Merkel veröffentlich, Britische Geheimdienst hatt vorher die Idee auch schon mal... 48 Aus der Wikipedia (unter GNU Free Documentation License): Asymmetrische Verfahren sind ein relativ neues Gebiet der Kryptografie. Eine wichtige Vorarbeit für die asymmetrischen Verfahren sind die Arbeiten von Whitfield Diffie, Martin Hellman und Ralph Merkle zum geheimen Schlüsselaustausch Anfang der 1970er Jahre. Im Sommer 1975 veröffentlichten Diffie und Hellman eine Idee zur asymmetrischen Verschlüsselung, ohne jedoch ein genaues Verfahren zu kennen. Anfang der 1970er Jahre wurden von Ellis, Cocks und Williamson ein dem späteren Verfahren von Diffie-Hellman ähnliches asymmetrisches Verfahren entwickelt, welches aber in seiner wirtschaftlichen Bedeutung nicht erkannt und aus Geheimhaltungsgründen nicht (wissenschaftlich) publiziert und auch nicht zum Patent angemeldet wurde. Alle drei waren Mitarbeiter des englischen Government Communications Headquarters. Der Durchbruch gelang Ronald L. Rivest, Adi Shamir und Leonard M. Adleman, die 1977 das RSA-Verfahren entwickelten. Es gilt bis heute als sicheres Verfahren und hat außerdem den großen Vorteil, in beiden Richtungen eingesetzt werden zu können. 4.3 Einige Theoretische Grundlagen 4.3.1 Kleiner Fermat (oder kleiner Fermat’scher Satz) Für beliebige Primzahlen p gilt: n(p−1) = 1 mod p für alle n ∈ Z To do: Wikipedia verlinken 4.3.2 Euklidischer Algorithmus To do: ergänzen..., Erweiterter Euklidischer Algorithmus, fehlerhaft?! Aus der Wikipedia (unter GNU Free Documentation License): Beschreibung durch Pseudocode: Im Folgenden wird der moderne Euklidische Algorithmus sowohl in einer rekursiven, als auch einer iterativen Variante beschrieben. Dabei sind a und b jeweils die beiden Zahlen deren größter gemeinsamer Teiler berechnet werden soll. Rekursive Variante: 49 EUCLID(a,b) 1 wenn b = 0 2 dann return a 3 sonst return EUCLID(b, a mod b) Iterative Variante: EUCLID(a,b) 1 solange b != 0 2 r = a mod b 3 a = b 4 b = r 5 return a Funktionsweise: In jedem Schritt des Algorithmus wird eine Division mit Rest ausgeführt. ri−1 = qi+1 · ri + ri+1 0 ≤ ri+1 < ri Die Division mit Rest hat die Eigenschaft, dass ggT(ri−1 , ri ) = ggT(ri , ri+1 ) gilt. Im letzten Schritt des Algorithmus rn−1 = qn+1 · rn + 0 ist rn+1 = 0 und es gilt deshalb ggT(rn−1 , rn ) = ggT(rn , 0) = rn Da im ersten Schritt ri−1 = a und ri = b war, ist ggT(a, b) = rn (Quelle: http://de.wikipedia.org/wiki/Euklidischer_Algorithmus) (Denn es gilt ggT(a, b) = ggT(b, r)) Aus der Wikipedia (unter GNU Free Documentation License): ... Man kann diese Rekursion in folgende Abfolge von Schritten für den erweiterten euklidischen Algorithmus fassen: Erhalte ”a” und ”b” als Eingabe. Setze ”k=0”, r0 = a, r1 = b, s0 = 1 und s1 = 0. Wiederhole: Erhöhe ”k” um eins. Bestimme den ganzzahligen Quotienten qk = rk−1 div rk . Setze rk+1 = rk−1 − qk · rk und sk+1 = sk−1 − qk · sk . bis rk+1 = 0 gilt. Gib den Rest rk = ggT(a, b) und die Zahl sk mit ggT(a, b) ≡ sk · a (mod b) zurück. Jeder Schritt enthält implizit auch einen Multiplikator tk = (rk − sk · a) div b, wobei diese Division keinen Rest lässt. Die Folge (tk )k kann auch explizit bestimmt werden, es gelten t0 = 0, t1 = 1 und :tk−1 ≡ qk ·tk +tk+1 . Nach dem letzten Schritt ergibt sich nun ggT(a, b) = sk ·a+tk ·b Der Übersicht halber werden beim händischen Rechnen auch noch die Hilfsfolgen (ak = rk−1 )k und (bk = rk )k sowie (uk = sk−1 )k sowie (vk = tk−1 )k mitgeführt. ... 50 Zur Berechnung des Inversen modulo einer Restklasse benötigt man die tk aber nicht und kann sie ignorieren. Aus der Wikipedia (unter GNU Free Documentation License): ... Rekursive Variante Für den erweiterten euklidischen Algorithmus existiert auch eine rekursive Variante, die durch den folgenden Pseudocode gegeben ist: a,b: zwei Zahlen für die der erweiterte euklidische Algorithmus durchgeführt wird ”extended euclid”(a,b) 1 ”’wenn”’ b = 0 2 ”’dann return”’ (a,1,0) 3 (d’,s’,t’) ← ”extended euclid”(b, a mod b) 4 (d,s,t) ← (d’,t’,s’ - floor(a/b)t’) 5 ”’return”’ (d,s,t) .. (Quelle: http://de.wikipedia.org/wiki/Erweiterter_euklidischer_Algorithmus) Wenn n mod m teilerfremd sind, dann existiert so ein Exponent f so dass nf ≡ 1 mod m ist. Wenn m = m1 · m2 ein Produkt von zwei verschiedenen Primzahlen ist, dann ist für alle n die zu m teilerfremd sind: n(m1 −1)·(m2 −1) ≡ 1 mod m Denn es ist nm1 −1 ≡ 1 mod m1 und nm2 −1 ≡ 1 mod m2 . Dann ist n(m1 −1)·(m2 −1) − 1 durch m1 und m2 teilbar. Denn nach dem Chinesischen Restsatz gilt n(m1 −1)·(m2 −1) ≡ 1 mod m1 · m2 und wenn eine Zahl durch m1 · m2 teilbar ist, so auch durch m1 und m2 . 4.3.3 Beispiel In Magma: p:=17; q:=23; m:=(p-1)*(q-1); e:=19; F:=IntegerRing(m); 51 d:=(F!e)ˆ(-1); d:=IntegerRing()!d; 19*315 div 16; 19*315 -374 *16; n:=p*q; K:=IntegerRing(n); N:=100; C:=(K!N)ˆ(e); //Verschlüsseln C; Cˆd; 10019 ≡ 349 mod 349 349352 ≡ 100 mod 391 10019·315 = 100 mod 17 10019·315 = 100 mod 23 10019·315 ≡ 100374·16+1 mod 17 ≡ 100 · (10016 )374 mod 17 | {z } =1 To do: Analog von Mathias kopieren To do: Wiederholung einsortieren... Wiederholung: Nachricht n ne ≡ c( mod m) Chiffre c cd ≡ (ne )d = nd·e = n1+k(p−1)(q−1) = n · (n(p−1)(q−1) )k ≡ n · 1k = n mod m | {z } =1 −→ −→ n d, m c e, m n 52 aus (e, m) kann man (d, m) nicht leicht bestimmen, weil man die Zerlegung m = p · q nicht kennt. Wer p, q kennt, kann aus den einen den anderen Schlüssel berechnen. Wer d,e kennt kann p,q bestimmen. Verschlüsselung kann jeder ausführen: öffentlicher Schlüssel (e, m) Entschlüsselung bleibt dem vorbehalten der das geheime d (oder auch p,q) kennt. schnelles Potenzieren Ist die Berechung von ne , ck ausreichend schnell? m 1000 Bit p,q-150 Dezimalstellen ne hat sehr sehr viele Dezimalstellen Deshalb berechnet man erst modulo und potenziert dann mit e: (n mod m)e (c mod m)d Beispiele n19 = | n · n{z · . . . · }n oder man rechnet: 19 Multiplikationen n, n2 , n4 , n8 , n16 4 Quadrierungen n16 · n2 · n = n1 9 so auch bei n1025 = n, n2 , . . . , n1024 , n · n1024 wo nur 11 Multiplikationen gebraucht werden. Pseudocode: n,e,x=1; repeat { if (e = 1 mod 2)x = x · n(0 mod m0 ); n = n2 (0 mod m0 ); e = ediv2; } until e==1; k = (n0 )0 · x0 x = k = ne 53 4.4 RSA: Rivest, Shamir, Adleman Bei dem Versuch die Idee der Asymmetrischen Kryptografie zu wiederlegen wurde RSA entwickelt: RSA beruht auf der Schwierigkeit n = p · q in seine Primfaktoren zu zerlegen. Verschlüsseln und Entschlüsseln ist Potenzieren modulo n: D ◦ E = id p = (pe )d mod n p = pe·d mod n e·d =1 mod (p − 1) · (q − 1) E(e, n) ist öffentlich und D(d, n) geheim. Die Bestimmung von e, d, n aus p, q ist leicht. Genauer: Die Bestimmung von e aus (d, n) ist leicht, die Bestimmung von d aus (e, n) ist schwer, weil Faktorisierung n = p · q (vermutlich) schwierig ist, ist Bestimmung von d aus (e, n) auch schwer. Wer p und q aus n berechnen kann, kann auch d bestimmen (Euklid). Wer e und d kennt kann p und q bestimmen. (dazu waren Erläuterungen in der Vorlesung) 4.4.1 Funktionsweise des RSA-Verfahrens (nach www.cryptool.de/downloads/CrypToolScript 1 3 04 de.pdf) Man kann die Einzelschritte zur Durchführung des RSA-Verfahren folgendermaßen beschreiben. Schritt 1 bis 3 sind die Schlüsselerzeugung, Schritt 4 ist die Verschlüsselung, 5 die Entschlüsselung: 1. Wähle zufällig 2 verschiedene Primzahlen p und q und berechne n = p · q. Der Wert n wird als RSA-Modul bezeichnet. 2. Wähle zufällig e ∈ {2, ..., n − 1}, so dass gilt: e ist teilerfremd zu J(n) = (p − 1) · (q − 1). Zum Beispiel kann man e so wählen, dass gilt: max(p, q) < e < J(n) − 1. Danach kann man p und q “wegwerfen”. 3. Wähle d ∈ {1, ..., n − 1} mit e · d = 1 mod J(n), d.h. d ist die multiplikative Inverse zu e modulo J(n). Danach kann man J(n) “wegwerfen”. • (n, e) ist der öffentliche Schlüssel P. • (n, d) ist der geheime Schlüssel S (es ist nur d geheim zu halten). 4. Verschlüsselung des Klartextes (bzw. seiner Blöcke) M ∈ 1, ..., n − 1: C = E((n, e); M) := M e 54 mod n 5. Entschlüsselung des Chiffretextes (bzw. seiner Blöcke) C ∈ 1, ..., n − 1: M = D((n, d); C) := C d mod n 4.4.2 Beweis der Funktionsweise (nach www.cryptool.de/downloads/CrypToolScript 1 3 04 de.pdf) Für Schlüsselpaare (n, e) und (n, d), die die in den Schritten 1 bis 3 des RSA-Verfahrens festgelegten Eigenschaften besitzen, muss für alle M < n gelten: M ≡ (M e )d mod n wobei (M e )d = M e·d . Das heißt, der oben angegebene Dechiffrieralgorithmus arbeitet korrekt. Wir zeigen das in 3 Schritten. 1. Im ersten Schritt zeigen wir: M e·d ≡ M mod p. Dies ergibt sich aus den Voraussetzungen und dem Satz von Fermat. Da n = p · q und J(p · q) = (p − 1) · (q − 1) und da e und d so gewählt sind, dass e · d ≡ 1 mod J(n), gibt es eine ganze Zahl k, so dass gilt: e · d = 1 + k · (p − 1) · (q − 1) M e·d ≡ M 1+k·J(n) ≡ M · M k·J(n) ≡ M · M k·(p−1)·(q−1) ≡ M · (M p−1 )k·(q−1) mod p mod p (aufgrund des kleinen Fermat : M p−1 ≡ 1 mod p) ≡ M · (1)k·(q−1) ≡M mod p mod p Die Voraussetzung für die Anwendung des kleinen Fermat war, dass M und p teilerfremd sind. Da das im allgemeinen nicht gilt, müssen wir noch betrachten, was ist, wenn M und p nicht teilerfremd sind: da p eine Primzahl ist, muss dann notwendigerweise p ein Teiler von M sein. Das heißt aber: M ≡ 0 mod p Wenn p die Zahl M teilt, so teilt p erst recht M e·d . Also ist auch: M e·d ≡ 0 mod p Da p sowohl M als auch M e·d teilt, teilt es auch ihre Differenz: (M e·d − M) ≡ 0 mod p. Und damit gilt auch in diesem Spezialfall unsere zu beweisende Behauptung. 2. Völlig analog beweist man: M e·d ≡ M mod q. 3. Nun führen wir die Behauptungen der ersten beiden Schritte zusammen für n = p · q, um zu zeigen: M e·d ≡ M mod n für alle M < n. Nach den ersten beiden Schritten gilt (M e·d − M) ≡ 0 mod p und (M e·d − M) ≡ 0 mod q, also teilen p und q jeweils dieselbe Zahl z = (M e·d − M). Da p und q verschiedenen Primzahlen sind, muss dann auch ihr Produkt diese Zahl z teilen. Also gilt: (M e·d − M) ≡ 0 mod p · q 55 oder M e·d ≡ M mod p · q oder M e·d ≡ M mod n 4.5 Schwächen von RSA • Wenn N Nachrichten aus einer kleinen Menge gewählt werden, ist RSA unsicher: for N 0 do (N 0 )e = C 1 if C 1 = C then N = N 0 • Wenn N und e zu klein sind ist RSA unsicher, dass heißt wenn N e als Zahl kleiner als n √ ist so das nich modulo gekürzt wird, so kann man einfach e c • Angriff mit frei gewählten Chiffretext, angenommen man hat Zugriff auf die Verschlüsselungsmaschine so dass man mit selber vorgebenen C 0 , N 0 berechnen kann (C 0 −→ N 0 ) Re = S mod n S d = R mod n C 0 = S · C (C 0 )d = S d · C d = |{z} R · N mod n N’ N0 · R−1 = N mod n N1 −→ C1 N2 −→ C2 ⇒ N1 · N2 −→ C1 · C2 • Jeder Benutzer braucht ein eigenes n, dass heißt man muss für jeden Benutzer die entsprechenden Primzahlen suchen, allerdings ist dies aufwendig. • RSA ist extrem langsam im Vergleich zu symmetrischen Verfahren openssl speed rsa bzw. speed aes-256 4.6 Fuktionen in OpenSSL 4.6.1 genrsa genrsa erzeugt Schlüsselpaare für RSA. Schlüssellänge num_bits frei wählbar, wobei es einen Bug bei kleinen Werten gibt (weniger als 60 Bit), so kurze Schlüssel aber auch nicht verwendet werden sollten. Optionen: usage: genrsa [args] [numbits] -out file: output the key to file -passout arg: output file pass phrase source 56 -f4: use F4 (0x10001) for the E value -3: use 3 for the E value -des: encrypt the generated key with DES in cbc mode -des3: encrypt the generated key with DES in ede cbc mode (168 bit key) -idea: encrypt the generated key with IDEA in cbc mode -aes128, -aes192, -aes256: encrypt PEM output with cbc aes -engine e: use engine e, possibly a hardware device. -rand file;file;...: load the file (or the files in the directory) into the random number generator 4.6.2 rsa rsa gibt den public-key zu gegebenen private-key aus. Außerdem auch weitere Informationen wie verwendeter Modulus. Mit rsa kann auch ein gegebener key neu verschlüsselt abgespeichert werden. rsa [options] <infile >outfile where options are -in arg: input file -out arg: output file -pubin: expect a public key in input file -pubout: output a public key -passin arg: input file pass phrase source -passout arg: output file pass phrase source -text: print the key in text -noout: don’t print key out -modulus: print the RSA key modulus -check: verify key consistency -des: encrypt PEM output with cbc des -des3: encrypt PEM output with ede cbc des using 168 bit key -idea: encrypt PEM output with cbc idea -aes128, -aes192, -aes256: encrypt PEM output with cbc aes -inform arg: input format - one of DER NET PEM -outform arg: output format - one of DER NET PEM 57 -sgckey: Use IIS SGC key format -engine e: use engine e, possibly a hardware device. 4.6.3 rsautl Mit rsautl können Dateien ver- oder entschlüsselt und signiert oder verifiziert werden. Usage: rsautl [options] where options are -in file: input file -out file: output file -inkey file: input key -pubin: input is an RSA public -certin: input is a certificate carrying an RSA public key -sign: sign with private key -verify: verify with public key -encrypt: encrypt with public key -decrypt: decrypt with private key -hexdump: hex dump output -pkcs: use PKCS#1 v1.5 padding (default) -oaep: use PKCS#1 OAEP -ssl: use SSL v2 padding -raw: use no padding -keyform arg: private key format - default PEM -passin arg: pass phrase source -engine e: use engine e, possibly a hardware device. 4.6.4 PKCS später noch ausführlicher hier nur kurz die Verwendung bei RSA: Padding beginnt mit 0002 endet mit 00 und dann kommt der Chiffretext. 58 4.6.5 OAEP - Optimal Asymmetric Encryption Padding Normalerweise wird mit RSA nur ein Schlüssel für eine symmetrische Verschlüsselung verschlüsselt, da RSA, verglichen mit symmetrischen Algorithmen sehr langsam ist. Bemerkung: Vergleichen mit speed rsa und speed aes (siehe History 21.01.2009) Ist die so festgelegte Länge des Klartextes erheblich kleiner als die des RSA-Schlüssels, so ist ein Auffüllen der restlichen Bits nötig. Die implizite Methode (beim Betrachten des Klartextes als Zahl), einfach 0en einzusetzen empfiehlt sich nicht, da die Zusatzinformation, die ein Angreifer so über den Klartext bekommt, das Decodieren des geheimen Schlüssels vereinfacht. Beim Padding soll diese Gefahr verringert werden. Per default wird bei openssl PKCS benutzt. Allerdings ist die Verwendung von OAEP besser. Beim OAEP, ist im Gegensatz zum PKCS die Länge des Klartextes nicht mehr sichtbar (man kann nur noch dass beginnende 00 Byte erkennen), Choosen Plaintext Attacke ist nicht mehr möglich. Dabei wird essenziell die zu verschlüsselnde Nachricht mit einem Hashwert eines Zufalls-Strings per xor verknüpft und so randomisiert. Eine Modifikation des benutzten Hashwerts wird dann mit der Nachricht konkateniert und steht beim Entschlüsseln wieder zur Verfügung. 1. Label hash, Label = 2. PS erzeugen (alles Nullen 128-1-h-h-1-—m—) 3. DB = 4. Seed wählen, Länge h (irgendwas seed = Hash(irgendwas)) 5. DBmaske = MGF(seed, —DB—) 6. mDB = DB ⊕ GBmask 7. seedmaske = MGF(mDB, —seed—) 8. mseed = seed ⊕ seedmaske 9. EM = 10. RSA-Verschlüsselung C ≡ EMe mod n MGF: Hash Eingabe x Länge l tc = Hash(x k c) —c— = 4 Byte MGF(x, l) := t0 k t1 k t2 k t3 . . . , |MGF(. . . , l)| = l 59 Rückgängig: 1. Entschlüsseln 2. Zerlegen: 00, mseed, mDB 3. seedmaske = MGF(mDB, —mseed—) 4. seed = mseed ⊕ seedmaske 5. DBmaske = MGF(seed, —mDB—) 6. DB = mDB ⊕ DBmaske 7. Padding abtrennen PKCS#1 v1.5 Die für den Modul verwendeten Primzahlen müssen die ersten beiden Bits gesetzt haben, das garantiert nach Multiplikation der Primzahlen, dass das Produkt im oberen Byte das obere Bit gesetzt hat und somit die feste voranstehende 0 überdeckt. 4.6.6 Wie erkennt man an Ciphertexten den Verschlüsselungsalgorithmus- DER / ASN1 Standards, damit man (z.B. RSA) verschlüsselte Texte erkennt. DER- distingushed Encoding Rules ASN1- Abstract Syntax Notation openssl asn1parse -genstr "INTEGER:4711" -out int.asn1 openssl asn1parse -in int.asn Integer werden in ASN1 als ’|{z} 02 länge Daten’ kodiert. Integers brauchen 1 Byte mehr ’Daten’ T ag damit Das Vorzeichen 00 enthalten ist. Integer ist immer mit Vorzeichen. Tag für andere Typen: Bool: 01 Int: 02 Octet String: 04 Bitstring: 03 ’länge’ ’ungenutzte bits am Ende’ ’Byte des Bitstring’ [evt. ungenutzte Bits] Text: PRINTABLESTRING 60 utf8: UTF8String Text mit @ Zeichen (emailadresse): IA5STRING Datum/Zeit: UTC mit Jahrhundert: GENTIME nüscht (der leere Typ): NULL Mengentypen: seq, set Mann kann auch eigene Typen generierend "EXPLICIT:AF oder so. 4.6.7 Umgehen mit den Schlüsselkomponenten Ein vollständiger RSA-Schlüssel besteht aus einem Modul (modulus) n = p · q, öffentlichem Exponent e, privatem Exponent d, Primzahl 1 p, Primzahl 2 q (häufig p > q), Exponent 1 d p , Exponent 2 dq , Koeffizient qi und kann so ausgegeben und gespeichert werden. Bei der Version für ’arme’ werden nur n, öffentlicher Exponent e und geheimer Exponent d angegeben. c ≡ me m ≡ c d mod n (3) mod n (4) Vorteil der vollständigen Version: Geschwindigkeitserhöhung bei der Entschlüsselung in Schritt (4). d p ≡ d mod (p − 1) dq ≡ d mod (q − 1) qi · q ≡ 1 mod q d = k · (p − 1) + d p m ≡ cd mod (p · q) berechnen: m1 ≡ cd p mod p 500 Operationen mit 21 langem Modul m2 ≡ cdq mod q 500 Operationen mit 12 langem Modul Insgesamt: 1000 Operationen mit 14 der Länge a p−1 ≡ 1 mod p wenn (a, p) = 1/teilerfremd1 1 kleiner Fermatscher Satz 61 m1 ≡ cd mod p m2 ≡ cd mod q h ≡ (m1 −m2 )·qi mod p (darauf achten dass das −m2 mod p ausgerechnet wird, nicht mod q) m = m2 + h · q 1. m < n 2. m ≡ cd mod p, da m2 + h · q ≡ m2 + (m1 − m2 ) · qi · q mod p ≡ m2 + m1 − m2 ≡ m1 , also ≡ cd mod p m ≡ cd mod q, da m2 + h · q ≡ m2 mod q, also ≡ cd mod q x ≡ y mod p und x ≡ y mod q, dann folgt x ≡ y mod p · q Euklidischer Algorithmus: (p, q)-teilerfremd, dann p · u + q · v = 1 ... Chinesischer Restsatz 4.7 Miller-Rabin Test Heute: openssl dhparam, und: was Verblüffendes so dass man es nur mit der Phantasie eines Informatikers oder Mathematikers verstehen kann. (Literatur Menezes, Oorschot, Handbook of Applied Cryptography) Primzahlen: Feststellen ob eine Zahl eine Primzahl ist durch Testen von Divisionen . . . wird bei großen Zahlen sehr lang. p · q = n ausrechnen geht schnell. Umkehrung n =?·? ist möglicherweise schwer. 14 Über 22 + 1 weiss man dass es keine Primzahl ist2 , kennt aber keinen der Faktoren. Kriterium: keine Primzahl“ lässt sich auf folgende Art manchmal feststellen: ” Wenn (a, n) = 1 so ist an−1 ≡ 1 mod n FermatTest: Wenn für (a, n) = 1 an−1 . 1 mod n so kann n keine Primzahl sein. Primzahlen Test Wenn für eine Zahl a mit (a, n) = 1 der Fermat-Test nicht bestanden wird, nennt man a einen Zeugen für Nichtprimalität. 2 Vierzehnte Fermatsche Zahl 62 Zeugen gibt es sehr viele, nicht realistisch alle zu befragen“. Ausserdem gibt es Zahlen die ” keine Zeugen haben, aber keine Primzahl sind. Aus diophantischen Gleichungen folgt: Es gibt ein Polynom mit ganzzahligen Koeffizienten f (n) mit der Eigenschaft: Wenn f (n) > 0 ⇔ n ist Primzahl Aber das Polynom hat 26 Koeffizienten. Für Mathematiker ist das Problem erledigt, da das Polynom existiert, für Informatiker ist es das nicht wirklich, da die Berechnung übermäßig komplex ist. Die Nicht-Primzahlen ohne Zeugen heissen Carmichael-Zahlen. Haben die Eigenschaft ∀p(p|n ⇒ p − 1|n − 1) ⇒ Carmichael. Zum Beispiel 561 hat Teiler 3, 11, 17. Der Test liefert: 2|560, 10|560, 16|560 Erweitern: (n Primzahl) Wenn (a, n) = 1 und an−1 ≡ 1 mod n und 2|n − 1 (an−1 ≡ 1 mod n, n−1 a 2 ≡ ?) Wenn x2 ≡ 1 mod n, was ist x mod n. n|x − 1 n|x2 − 1 = (x − 1)(x + 1) entweder n|x + 1 oder FermatTest+ : Wenn für (a, n) = 1 an−1 . 1 mod n oder falls an−1 ≡ 1 mod n und a n−1 und a 2 . −1, so kann n keine Primzahl sein. ... und 4|n − 1 ∗, −1, 1 a n−1 4 ,a n−1 2 ,a n−1 1 n−1 2 . +1 mod n. Diese Folge ist entweder 1, 1, 1 oder −1, 1, 1 oder n−1 n−1 Wenn (a, n) = 1 und 2k |n − 1 (k maximal), dann ist die Folge a 2k , a 2k−1 , . . ., a 1, . . . , 1 oder ∗, −1, 1, . . . , 1 (∗ steht für beliebige Folge). n−1 2 , an−1 entweder Probieren: n = 81 n − 1 = 80 durch 2er-Potenzen teilen, kommt irgendwas mit 5 hinten raus. Als Zeugen nehmen wir mal 2. Ausrechnen 25 , 210 , 220 , 240 , 280 und schauen ob diese Folge modulo 81 einen der beiden Typen hat. 32 . 1 mod 81, . . . n−1 n−1 FermatTest∗ (= Miller-Rabin-Test): Wenn für (a, n) = 1, 2k |n − 1 teilt und die Folge a 2k , a 2k−1 , n−1 . . ., a 2 , an−1 modulo n nicht 1, . . . , 1 und nicht ∗, −1, 1, . . . , 1 dann ist a ein Zeuge für Nichtprimalität Für Miller-Rabin-Test gibt es keine zeugenlosen zusammengesetzten Zahlen, es gibt unter den zu n teilerfremenden Zahlen mindestens 25% Zeugen3 . (Menezes/Oorschot, Kapitel 4, Fact 4.25, Fact 4.48, Tabelle 4.3) Die für Informatiker interessante Frage ist die Frage: Wenn man eine Wahrscheinlichkeit kleiner 2−80 für eine fehlerhaft durch Miller-Rabin nicht erkannte zusammengesetzte Zahl haben will, 3 Anmerkung später: 3 4 sind Zeugen, 1 4 sind Lügner 63 muss man für n (512 Bit) 6 Tests machen. Je größer die Zahlen werden, desto weniger Tests muss man machen. Für 1024 3 Tests, für 2048 2 Tests . . . Vorausgesetzt ist immer noch ein Test auf kleine Faktoren. Dabei prüft man ob (n, pi ) = 1 für pi < B, wobei pi kleine Primzahlen sind. Das B wählt man so, dass dieser Test nicht länger dauert als ein Miller-Rabin-Test. Wie wählt man Primzahlkandidaten? Generiere Zahl mit Zufallszahlengenerator, schaue ob die durch 2 oder so teilbar ist, wähle dann die nächste Zahl . . . openssl dhparam -dsaparams -text -noout 2048 schnell openssl dhparam -text -noout 2048 langsam Safe Prime: p−1 2 p−1 2 hat einen großen Primzahlfaktor. q dann getestet ob 2(k · (q + 1)) Primzahl ist. ist Primzahl. Wofür braucht man die Primzahlen? Natürlich für RSA und jetzt neu: 4.8 Diffie-Hellman-Schlüsselaustausch Alice und Bob haben gemeinsame öffentliche Informationen, tauschen öffentliche Informationen aus, und verfügen danach beide über einen gemeinsamen privaten Schlüssel. g = 2 (öffentlich bekannt (Generator)), Primzahl p (öffentlich bekannt) Ergänzungen g, g2 , g3 , . . . , g p−1 mod p (g Generator, dann alle verschieden) g^x mod p x y g^y mod p Bob Alice Eve 64 Bob wählt zufällig 1 < x < p − 1 und ruft Alice g x mod p zu. Alice wählt zufälig 1 < y < p − 1 und ruft gy mod p zu. Bob berechnet (gy ) x mod p und Alice berechnet (g x )y mod p. Beide erhalten g x·y mod p. Angreifer Eve kennt nur g x mod p, gy mod p, fehlt g x·y mod p. Wenn Eve das diskrete Logarithmusproblem lösen könnte, also zu g x mod p und g mod p das x ausrechnen könnte, dann wäre g x·y mod p leicht zu berechnen. Die besten Algorithmen für das diskrete Logarithmusproblem mod p sind subexponentiell im größten Primfaktor von p − 1. Falls (p − 1) viele kleine Primfaktoren pi hat, ist das diskrete logarithmus Problem leicht, denn dann löst man das Problem nicht a mod (p − 1) sonder jeweils a mod pi und setzt0 dass ganze dann mit dem Chinesischen Restsatz zusammen. 0 Sucht p so dass p−1 2 auch eine Primzahl ist, dazu wird zuerst eine Primzahl p gesucht und dann 0 geguckt ob 2p + 1 auch Prim ist. Openssl: Variante: DH (DSAparam) (-dsaparam) p-Primzahl 1536 g-’Generator’ nicht von (p − 1) sondern von der Restklasse h 160 Bit g, g2 , g3 , . . . , gh alle verschieden mit h=160 Bit Dann sollen x,y so gewählt werden, dass 1 < x, y < h = 160 Bit. Ein weiteres asymmetrisches Cryptosystem kann man darauf aufbauen: Alle kennen g und p, jeder generiert sich x (privater Schlüssel) und g x mod p wird veröffentlicht. Alice will Bob etwas verschlüsselt schicken: Sie generiert ein k, berechnet aus k und Bobs veröffentlichtem g x : a = (g x )k mod p und aus dem allgemein bekanntem g: gk mod p. M sei die Nachricht ( mod p), die Alice verschicken will. Sie berechnet a · M mod p und sendet an Bob das Paar (gk mod p, a · M mod p). Bob berechnet (gk ) x mod p = a und dividiert a·M mod p und erhält somit M. a Der Schlüssel a darf nicht zweimal verwendet werden. Man nennt (gk , a) zeitweiliger bzw. ephemeraler Diffie Hellmann Schlüssel. Nachteil: die Nachrichtenlänge wird verdoppelt. 65 Das Verfahren ist unsicher, wenn Alice die Zahl x schlecht wählt: x = 1, 2, 1, 2, 1, 2, 1 = x1 , x2 , . . . 4.9 ElGamal-Cryptosystem (siehe auch TR 3111 vom BSI auf Seite 21) Auf Diffie-Hellmann aufbauend: Alice öffentlicher Schlüssel ga , (p, g) Bob öffentlicher Schlüssel gb , (p, g) privat a privat b Alice will an Bob schicken: 1. Zufallszahl k generieren 2. Berechne mit Bobs Parametern gk mod p 3. Berechne mit Bobs Parametern (gb )k mod p (DH-Schlüssel) 4. Berechne m · (gb )k mod p 5. Sende gk , m · (gb )k mod p Bob empfängt (x, y): 1. Berechne xb mod p (DH-Schlüssel) 2. y · (xb )−1 mod p = m mod p Alice baut also einen temporären DH-Schlüsselteil4 zu Bobs Parametern und sendet diesen und die damit verschlüsselte Nachricht m. Nachteil: Nachricht wird durch den Ephemeralschlüssel doppelt so lang. 4.10 Wiederholung DH Generator g Primzahl p ga mod p Restklassen mod p = Körper(·, inverses) Dass p Primzahl ist, ist eigentlich Zufall. Erzeugendes Element G Operation auf Elementen + a · G = G + G + G + ... + G a-mal Es muss schwer sein aus G und B = a · G gegeben das a zu bestimmen. G muss eine Ordnung n haben: n · G = 0 (Neutrales Element der Operation +) 4 Auch Ephemeralschlüssel genannt 66 4.10.1 Beispiel Alice, Bob G, +, n Alice: denkt a, denkt a · G Bob: denkt b, denkt b · G Beide tauschen a · G und b · G aus und berechnen a · b · G a · G ist leicht zu berechnen: double and add a = a0 + a1 · 2 + ... + ak · 2k a · G = a0 · G + a1 · 2 · G + ... + ak · 2k · G (k − 1)-mal ·2“ und (k − 1)-mal +“ ” ” 4.11 was anderes Nimmt man nun G große Gruppe mit n Elemente und der Addition + g-Generator g, 2g, 3g, . . . , |{z} nG Nullelement Alice: wählt 1 < x < n, bestimmt x · g Bob: wählt 1 < y < n, bestimmt y · g Dann wieder K = (ab) · g = K To do: ergänzen Problem des Diskreten Logarithmus in G gegeben ist G, g Generator ist 0 , c = a · g in G, gesucht alogG c-diskreter Logarithmus in G. Diese Variante funktioniert also mit allen ’Komplizierten Gruppen’, das führt zu dem nächsten Thema: 4.12 Elliptische Kurven Wo gibt es so etwas schon? Elliptische Kurven! Sind nicht weit verbreitet, weil sie dem Management schwer zu erklären sind. 67 Aus der Wikipedia (unter GNU Free Documentation License): In der Zahlentheorie ist eine elliptische Kurve eine singularitätenfreie algebraische Kurve der Ordnung 3 in der projektiven Ebene. Von besonderem Interesse z.B. für die Faktorisierung natürlicher Zahlen sind aufgrund ihrer einfachen Struktur elliptische Kurven der Form cy2 = x3 + ax + b mit c , 0 und 4a3 + 27b2 , 0. Einige moderne Verschlüsselungsverfahren basieren auf solchen Kurven. Der Name leitet sich historisch davon ab, dass diese Kurven durch elliptische Integrale parametrisiert werden können. Elliptische Kurven über endlichen Körpern werden in der Kryptografie eingesetzt. Dazu wird ausgenutzt, dass eine Gerade (lineare Funktion), die zwei Schnittpunkte P und Q mit einer Elliptischen Kurve hat, diese auch in einem 3. Punkt schneidet. Der Punkt, der aus dem letzteren durch Verkehren des Vorzeichens der Y-Koordinate (wenn die Kurve die oben angegebene Form hat) entsteht, wird P + Q genannt. Man kann zeigen, dass diese Punktaddition (P und Q werden addiert, das Ergebnis ist der Punkt P + Q) sowohl kommutativ als auch assoziativ ist. Ergänzt man die Elliptische Kurve um einen weiteren Punkt 0 (genannt Punkt im Unendlichen), so bildet sie zusammen mit der (etwas erweiterten) Punktaddition eine abelsche algebraische Gruppe. Sei nun P ein Punkt der Elliptischen Kurve. Der Punkt P + P wird mit 2P bezeichnet, entsprechend definiert man kP = P + ... + P als k-fache Addition des Punktes P. Ist P nicht der 0-Punkt und ist die Ordnung der Elliptischen Kurve prim, so kann auf diese Weise jeder Punkt der Kurve erreicht werden (d.h. zu jedem Punkt Q auf der Kurve existiert eine natürliche Zahl k mit Q = kP). Die Aufgabe, aus gegebenen Punkten P, Q diesen Wert k zu ermitteln, wird als Diskretes Logarithmus-Problem der Elliptischen Kurven (kurz ECDLP) bezeichnet. Es wird angenommen, dass das ECDLP (bei geeigneter Kurvenwahl) schwer ist, d.h. nicht effizient gelöst werden kann. Damit bieten sich Elliptische Kurven an, um auf ihnen asymmetrische Kryptosysteme zu realisieren (etwa einen Diffie-Hellman-Schlüsselaustausch oder ein Elgamal-Kryptosystem). y2 = x3 + a · x + b Skizze der Kurven S2 Zu S2: Punkte auf der Kurve kann man addieren Die Rechenregeln gehen auch in einem Körper mod p Beispiel: y2 ≡ x3 + a · x + b mod p Skizze S3 Es gibt immer Punkte, mit denen man rechnen kann. Punkte sind geeignet, die Addition funktioniert auch und hat die Anzahl N der Punkte einen großen Primzahlteiler, dann haben wir auch Kryptosystem mit G, +, n. Wenn großer Primzahlteiler exisitert: 1. N hat großen Primzahlteiler n 2. Wählen zufällig einen Punkt G als Generator Daraus erhält man DH und El Gamal Zuerst eingeführt durch Victor Miller und Neal Koblitz um 1980 herum. Damals war N schwer 68 bestimmbar. Inzwischen gibt es bekannte Algorithmen (Schoof-Algorithmus). Diskretes Logarithmusproblem ist für elliptische Kurven wirklich exponentiell (bis jetzt): Ein Bit mehr verdoppelt den Rechenaufwand! (192-Bit/-256 Bit bewegt sich in Größenordnungen RSA 2000-4000-Bit) Ergänzung: 1.Bei der Erforschung von Eliptischen Kurver stellte sich zuerst die Frag wie groß ist eigentlich √ die Ordnung n der Gruppe? Man wusste n ∼ p und man wusste sogar: n − p + 1 − p < n < √ −p + 1 + p 2. Schnelle Algorithmen zur Berchnung der Ordnung 3. ECDLP ist schwer wenn n einen großen Primfaktor hat. To do: sortieren Ergänzung: man hat p, a, b, G, n, h K = {y2 = x3 + ax + b} −1 p ist für die Punktaddition (Formeln siehe en.wikipedia.org wobei λ = (yQ − yP ) · (xa − x p ) | {z } mit GGT mod p) Anmerkung zum Wikipedia Artikel: binary Case bedeutet: man die Eliptischen Kurven auch in Körper mit 2k betrachten, allerdings vieler solcher Fälle patentiert G = Generatorpunkt mit G, 2G, 3G, . . . , nG alle verschieden. n kleinste Zahl so dass alle verschieden. nG = 0 bei der DSA-Parameter Form nimmt man weniger G’s Der nächste Parameter ist der cofactor h, welches den Unterschied zwischen n und der Anzahl der Produkte auf der Kurve angibt. Trick beim testen ob alle iG verschieden sind: man guckt ob n eine Primzahl ist und ob nG = 0 ist, wenn ja ist dies das erste mal, sonst wäre n ja keine Primzahl. Also sind alle vorherigen iG 69 verschieden. Kurven finden, besser Bestimmung der Punktanzahl, ist schwer. Früher gab es kleine cofactoren h < 16. openssl ecparama -list_curves sind schon vorher erzeugt, kann openssl nicht selber. openssl ecparam -name secp160k1 -text -noout da die Kurve festgelegt ist gibt es nur ein object zurück. openss ecparam -name secp160k1 -text -param_enc explicit -noout openss ecparam -name secp160k1 -text -param_enc explicit -noout -conv_form compresse komprimiert gibt nur die x-Koordinate aus. Bei der komprimierten Form kann mit der Kurve die andere eindeutig bestimmen?!? (oder so) Darstellung als komprimierte Punkt ist auch wieder patentiert. 4.13 Elliptische Kurven Nachtrag GF(p) (Galois-Field) sind Kurven mod p mit p Primzahl, erfüllen Gleichungen der Form y2 = x3 + a · x + b GF(2k ) Körper mit 256 Elementen = 28 In OpenSSL nur elliptische Kurven mod p, patentfrei Kofaktor finden: Wir haben Punktgruppe G, es gibt einen Generatorpunkt g? n·G = 0 n ist die Ordnung cofactor order = Anzahl der Punkte | {z } ∗ |{z} klein primzahl (cofactor soll klein sein, order Primzahl) Anstelle Punkt auf der elliptischen Kurve als (x, y) (x, y mod p) abzuspeichern, Trick: Wenn√es ein Punkt ist, gibt es zu x zwei y, die quadratische Gleichung y2 = x3 + a · x + b erfüllen: y1 = √ x3 + ax + b mod p y2 = − x3 + ax + b mod p eine der beiden Zahlen hat als letztes Bit immer 1, die andere eine 0, man nimmt daher nur noch (x, LSB(y)) (x und kleinstes Bit von y) 70 4.14 Rucksack-Verschlüsseln Kryptosystem das sich bei OpenSSL zu recht nicht findet. Hat den Anschein, als würde es auf einem NP-vollständigen Problem beruhen. Problem ist NP-vollständig, weil es ein allgemeines Rucksackproblem ist. Sieht aber nur so aus, ist aber nur polynomial, weil es ein Transformiertes eines leichten Rucksackproblems ist. Gegeben: W Fassungsvermögen des Rucksacks, w1 , w2 , ..., wk kleine Gewichte P Gesucht: W = ei wi mit ei ∈ 0, 1 Rucksack-Verschlüsseln von Merkle/Hellmann: Rucksack mit schnell wachsenden Gewichten ist leicht zu berechnen P d.h. wi > j<i e j w j nächstes Gewicht ist immer schwerer 4.14.1 Beispiel Rucksack: W = 51 = 31 + 15 + 3 + 2, w0i s: 2, 3, 7, 15, 31 Grundidee: Aus dem schnellen Rucksack einen langsamen machen: P M > wi , k mit (M, k) = 1, k · 2, k · 3, ..., k · 31 mod M M = 61 ist Modul, k = 17 ist privater Schlüssel, m = (1, 1, 0, 1, 1) ist unverschlüsselte Nachricht, 31, 51, 58, 11, 39 ist öffentlicher Schlüssel, 34 + 51 + 11 + 39 = 135 = 13 → c ist verschlüsselte Nachricht Empfänger rechnet aus dem erhaltenen Gewicht (135) das richtige Gewicht wieder raus: 135·k−1 mod 61 = 51 und kann das Problem mit den schnellen Gewichten lösen. Zum Brechen: Man transformiert 34, 51, 58, 11, 39 in eine Folge, die schnell wachsend ist, z.B. 1, 3, 5, 11, 29, d.h. das transformierte System kann auf mehrere Probleme zurückgeführt werden, man braucht nur eine passende Rücktransformation finden, Adi Shamir hat dafür einen polynomiellen Algorithmus angegeben. 4.15 Merkle Puzzle Man generiert sich 1.000.000 Nachrichten: Das ist Nachricht ni für den Schlüssel k j“, ni zufälli” ge 20-Bit Zahl, k j 128-Bit Schlüssel Verschlüsselungsverfahren DES, diese 1.000.000 werden mit 20-Bit Schlüsseln verschlüsselt Alice schickt die 1.000.000 Nachrichten an Bob als öffentlichen Schlüssel Bob will Alice eine Nachricht schicken: Er sucht eine der Nachrichten aus dem öffentlichen 71 Schlüssel aus und macht eine Brute-Force Attacke auf diese Nachricht. Er findet ni und ki . Bob verschlüsselt mit dem ki seine Nachricht und sendet ni im Klartext mit. Alice und Bob haben linearen Aufwand, Eve quadratischen. Von everything2.com: Alice and Bob agree on a symmetric algorithm. Alice generates a large number (over a million, at least) of messages of the form, “This is my index, X, and my puzzle is Y.” Each of the messages is encrypted with a 20-bit key. Assume there are 220 (about a million) messages, it takes 220 operations to get the key, and a computer can perform 220 operations per second. Bob takes 1 second to recover the key to a message. Eve takes 12 days. Now make that 230 (about a billion) messages. Bob still only takes a second to get the key, and it will take Eve 34 years. Public Key Idee hier schon vorhanden 4.16 Rabin-Verfahren und Wurzelziehen Aus der Wikipedia (unter GNU Free Documentation License): Das Rabin-Kryptosystem ist innerhalb der Kryptologie ein asymmetrisches Kryptosystem, das auf einem Faktorisierungsproblem beruht und mit RSA verwandt ist. Es lässt sich prinzipiell auch zur Signatur verwenden. In der Praxis findet das Verfahren allerdings wegen bestimmter Angriffsmöglichkeiten kaum Anwendung. 4.16.1 Schlüsselgenerierung Aus der Wikipedia (unter GNU Free Documentation License): Seien p und q zwei möglichst große Primzahlen, für die eine bestimmte Kongruenzbedingung gelten muss. Der öffentliche Schlüssel n wird durch Multiplikation der beiden Zahlen erzeugt, also n = p · q. Der geheime Schlüssel ist das Paar (p, q). Anders ausgedrückt: Wer nur n kennt, kann ver- aber nicht entschlüsseln, wer dagegen p und q kennt, kann damit auch entschlüsseln. Zum Erzeugen des öffentlichen Schlüssels müssen die Zahlen p und q bekannt sein: Der öffentliche Schlüssel lässt sich nur genau aus den beiden Primzahlen erzeugen. Wären p und q keine Primzahlen, so ließe sich das Verfahren übrigens nicht anwenden. Seien beispielhaft p = 7, q = 11 (in der praktischen Anwendung handelt es sich um sehr viel größere Zahlen, um die Entschlüsselung durch Dritte so schwierig wie möglich zu machen). Daraus ergibt sich der öffentliche Schlüssel n = p · q = 77. 72 4.16.2 Kongruenzbedingung Aus der Wikipedia (unter GNU Free Documentation License): q−1 Für p und q muss die Kongruenzbedingung: p−1 = (p − 1) und = (q − 1) p q n−1 n−1 (wobei für: n = (n − 1) 2 ≡ (n − 1) mod n = (n − 1) gilt.) oder einfacher ausgedrückt: p ≡ q ≡ 3 mod 4 gelten. Allgemein gilt nämlich für die Primzahl r mit r ≡ 3 mod 4 und die Zahl a mit a ≡ b2 mod r: √ (r+1) a 4 ≡ a mod r Diese Eigenschaft dient dazu, später die Entschlüsselung zu erleichtern. Wegen 7 ≡ 11 ≡ 3 mod 4 ist die Kongruenzbedingung für das Beispiel erfüllt. n = p · q Produkt von Primzahlen m soll verschlüsselt werden: c ≡ m2 mod n (einfach Quadrieren, weil Wurzelziehen schwer ist, wenn der Modul ein Produkt von 2 Primzahlen (p · q) ist, weil wer Wurzel ziehen kann, kann auch Faktorisieren (n) Begründung: Es gibt 2 Lösungen c = x2 ≡ y2 mod n. Wie findet man nun die Faktoren von n? n teilt x2 − y2 = (x − y)(x + y) und x > y und (x − y) < n und n hat nur 2 Primfaktoren, daher: x − y = p und x + y = q Wurzelziehen ist leicht mod p, mod q Gesucht Wurzel c mod p: q+1 p+1 x p = c 4 mod p und xq = c 4 mod q x2p ≡ c p+1 2 ≡c p−1 2 · c mod p p−1 Weil c p−1 ≡ 1 mod p ist (nach kleiner Fermat) die Wurzel daraus c 2 ≡ ±1, wegen c ≡ m2 p−1 mod n gilt: (m2 ) 2 ≡ m p−1 ≡ 1(p) Stück fehlt, Ende des Wurzelziehens 4.16.3 Verschlüsselung Aus der Wikipedia (unter GNU Free Documentation License): Sei nun P = {0, ..., n − 1} der Klartextraum (er besteht also aus Zahlen) und m ∈ P der Klartext. Nun lässt sich der Geheimtext c durch c = m2 mod n bestimmen. Dabei ist c der Quadratische Rest von zu der Quadratzahl m2 zum Modulo der Schlüssel-Zahl n. Im praktischen Einsatz bietet sich die Verwendung von Blockchiffre an. In unserem Beispiel sei P = {0, ..., 76} der Klartextraum, m = 20 der Klartext. Der Geheimtext ist hierbei nun c = m2 mod n = 15. 73 Dabei muss man beachten, dass für genau vier verschiedene m das c den Wert 15 aufweist, nämlich für m ∈ {13, 20, 57, 64}. Ähnliches gilt für die meisten c. 4.16.4 Entschlüsselung Aus der Wikipedia (unter GNU Free Documentation License): Seien allgemein c und r bekannt, gesucht wird m ∈ {0, ..., n − 1} mit m2 ≡ c mod r. Für zusammengesetzte r (beispielsweise unsere n) existiert kein effizientes Verfahren zur Bestimmung von m. Ansonsten, wenn also r ∈ P (in unserem Fall p und q), dann lässt sich jedoch der chinesische Restsatz ausnutzen. In unserem Fall sind nun die Quadratwurzeln √ m p = c mod p und √ mq = c mod q gesucht. Wegen obiger Kongruenzbedingung gilt: (p+1) mod p mp = c 4 und (q+1) mq = c 4 mod q. In unserem Beispiel ergeben sich m p = 1 und mq = 9. Mit dem erweiterten euklidischen Algorithmus werden nun y p und yq , mit y p · p+yq ·q = 1, bestimmt. In unserem Beispiel erhalten wir y p = −3 und yq = 2. Nun werden unter Ausnutzung des chinesischen Restsatzes die vier Quadratwurzeln +r, −r, +s und −s von c + nZ ∈ Z/nZ berechnet (Z/nZ steht hierbei wie üblich für die Menge der Restklassen modulo n; die vier Quadratwurzeln liegen in der Menge {0, ..., n − 1}): r = (y p · p · mq + yq · q · m p ) mod n −r = n−r s = (y p · p · mq − yq · q · m p ) mod n −s = n−s Eine dieser Quadratwurzeln mod n ist wieder der anfängliche Klartext m. Im Beispiel gilt m ∈ {64, 20, 13, 57}. 4.17 Angriffe auf asymmetrische Verschlüsselungsverfahren Fall: RSA 74 4.17.1 1. Angriff: Common modulus attack Idee: Gleicher Modul für verschiedene Leute, hätte den Vorteil, dass man sich nur die kleinen öffentlichen Exponenten e1 und e2 merken muss, nicht mehr die großen Module, hat aber Nachteil: (e1 , e2 ) = 1 teilerfremd: u·e1 +v·e2 = 1 (mit erweitertem Euklid) Sendet man eine Nachricht m an zwei Alices, berechnet also c1 = me1 mod n und c2 = me2 mod n, dann kann man mit den Chiffren c1 und c2 auch ausrechnen: cu1 · cv2 = me1 u · me2 u = me1 u+e2 v = m mod n Nachricht erhalten! 4.17.2 2. Angriff: kleiner geheimer Exponent d Wenn |d| < |m| 3 , dann ist Faktorisieren möglich, Sicherheitsrisiko, geheimer Exponent muss immer möglichst groß sein, aus großem öffentlichen Exponenten |e| kann man erfahren, dass der geheime Exponent klein ist 4.17.3 3. Angriff: Faktorisieren ∆ Wenn p ungefähr so groß wie q, also p − q = ∆ klein ist, dann ist ( p+q 2 + 2 ) (ungefähr Wurzel n ∆ + was kleines = p) ·( p+q 2 − 2 ) = p · q Man weiß, dass die eine Zahl über Wurzel n liegt und die andere Zahl unter Wurzel n (Wurzel n + klein = p, Wurzel n - klein = q) 4.17.4 Echt schlechte RSA-Schlüssel n = 3·q (1024 Bit) und öffentlichen Exponenten bei TCTrustCenter abgegeben. Damit kann man zeigen, dass PGP als Signaturverfahren schlecht ist. Schlüssel schlecht gewählt, dadurch kann jeder die Kommunikation mitlesen, da n sehr leicht zu Faktorisieren, die Leute, sie könnten der Person mit dem schlechten Schlüssel vertrauenswürdige Nachrichten schicken und laufen in die Falle, dass ihre Nachrichten nun öffentlich sind; Anderer Fall: Bewußt solche Schlüssel vergeben, um Nachrichten in einem kompletten Netzwerk lesen zu können n = Primzahl, e · d ≡ 1 mod (n − 1) Mit n als Primzahl geht normale Entschlüsselung nicht. n, p, q, e, d p , dq , qi , d c ≡ me mod n m1 ≡ cd p mod p m2 ≡ cdq mod q d p ≡ d mod (p − 1) 75 dq ≡ d mod (q − 1) m = m2 + (m1 − m2 ) · qi ·q | {z } mod p m ≡ cd mod q und m ≡ cd mod p ⇒ cd Bundesamt für Informationssicherheit sagt zur Verwendung von RSA: p, q müssen unabhängig voneinander zufällig erzeugt werden und 0, 5 < | log2 p − log2 q| < 30 4.17.5 Schnelles Faktorisieren bei Fehler im System DFA - Differential Fault Attack: System, das entschlüsselt, aber sich an einer Stelle verrechnet m01 ist Rechenfehler, statt wirkliches m bekommt man ein m0 = m2 + (m01 − m2 )qi ∗ q bildet man nun m − m0 , 0 aber durch q teilbar, d.h. bringt man das System dazu einen Fehler zu machen und hat man die Originalnachricht: GGT (m − m0 , n) = q schon hat man den Modul faktorisiert, hat funktioniert, viele Chipkarten verrechneten sich unter Streß. Es reicht, das m0 zu kennen, m kann unbekannt bleiben, denn man rechnet (m0 e − c, n) = q, es reicht eine entschlüsselte Nachricht zu haben Anderer Angriff auf Chipkarten: DPA - Differential Power Analysis: Stromverlauf ansehen, Differenzen bilden und sequentiell analysieren Angriff auf El Gamal Systeme: geheimer Schlüssel a, öffentlich g, p, ga , Verschlüsselte Nachricht: zufälliges k: (gk , m·gak )= c 1. Angriff: k gleich für verschiedene Nachrichten oder k1 , k2 in Abhängigkeit oder k, k + 1, k + 2, . . . für verschiedene Nachrichten oder a · k + b 4.17.6 Angriff mit gewähltem Chiffretext Normalerweise bei RSA: m −→ c = me mod n c0 vorgegeben führt zu Klartext m0 = (c0 )d mod n Anforderung: Beliebiger Chiffretext außer c0 = c wählbar, zu dem man dann den Klartext erhält Problem bei RSA: 1. r (zufällig gewählt) → re mod n = s 2. c0 = s · c mod n Verschlüsselungsmaschine liefert dann: (c0 )d = sd · cd = (re )d · m = r · m mod n = m0 76 3. Letzter Schritt: m = m0 = r−1 mod n Das geht nur theoretisch, in der Praxis geht das nicht, weil: Angreifer kann das r nicht steuern, r · m wird aber von der Verschlüsselungsmaschine verworfen, weil es bei zufälligem r kein korrektes Padding hat. Schwäche des RSA: Multiplikationseigenschaft m1 → c1 und m2 → c2 (m1 , m2 gültige Klartexte) m1 · m2 → c1 · c2 m1 · m2 nicht als gültiger Klartext zugelassen 5 Signaturmechanismen Wie erstellt man signierte Daten und versucht ein Äquivalent zu dem zu schaffen, was man im täglichen Leben durch Unterschriften schafft. Eigenschaften einer Signatur sollen nachgebildet werden: Man weiß, von wem ein Dokument kommt, sie ist an eine Person gebunden und kann von niemanden sonst nachgemacht werden und vom Inhaber nicht abgestritten werden. Nachträgliche Änderungen an unterschriebenen Dokumenten sollen nicht mehr möglich sein (gibt es so im echten Leben nicht). 5.1 Integritätsschutz und Hashfunktionen To do: neu Hashfunktionen Definition, einsortieren Hashfunktion: Beliebige Daten werden auf Binärfolgen konstanter Länge abgebildet Def.: Eine Hashfunktion H ist eine Abbildung 0, 1∗ → 0, 1k auf Hashwerte der Länge k. SHA-256 (SHA- Secure Hash Algorithmen) - Hashwerte der Länge 256 Bit 1. Es gibt Kollisionen: d1 , d2 H(d1 ) = H(d2 ) 2k Hashwerte aber potentiell abzählbar viele Daten. Wunsch: Man soll diese Kollisionen nicht finden können und am besten es gibt sie nicht. Hashfunktionen dienen zum unterscheiden von Daten. 77 H(d1 ) , H(d2 ) dann ist d1 , d2 Dementsprechend groß muss das k sein, so dass genügend viele Werte unterscheiden kann. Anforderungen an Hashfunktionen: Wunsch Kollisionsresitent (schwer Kollisionen zu konstruieren): man kann nicht zwei Dokumente mit dem gleichen Hashwert konstruieren. Wunsch Zweites Urbild resistent (schwer zweites Urbild zu konstruieren): man kann zu einem Dokument nicht ein zweites mit dem gleichen Hashwert bestimmen. Kollisionen entstehen zum Beispiel in Hörerkreisen: 23 Hörer(innen), dann haben mit mehr als 50% Wahrscheinlichkeit zwei am gleichen Tag Geburtstag. Geburtstagsparadoxon H : Hörer → Datum h 7→ Geburtstag(h) h1 , h2 , H(h1 ) = H(h2 ) Bestimme die Wahrscheinlichkeit, dass keine zwei am gleichen Tag Geburtstag haben. 1−g= 365·. . . ·(365−n+1) (365n ) wobei n die Anzahl der Hörer ist. (Für n = 23 ungefähr 50%) √ 365 20 √ g #Hashwerte Bei 2128 Hashwerte muss man mit Kollisionen rechnen ( Bsp: 30% bei 19 Personen 19 √ 365) k Merke: Das Geburtsatgs Paradox beschert uns Kolisionen bei 2 2 Hashwerten. To do: ende Neu Hashfunktionen: Schon bekannt aus dem ersten Semester (Hashtabellen). Allgemeine Eigenschaften: 1. Komprimieren beliebig lange Werte auf n-bit Werte 2. Einfach (und schnell) berechenbar Werte: 78 Fingerabdruck / Prüfwert, Hashwert h(x) (Hashfunktion) mit x1 , x2 aber h(x1 ) = h(x2 ). x1 und x2 ist Kollision Wahrscheinlichkeit für Kollision für zufällig gewählte Werte sollte 21n sein (Anforderung an Hashfunktion) Kollisionen: Wir verlangen, dass die Variabilität in der Eingabe sich auch in den Prüfwerten widerspiegelt, sprich: Wenn die Eingabewerte gleichverteilt sind, sind es auch die Ausgabewerte. To do: 20090422 To do: einsortieren Kollisionen ’vermeiden’ durch Größe: 160 Bit Prüfwerte (280 für Kollision (2100 — AES 128 — bzw. 2112 2128 als Kollisionsschranken) Zusätzlich Voraussetzungen für die Prüffunktion: 1. Kollisionsresistenz: Es muss schwer sein zwei Nachrichten m1 , m2 zu finden, so dass H(m1 ) = H(m2 ) (Es ist schwer Zwillinge zu konstruieren.) 2. Zwillingsresistenz: Es muss schwer sein (also kryptografisch Aufwendig) zu einer Nachricht m1 eine Nachricht m2 zu konstruieren, so dass H(m1 )FH(m2 ) ist. (Wenn man eine Bruder hat, dann ist es schwer eine zwillings Schwester dazu zu konstruieren.) (aufwendiger als erstens) 3. Urbildresistenz: Es muss schwer sein zu einem beliebigen Prüfwert h eine Nachricht zu konstruieren, so dass H(m) = h ist. 4. Die Prüfwerte müssen ’zufällig’ aussehen. Die Ausgabe von H genügt Anforderungen an einen Zufallszahlengenerator (gewisse statistische Unauffälligkeit), also pseudozufällig. Eigentlich müsste man noch mehr Fordern, nämlich dass man keine zwei Nachrichten findet die sehr ähnliche Hashwerte haben und dass man zu einer gegeben Nachricht keine Nachricht mit einem ähnlichen Hashwert findet... Beispiel H gute Prüffunktion |m| , n fix, so H(m) = |m| = n so ist H 0 (m) = 0||H(m)(H(m) rangehangen...) H 0 (m) = 1||m( rangehangen...) h ist die Länge der Prüfwerte von H 79 H 0 ist kollisionsresistent wenn es H ist, aber nicht urbildresistent To do: sortieren openssl 0.9.7d (2004) Prüfwertstandardverfahren ist MD5 Hashfunktion enthält eine ’Kompressionsfunktion’ m1 To do: Bild-siehe Blatt - 20090422 K(s, m) = s0 K(s, m) = K(s, m2 ) K(s1 , m1 ) = K(s2 , m2 ) s1 und s2 als Ergebnisse einer Prüfwertberechnung darstellen. K(s1 , m11 ) = s1 K(s01 , m21 ) = s2 K(s1 , m12 ) = s K(s2 , m22 ) = s der rechte Teil war 2004 schon bekannt, es musste nur noch die linke seite gelöst werden. 5.1.1 Schlüssellose Hashfunktion (Prüfsummen ohne Schlüssel) h : x −→ h(x) Ausschließlich Prüfwert. Gute Auswahl garantiert, dass man mit h(x) feststellen kann, ob x verändert wurde. x0 ist verändertes Dokument/Daten Berechnung des Prüfwerts liefert h(x0 ) = h0 , h(x) bei guter Hashfunktion. Veränderung kann also festgestellt werden. 80 Zusätzlich verlangte Eigenschaften 1. Kollisionsresistenz: Es ist schwer, Kollisionen zu erzeugen. D.h. es ist schwer x1 , x2 mit h(x1 ) = h(x2 ) zu finden. Heute üblich: n = 80 oder n = 100 280 oder 2100 in ∼ 280 Schritten. Definitiv: 256 ist nicht schwer, 264 ist nicht mehr so schwer. 2. Zwillingsresistenz / Zweites-Urbild-Resistenz / second preimage resistance: Es ist schwer, einen Zwilling zu erzeugen: ist x1 mit h(x1 ) vorgegeben, so ist es schwer, einen Zwilling x2 zu erzeugen mit h(x1 ) = h(x2 ). (Anmerkung: Finger weg von Binärcode für x1 , x2 .) 3. Einwegeigenschaft / Urbild-Resistenz: Es ist schwer, zu vorgegebenem h(x) ein Urbild x zu berechnen. h1 (x) ist eine gute Hashfunktion mit den schicken Eigenschaften 1, 2, 3. (n + 1 Bitlänge) ( h2 (x) = 1kx 0 k h1 (x) wenn x die Länge n hat sonst h2 (x) ist kollisionsresistent (Zwillingsresistenz) (wenn h1 so ist). h2 ist aber nicht urbildresistent. 1 k x hat als Urbild x. 2 ist die wichtigere Eigenschaft, man kann notfalls noch ohne 1 auskommen. Zum Beispiel letztes Jahr: MD5 - Hashfunktion x1 , x2 waren konstruiert h(x1 ) = h(x2 ) x1 ⊕ x2 = 0 . . . 010 . . . 010 . . . 010 . . . 01 (1 jeweils im msb). Immer noch ein gewisser Schutz, da zum Beispiel keine Kollision auf -Kleinbuchstaben oder 64 möglich. Schlüssellose Hashfunktionen sollten alle 3 Eigenschaften haben. Fast-Kollision: x1 ; x2 partielle Urbilder: h(x1 ) ⊕ h(x2 ) hat wenig 1-Bits. Manchmal zu vermeiden. Gegeben h(x), dann ist es schwer x bis auf wenige Bits zu bestimmen. SHA-1: theoretische Schwelle 280 , praktisch 269 (16.02.2005), 263 (19.08.2005) 23 Personen, die Wahrscheinlichkeit dafür dass 2 am gleichen Tag im Jahr Geburtstag haben ist größer als 21 . Geburtstagsparadoxon: h(x) =dd-mm, Mit k Personen x1 , . . . , xk lassen sich k2 Geburtstagspaare bilden. Mit n Tagen h1 , . . . , hn im Jahr lassen sich n2 Geburtstagspaare bilden, davon sind n gute ( (h, h0 ) mit h = h0 ) 81 mit k2 Paaren in n2 Paaren suchen und einen von n treffen. Hashfunktion hat 160 Bit Ausgabe, wir brauchen nach Geburtstagsparadoxon 280 Personen um mit hoher Wahrscheinlichkeit den gleichen Geburtstag h mit 160 Bit zu erhalten. Allgemeines Konstruktionsprinzip: x wird auf eine bestimmte Blocklänge erweitert (pad- ding) 1. Nullpadding (auffüllen mit Nullbits, falls erforderlich) 2. 1-Nullpadding (eine 1 und dann mit Nullbits bis zur Blocklänge) 3. 1-Null-Längenpadding (eine 1 und Nullbits (falls erforderlich) und die Länge (msb first, 64 Bit oder 128 Bit)). Am besten geeignet, da bei 1 oder 2 automatisch Kollisionen entstehen: x (mind. 1 bit kürzer als die Blocklänge) und x k 0. x → b1 , . . . , bk Blöcke der Länge 512 Bit. Häufig Verlauf in 3 Phasen, in openssl: init, update, final 1. Initialisierung der Hashfunktion: Innerer Zustand aus 32-Bit-Wörtern: H1 , H2 , H3 , H4 , H5 initialisiert (mit Primzahlen, π, was-auch-immer) 2. Update: A, B, C, D, E aus H1 , . . . , H5 . Runden mit Transformationen mit Eingabe bi , 48|60|120 . . ., H1 = H1 ⊕ A, H2 = H2 ⊕ B, . . . 3. Finalisierung: Ggbf. Padding; 1 oder 2 mal das Update. 4. Ausgabe: H1 , H2 , . . . H5 Einfaches Beispiel: 82 So lässt sich aus einem Kryptoalgorithmus ein Hashalgorithmus konstruieren. In der Praxis werden andere Konstruktionen (Quirlfunktionen) verwendet: MD5, SHA-1, SHA-2 (224, 256, 384, 512), Whirlpool. ISO-???? In OpenSSL: MD2, MDC2, MD4, MD5, RIPEMD-128, RIPEMD-160, SHA-0, SHA-1. Alle gebrochen, ausser RIPEMD-160 und SHA-1 (evt. MD2), d.h. es sind m1 und m2 bekannt mit MD5(m1 ) =MD5(m2 ) und m1 , m2 5.1.2 Demonstration Fälschung Ist die Hashfunktion ’schwach’ kann man Kollisionen sogar konstruieren. Beispiel für MD5, MD4 ist seit 10 Jahren schwach, SHA-1 wird schwach Zwei Postscript-Dateien mit unterschiedlichem Inhalt aber gleichem MD5-Hash. Prinzip: Datei 1: ...Header... if x1 == x2 then strangestring = "T1" else strangestring = "T2" end ...Rest... echo strangestring Quelltext: (B)(B)eq [tot] [Def] ifelse | {z } Bedingung 83 Datei 2: ...Header... if x2 == x2 then strangestring = "T1" else strangestring = "T2" end ...Rest... echo strangestring (A)(B)eq [Def] [tot] | {z } Bedingung x1 und x2 unterscheiden sich nur sehr wenig, und ...Header... if x1 und ...Header... if x2 sind je ein Nachrichtenblock mit dem gleichen Hashwert. Sieht aus wie zweites Urbild-Angriff, sind aber in der Tat zwei böse Zwillinge. Quelle: www.cits.rub.de/MD5Collisions Fazit: Dokumente sind nicht mehr unterscheidbar. Kollision besteht aus zwei Dokumenten d1 , d2 mit dem Hashwert. Bei MD5 kann man zwei ’Dokumente’ (Präfixe bis A,B) konstruieren, die den gleichen Hashwert haben. Man kann aber zu einem Dokument d0 (dem Original) noch nicht ein zweites d00 konstruieren, so dass d0 , d00 eine Kollision bilden. Beispiel: Ein SSL-Server-Zertifikat war (MD5) ununterscheidbar von einen SSL-Zertifizierungsstellen Zertifikat, womit man so viele (evt. ’böse’) SSL-Server-Zertifikate erstellen wie man wollte. MD5 ist nicht kollisionsresistent. MD5 ist noch 2 Urbild resistent. 5.2 Unterschied MD5 und SHA MD5 128bit Länge (Kollision 264 ) SHA-224 224bit Länge (Kollision 2112 ) SHA-256 256bit Länge (Kollision 2128 ) 84 ?mehr rotation? lokale Unterschiede habe größere globale Unterschiede zur Folge bei SHA ?? 5.3 Secure Hash Standard, SHA-2 FIPS 180-2, US-Standard, Nachfolger von FIPS 180 SHA-0 und SHA-1 sind die SHA-2-Algorithmen (noch nicht in OpenSSL): SHA-224, SHA-256, SHA-384, SHA-512. SHA-224 bzw. SHA-384 | {z } | {z } 32 Bit 64 Bit ist ungefähr‘ die linke Seite von SHA-256 bzw. SHA-512. ’ Basisfunktionen: ch (x&y)|(∼ x&z) Auswahlfunktion par x ∧ y ∧ z Paritätsfunktion maj (x&y)|(x&z)|(y&z) Mehrheit Ausserdem: Addition modulo Wortlänge, rot left und shift left. Message M1 , M2 , . . . , MN padding 1. padding.length auf 512/1024 Bit. 512 32 = 16 = 1024 64 2. Messageblock (16 Stück) wird erweitert: W , W , W2 , . . . , W15 , . . . W79 | 0 1 {z } Messageblock Wt = rot(Wt−3 ) + rot(Wt−8 ) + rot(Wt−14 ) + rot(Wt−16 ) für t = 16, . . . , 79 rot(x) = rotl7 (x) + rotl18 (x) + shl3 (x) 3. 8 temporäre Variable a, b, c, d, e, f, g, h mit Breite gleich Wortlänge (32 oder 64 Bit) beschreiben einen inneren Zustand der Funktion SHA-Maschine bekommt initialen Zustand H0 , . . . , H7 : Die ersten 32 Bit der gebrochenen Anteile der Quadratwurzeln der i. Primzahl. Für SHA-256 und SHA-512: i = 1, . . . , 8; für SHA-384 und SHA-224: i = 9, . . . , 16 85 Am Anfang jeder Runde: a = H0 , b = H1 , c = H2 , . . . Jedes Wi erzeugt einen Schritt (kleine Zustandsänderung) T 1 = h + rot(e) + ch(e, f, g) + Kt + Wt T 2 = rot(a) + maj(a, b, c) h = g, g = f, f = e, e = d + T 1 , d = c, c = b, b = a, a = T 1 + T 2 K0 , . . . , K80 Schrittkonstanten. Bruchteile der dritten Wurzeln der ersten 80 Primzahlen. 80 Schritte in einer Runde 4. XOR-Operationen H0 , H1 , . . . , H7 −→ H0 ⊕ a, H1 ⊕ b, . . . , H7 ⊕ h Hi beschreiben den inneren Zustand nach Runde. Hi am Anfang initialisiert 5. Ausgabe ist H0 , . . . , H7 am Ende. To do: wäre auch interessant für die Prüfung Es wird eine neuer SHA-3 gesucht, Voraussetzungen: 1. Nachrichtenexpansion muss komplexer werden 2. Nachrichtenblöcke müssen positionsabhängig werden (Skein tweakable 3. innerer Zustand muss größer werden (2x Hashlänge) 5.3.1 Problem bei MD5 und SHA-0 Innerer Zustand zwischen einzelnen Schritten hat Bits, die die folgenden Bits mehr oder weniger beeinflussen. Damit sinkt die Komplexität beim Brechen. Besondere Bits führen zur Reduktion der Anzahl der Gleichungen und erlauben eine schnelle Konstruktion von speziellen Zwillingen. m1 , m2 mit MD5(m1 ) =MD5(m2 ) m1 ⊕ m2 = viele Nullen Beispiel 1: Parallel hashen: Kontostand -200,73“ und Kontostand +700,...“. Ab -2 bzw +7 entstehen un” ” terschiedliche innere Zustände. Nachkommastellen bei dem zweiten String anpassen um die Unterschiede auszugleichen. 86 Aktuelle Angriffe erzeugen keinen zweiten Zwilling, sondern ’nur’ falsche Zwillinge. Zu einem guten gibt es keinen schlechten Zwilling. Es gibt zwei Zertifikate mit unterschiedlichen Inhalten und gleichem MD5-Hash. Das sind dann aber 2 schlechte Zertifikate. MD5 ist also nicht kollisionsresistent, aber momentan zwillingsresistent. Beispiel 2: SHA-1 hat momentan eine Komplexität von 263 anstelle von 280 für Kollisionen. m, H(m) (H(m) aus vertrauenswürdiger Quelle) ⇒ m kann nicht unbemerkt verändert werden. Manipulation Detection Codes (). Das ist keine Prüfung des Ursprungs. Um zu prüfen, ob m aus einer bestimmten Quelle stammt benutzt man MACs. 5.3.2 MACs (Message Authentication Codes) (Prüfsummen mit Schlüsseln) Sei k ein geheimer Schlüssel den nur Alice und Bob kennen. m ist die Nachricht. Berechne Hk (m) = h keyed Hash. Die Hash-Prüfwerte sind also Schlüsselabhängig. (m, h) mit h aus vertrauenswürdiger Quelle: • Veränderungen sind erkennbar • Nur mit Kenntnis von k kann man h berechnen, also nur mit dem Schlüssel kann man den Prüfwert fälschen. Empfänger der k kennt kann n auf Integrität prüfen. Um sich vor Angreifern zu schützen muss für eine Prüfung der Prüfwert geschützt werden. ? Hk (m0 ) = h (m1 , h1 ) → (m, h) muss verhindert sein (m2 , h2 ) 87 Standardisiertes Verfahren für Keyed hash auf der Basis von MDCs: RFC 2104, in OpenSSL zu finden: HMAC). H(k ⊕ äußeres Padding k H(k ⊕ inneres Padding k m)) | {z } 512- oder 1024-Bit-Blöcke k linksbündig, aufgefüllt mit Nullen, inneres Padding = 0x36, 0x36 . . ., äußeres Padding = 0x5c, 0x5c, . . . . Längenpadding am Ende des inneren H. Berechnen Sie mit OpenSSL und dgst -c oder -hex den Hashwert der leeren Datei. henryk@gleam henryk $ openssl dgst -c -hex -md5 /dev/null MD5(/dev/null)= d4:1d:8c:d9:8f:00:b2:04:e9:80:09:98:ec:f8:42:7e henryk@gleam henryk $ openssl dgst -c -hex -sha1 /dev/null SHA1(/dev/null)= da:39:a3:ee:5e:6b:4b:0d:32:55:bf:ef:95:60:18:90:af:d8:07:09 openssl dgst -sha256 -hmac 1234567890 /dev/null HMAC-SHA256(/dev/null)= ba92e0bfa35d8a018831f3675f0b4314c8468d4d96e6981b85ba3390 HMAC To do: vervollständigen? Mac mit Hashfunktion, K- Schlüssel, H-Hashfunktion 0x5656...56 z }| { K ⊕{z iPad H(K ⊕ oPad, H(| }, n)) Bitlänge H K, n1 → Mac(n1 , K) = m1 K, n0 = n1 ||längenpadding ||n2 (K, n0 ) → HInitialisiert mit m1 (n2 ) = m2 ISO-10118-3:2004 88 5.4 Whirlpool Basis für eine Hashfunktion, ausgehend von einer einzigen Verschlüsselungsfunktion. Aus der Wikipedia (unter GNU Free Documentation License): WHIRLPOOL ist eine kryptografische Hash-Funktion, die von Vincent Rijmen und Paulo S. L. M. Barreto entworfen wurde. Sie wurde nach der Whirlpool-Galaxie im Sternbild der Jagdhunde benannt. Whirlpool funktioniert mit Daten von weniger als 2256 Bit Länge und gibt einen HashWert von 512 Bit aus. Die Autoren haben erklärt, dass Whirlpool nicht patentiert ist und es nie sein wird. Whirlpool darf kostenlos zu jedem Zweck verwendet werden. Die Referenz-Implementation ist gemeinfrei. The WHIRLPOOL algorithm has undergone two revisions since its original 2000 specification. In the first revision in 2001, the s-box was changed from a randomly generated one with good cryptographic properties to one which has better cryptographic properties and is easier to implement in hardware. In the second revision (2003), the diffusion matrix was changed. People incorporating WHIRLPOOL will most likely use the most recent revision of WHIRLPOOL; while there are no known security weaknesses in earlier versions of WHIRLPOOL, the most recent revision has better hardware implementation efficiency characteristics, and is also likely to be more secure. m i-1 AES-Variante E H i-1 + Hi 5.5 Zusammenfassung To do: oben einsortieren? 89 Manipulation Detection Codes MDCs: Hashfunktionen: MD5/SHA-1/SHA-2 Allgemeines Konstruktionsprinzip aus Längenpadding und Iterationen • MACs/Keyed Hash: HMAC mit Hashfunktion aufgebaut aus prefix und suffix • CBC-MAC: Nachrichtenblöcke m0 , m1 , ..., mk m1 m0 + mk ... + K c1 c2 c k+1 MAC Risiko: Weil keine Längeninformationen dabei sind, ist es anfällig gegen Einsetzen und Austauschen. Wird gerne Verwendet bei Anwendungen, die feste Längen haben, z.B. Chipkarten. CBC-MAC-verbessert: ... DES K1 K2 K3 ←− CBC-DES3-MAC Benutzt z.B. beim digitalen Tachograph. Es gibt zwei Grundlegende technische Mechanismen: Ohne Schlüssel und mit Schlüssel. Nur mit Schlüssel lässt sich später der richtige MAC-Wert ausrechnen und bestimmen, dass die Nachricht nicht verändert wurde und vom richtigen Absender kommt. 90 5.6 Digitale Signaturen To do: einsortieren Definition: s ist die Signatur zu einer Nachricht n mit einem Signaturverfahren S und einem Verifikationsverfahren V S :N× D |{z} → {s} Signaturschlüssel V:N× E |{z} ×{s} → {ja, nein } Verifikationsschlüssel V(n, e, S (n, d)) = 1 V(n, e, S (n0 , d)) = 0 =( n, e0 , S (n, d)) = 0 RSA: S (n, d) =? V(n, s, e) = {E(e, s)eqH(n)} openssl dgst -sign key.rsa -hex null.txt openssl -sign key.rsa -sha256 -out null.sig null.txt openssl rsautl -in null.sig -encrypt -inkey key.rsa -raw -hexdump in Beta: openssl sha256 -hex null.txt Anstatt der Symmetrischen Verschlüsselung wie bei MAC, kann man auch asymetrische Verfahren verwenden. 1. h mit Namen (0,D) in ASN1 Struktur 0001 FF . . . FF 00 (ASN1-Struktur) 2. Padding 3. ’Entschlüsseln’ 4. ’Verschlüsseln’ 5. ASN1 Struktur Hash OID Wert rausziehen 91 6. vergleichen { 0, 1 } openssl hatte in den früheren Versionen einen Fehler in der Signaturprüfung: langer RSA Schlüssel exponent e klein (3) lange Signatur S S3 = h wenn h sehr lang ist konnte man folgendes machen: h= (0001FF00ASN1 ’müll’) man konnte den ’Müll’ so verändern das h = s3 (also so lange veränder bis h dritte Wurzel von s ist) Es wurde nicht überprüft ob am Ende der ASN1-Struktur auch das Ende der Daten ist. siehe Webseite RSA Zertifikate mit Exponenten 3 To do: alt: Digitale Signaturen schützen die Integrität und die Authentizität. Wir betrachten hier welche, die auf asymmetrischen Verfahren basieren. Symmetrische gibt es, werden aber in der Praxis nicht benutzt. Es gibt 2 Typen: 1. RSA 2. DSA 5.6.1 RSA m = p · q (2048 Bit) Exponent e klein (64 Bit) Exponent d groß mit e · d ≡ 1 mod (p − 1)(q − 1) x → c = xe mod m (öffentlich) cd ≡ x mod m (geheim) xed ≡ x 92 Man rechnet zuerst x → s = xd mod m: Das kann nur derjenige, der über den privaten Schlüssel d verfügt. Aus s rechnet man se mod m = (xd )e mod m ≡ xe·e mod m = x. Bei RSA können wir die Rolle vom privaten und öffentlichen Algorithmus vertauschen, so dass folgt: Nur wer d kennt, kann zu x ein s erstellen, so dass se ≡ x mod m ist. Anwendung dafür: Digitale Signatur. Wir haben Nachricht M und erstellen daraus einen Prüfwert H(M) mit einer Hashfunktion und rechnen H(M) = x −→ s = xd mod m Dann ist (M, s) das digital signierte Dokument M (und s die Signatur). To do: einsortieren neu: Signatur mit Anhang (with appendix) (m, sig)-Signierte Nachricht Ver(v, m, sig) Signatur mit Nachrichtrückgewinnung (with (partial) message recovery) (m1 , m02 ) = m0 , so dass m02 ein Teil der Nachricht m = m1 ||m2 enthält. Ver(v, m1 , m02 ) (partial recovery) Ver(v, −, m0 ) (complete recovery) In RSA: PKCS#1 ver. 1.5. Signatur mit Appendix PKCS#1 ver 2.1 (noch nicht in OpenSSL) To do: ende einsortieren ? Prüfung: (M, s) → H(M) = x. Ist se mod m = x. Nur wer das d hat, kann das Paar (M, s) erstellen und ist damit Inhaber des Dokuments. 5.6.2 Eigenschaften eines asymmetrischen Verschlüsselungsverfahren Alice kennt den öffentlichen Schlüssel von Bob. Bob kennt seinen geheimen Schlüssel. 93 Alice1,2,3,... öffB Bob gehB EöffB (m) = c → DgehB (c) = m Alice gehA → MS geh Bob1,2,3,... öffA % → & (m, s) A ( Vöffa (m, s) = 0, ungültig 1, gültig Mehrere Alices können an Bob schreiben. Entschlüsselung mit dem geheimen Schlüssel von Bob. Hier wird eine Nachricht, so verschlüsselt, dass man die Nachricht aus c zurückgewinnen kann. Alice sendet an alle Bobs. Hier wird ein Paar erzeugt, dass in einen Verifikationsalgorithmus gestopft werden kann, der dann ja oder nein sagt. Es ist Zufall, dass man mit RSA sowohl einen Verschlüsselungsalgorithmus, als auch einen Signaturalgorithmus erstellen kann! Mit anderen geht das nicht! Hätte man nicht die Urbildresistenz der Hashfunktion könnte man ein s nehmen und dazu ausrechnen se mod m = x, jetzt könnte man zu dem x ein Urbild M ausrechnen und bekäme ein Paar (M, s), dass gültig signiert ist. Dazu kommen in Wahrheit noch Padding und Objekt Identifier, der angibt, womit signiert wurde und Parameter. 30 = SEQUENCE 06 = OID 2B 0E 03 02 1A = SHA1 2A 86 48 86 F7 0D 01 01 01 = rsaEncryption 05 = NULL, Bezeichner für die leere Menge, hier bedeutet es: keine Parameter 04 = OCTET STRING 02 = INTEGER 03 = BIT STRING Schema: Tag, Length, Value Das ganze lässt sich mit openssl asn1parse erfahren (asn1 = Abstract Syntax Notation 1). Schlüssel immer: SEQUENCE, SEQUENCE, OBJECT, PARAMETER, BIT STRING bzw. Sequence aus OID und Bitstring. Das erste Byte in einem Bitstring gehört nicht zum Bitstring dazu, sondern gibt die Nummer der von hinten ungenutzten Bits an. OID-Liste: http://www.alvestrand.no. h M −→ H −→ 00 01 FF . . . FF 00 b SHA-1 Padding c b Identifier H c Padding nach PKCS#1 v1.5 Oktetstring ASN.1: Objektidentifier für SHA-1 (1.3.14.3.2) wird als 2B 0E 03 02 1A codiert. 94 x.y.a.b.c.d ↓ bx · 40 + yc babcdc 1 Byte (Dot-Notation) Byte (Oktett) 1.2.840.113549.1.2.7 als Übungsaufgabe. 5.6.3 RSASSA-PSS-Padding SSA Signature Scheme with Appendix PSS Probabilistic Signature Scheme RFC 3447 (siehe figure 2) M l(M) <= 2^(64)-1 bei SHA-1 h 0000 ... 01 salt 8 zero salt 20 Byte + 00 MGF h maskiertes seed Bits zu 0 setzen soviele, dass die Eingabe kleiner als der Modul wird 20 Byte BC 1024 Eingabe für die Signatur To do: start einfügen MGF-Maskengenerierungsfunktion (beruht auf der Hash-funktion) 95 Nullung MGF ⇒ DBmask, dann DB ⊕ DBmask −−−−−−→ maskedDB Nullung-Nullung der oberen Bits, so dass maskedDB kleiner als Modul ist Signieren: (EMSA-PSS)+(RSA-Verschlüsselung) Verifikation: (RSA Op) 1. RSA-Operation 2. EM Prüfung ob BC am Ende H abspalten und mit MGF DBmask erzeugen XOR mit Rest von EM DB0 = 0000 |{z} 00...01 Salt Nullungsfehler Hash ? 00 Label mhash Salt −−−−→ H 0 = H Jede Eingabe in die RSA-Operation ist pseudo zufällig. (Jede Eingabe hat einen neuen Signaturwert) Angenommen man wendet die RSA-Operation direkt auf m an: m0 -Signatur m0 = md mod n m1 , m2 m1 → m01 mod n = m01 m2 → m02 mod n = m02 Verifikation (m1 , m2 ) mod n → (m1 · m2 )d = md1 ṁd2 = m01 · m02 mod n (’Man kann mit zwei Signaturen eine andere erzeugen?!’) 96 To do: ansehen Unsicher, zeitaufwendig, kann leicht gebrochen werden. m → m0 = md mod n re = r0 mod n chosen message m · r0 → (m · r0 )d mod n = md · red mod n = m0 · r mod n (m0 · r) · r−1 mod m = m0 (sieht nach Zufallszahlen aus, aber die kann man auf eine vorher gewählte Nachricht zurückrechnen...) To do: ende einfügen Nachricht M mit |M| < 264 − 1 wird mit Hashfunktion h gehasht. Davor kommen 8 Zerobyte, danach ein Saltwert (Saltwert wird benötigt für die Auswertung der Signatur und wird versteckt in der Signatur). Auf das Gesamte wird die Hashfunktion h erneut angewendet. Verstecken des Saltwerts: --0000 (→ eventuell leer) 01 salt-- ⊕ mit einer Maske gebildet aus dem Hashwert und einer Maskengenerierungsfunktion. An den Anfang der Eingabe für die RSA-Signatur werden 0-Bits so gesetzt, dass die Eingabe für die RSA-Signatur kleiner als der Modul ist. Wenn m volle Bytelänge hat, wird das oberste Bit gleich 0 gesetzt (RSA-Signatur: ()d mod m mit m = p · q). An das Ende der Eingabe für die RSA-Signatur wird BC angehängt. Durch den Saltwert wird das Ergebnis zufällig und schwer vorhersagbar. Wird leider nicht oft verwendet, da die Maskengenerierungsfunktion Chipkarten teuer machen würde. Es existiert eine DIN Variante zum v1.5 PKCS1: DIN-RN-Padding: 00 02 Zufallsbytes(ohne 00) 00 Identifikator Oktettstring 5.6.4 DSA Vergleich ElGamal und elliptische Kurven: K-elliptische Kurve y2 = x3 + ax + b mod p 97 p-Primzahl (, 2, , 3) Punkte auf der Kurve bilden eine Gruppe E(k) P + Q = R, k · G ∈ E(k) G ein Punkt (Generator) mit großer Ordnung n 1 · G, 2G, 3G, ..., |{z} n ·G = 0 sehr groß n ist eine Primzahl und G, 2G, ..., nG = 0 ist die gesamte Gruppe E(k). Signaturschlüssel t-zufällig aus 1, ..., n − 1, Verifikationsschlüssel ist P = t · G Standard FIPS 186-3 → finde den Fehler To do: ende einfügen p, g Generator, g p−1 ≡ 1 mod p, g p−1 x . 1 mod p Geheimer Schlüssel x, öffentlicher Schlüssel y = g x mod p. k (gk , m · yk ) = c Parallel bei elliptischen Kurven: G geheim: x, öffentlich: Y = x · G (k · G, m · k · Y) DSA, auch bekannt als DSS: FIPS-186. Primzahl p (hat z.B. 1024 Bit, im Standard variabel), so gewählt, dass p − 1 einen Primteiler der Länge 160 Bit enthält. q|p − 1 mit |q| = 160 Bit Ausserdem: Es gibt einen Generator g mit der Eigenschaft gq ≡ 1 mod p. Das findet man, indem man einen h Generator in mod p auswählt und g = h p−1 q , h p−1 ≡ 1 mod p ausrechnet. x geheimer Signaturschlüssel mit 160 Bit, g x mod p ist der öffentliche Schlüssel. Signaturerstellung: Nachricht M. Hashwert h(M) = H ausrechnen. Generiere Zufallszahl k mit 160 Bit (k ∈ 1, ..., n − 1) und berechne To do: neu k · G = (x, y) r = x mod n 98 s = h−1 · (h + tr) mod n (r, s) ist die Signatur To do: ende neu r = (gk mod p) mod q und s = (k−1 (H + x · r) mod p) mod q. r und s sind Exponenten für mod p, werden aber nochmal mod q genommen um Platz zu sparen. (r, s) wird die Signatur werden. (s . 0 mod q, r . 0 mod q) Signaturverifikation: Berechne w = s−1 mod q u1 = H · w mod q u1 = H · w + i · q u2 = r · w mod q Berechne gu1 · yu2 −1 ≡ gH·s · g x·r·s −1 −1 −1 ≡ gH·k(H+x·r) · g x·rk(H+x·r) ≡ gH·k·(H+x·r) −1 +x·r·k(H+x·r)−1 −1 ≡ gk·(H+x·r)·(H+x·r) ≡ gk mod p ? Prüfe also ob (gu1 · yu2 mod p) mod q ≡ r Die Signatur zu M ist (r, s) mit r und s haben 160 Bit, so dass man 320 Bit Signatur hat (kleiner als die 1024 Bit Signatur von RSA). Um den geheimen Schlüssel zu bestimmen, muss man den diskreten Logarithmus mod q berechnen und das gilt als schwer. 5.6.5 ECDSA - DSA mit Elliptischen Kurven K - elliptische Kurve mit Punkten mod p G - Generatorpunkt, G hat Ordnung q [q · G = 0], q Primzahl x - Restklasse mod q, Y = x · G r = [(k · G)1 ] mod q (→ 1. Koordinate mod q), s = k−1 (h + x · r) mod q; [u1 · G + u2 · Y]1 ? mod q ≡ r 700 Bit für alle Parameter 99 To do: neu ECDS DSA Generator G gq = 1 mod p g dA = [1, q − 1] zufällig Signatur PA = dA · G auf E pA = gdA mod p k ∈ [1, q − 1] r = x mod q r = (gk mod p) mod q s = k−1 · (h + dA · r) mod q h ist genauso lang wie q (gleiche Bitlänge) h sind die linken Bits von H(n) (Bem.: RSA ist bei Elipt. Kurven nicht einsetzbar, deshalb ist DSA eine gute alternative.) link: draft-lochter-pkx-brainpool-ecc-03 - eine art RFC zu Brainpool openssl ecparam -name brainpoolP256r1 -param_enc explicit -noout n o E = (x, y) y2 = x3 + Ax + B mod p Dann ist G = 04x....... (in einer Prüfung wäre interessant zu wissen, was das führende Byte bedeutet und welche Varianten es gibt) openssl ecparam -name brainpoolP256r1 -genkey -param_enc explicit -noout > ec.key (pub - öffentlicher Punkt) openssl dgst -sha256 -sign ec.key ec.key > ec.sig xxd -p ec.sig openssl asn1parse -i -in ec.sig -inform DER Man erhält die beiden Integers r und s. (Bem: bei Eliptischen Kurven ist die Bitlänge kürzer, da Algorithmen höhere komplexität als so 100 haben) (Hausaufgabe: erzeuge zwei Kurven (512Bit - Brainpool bzw. 521 NIST) mit anderen Hashfunktionen (md,ripemd, whirlpool...); Signatur (r,s); ) (Bem.: siehe Wikipedia El. C. DSA: r=0 Abfrage, weil sonst dA keine Rolle spielt, s= 0 Abfrage, weil man sonst mit −z = r · dA mod q den geheimen dA ausrechnen kann) [Spickzettel zur HA: h-linke Bits des Hashwertes n1 = h · s−1 mod q n2 = r · s−1 mod q V = n1 · G + n2 PA = (x, y) r = x mod q v = gn1 · pn12 mod p r = v mod q? (r → 0, 1 jeweils) h · s−1 · G + rs−1 PA = h(k(k + dA r)−1 · G + r(k(h + dA r)−1 )dAG = (hk + rkdA )(h + dA r)−1G = V = k (h + rdA ) · (h + dA r)−1 G | {z } =1 = k·G ] Magma: p:=StringToInteger(’....’,16); a:=StringToInteger(’....’,16); b:=StringToInteger(’....’,16); IntegerRing(p); E:=EllipticCurve([K!a,K!b]); G:=E![K!StringToInteger(’...1.Hälfte Generator..’,16), 101 K!StringToInteger(’..2.Hälfte Generator..’,16)]; Jetzt kann man rechnen: q*G eq E!0; true ——– q*G; (0:1:0) ——— Kq:=IntegerRing(q); dA:=1+Random(q-2); PA:=dA*G; \#Prüfung ob ungleich Null fehlt noch h:=K!12121212121212121212121212121; k:=1+Random(q-2);\#+1,damit keine Null rauskommt X:=k*G; x:=X[1]; r:=(IntegerRing()!x) mod q; s:= (Kq!k)ˆ(-1) * ((Kq!h)+ r *dA) r,s; \#Verifikation: u1:=h*(Kq!s)ˆ(-1); u2:=r*(Kq!s)ˆ(-1); 102 Y:=(IntegerRing() !u1)*G+( IntegerRing() !u2) *PA; Y; ((IntegerRing() !Y[1]) mod q) eq r; =⇒ siehe Verzeichnis Prüfen ob Openssl gut gerechnet hat. OpenSSL: wie erzeugt man den öffentlichen Schlüssel openssl ec -in ec.key -pubout openssl ec -in ec.pub -pubin -text -noout -pverify To do: neu-ende To do: neu-20090617 Bem.: Attributes muss die leere Menge sein und darf nicht weggelassen werden. SHA1 nur noch zur Unterscheidung benutzen. 5.7 Widerrufen von Zertifikaten siehe rfc5280 S.53 Erste Sperrliste: Ist eine Liste in der die Nummern der gesperrten Zertifikate stehen. Beispiel CA erstellen perl ˜/opt/openssl-1.0.0-beta2/apps/CA.pl -newca ... 103 Zertifikat für den Nutzer erstellen: perl ˜/opt/openssl-1.0.0-beta2/apps/CA.pl -newreq ... Signieren: perl ˜/opt/openssl-1.0.0-beta2/apps/CA.pl -xsign > ay.pem ... Man kann noch weitere Zertifikate erstellen, allerdings wird dann der pem Key gelöscht. Man kann dann feststellen, dass die Seriennummer nur um eins erhöht wird. Man kann auch openssl ca -gencrl benutzen und dabei die Seriennummer selber angeben. openssl crl -text -in crl1.pem -noout Zertifiziert wird nur der Teil zwischen Certificate Rev List bis No Revok. Cert. Da dieser Teil sehr klein ist, ist es recht schwer Kollisionen mit SHA1 dafür zu konstruieren. Dann gibt es noch Informationen wann es die nächsten Updates gibt (Last Update, Next Update (optional?)). Alte Sperrlisten bleiben aber Gültig, die neuen gelten nur zusätzlich. Zertifikat ungültig machen: openssl ca -gencrl -out cr13.pem -revoke demoCA/certs/F8C...85.pem -crl_reason keyCo aktualisieren: openssl ca -gencrl -out cl4.pem -crlhours 12 Nun nachsehen mit: openssl crl -text -in crl4.pem -noout To do: neu-ende 104 5.8 Was es noch so gibt 5.8.1 blinde Signaturen Gut für anonymes digitales Geld. Normalfall: Bank kriegt digitalen Scheck, belastet das Konto und schickt einen von ihr signierten Scheck zurück. Problem: Wenn derjenige der den Scheck später einlösen will zur Bank geht kann diese den Scheck zum Aussteller zurückverfolgen. Mit anonymen Signaturen: Aussteller erzeugt viele (zum Beispiel 1000) unterschiedliche Schecks, mit je einer Zufallszahl und dem gleichen Betrag, aber ohne Name, Kontonummer, etc. Diese 1000 sendet er verschlüsselt an die Bank. Die Bank sucht sich zufällig (das ist wichtig) 999 davon aus und fordert für diese den Schlüssel an. Die Bank entschlüsselt diese Schecks und überprüft ob überall der gleiche Betrag drinsteht. Wenn ja, dann ist davon auszugehen dass auch der auf den gleichen Betrag läuft. Das Konto wird entsprechend belastet und der Scheck wird blind (also ohne hineinzusehen) signiert und dem Aussteller zurückgeschickt. Der packt den Scheck aus (wobei die Signatur gültig bleibt) und hat jetzt einen von der Bank signierten digitalen Geldschein den die Bank nicht mehr zurückverfolgen kann. 5.8.2 anonyme Signaturen Beispiel: Elektronische Wahlen, wo man nicht möchte, dass man weiß, wer es unterschrieben hat. 6 Zertifikate To do: neu-20090520 m → Signatur und Verifikation m0 → Signatur und Verifikation Vertrauen in den öffentlichen Schlüssel Schützen den Schlüssel durch Prüfwert, den Prüfwert Schützen wir durch eine Signatur. Vertrauen eines Schlüssel überträgt sich an einen anderen. Das ganze scheint sich im Kreis zu drehen. Aber es handelt sich um einen Graph. (Der Graph muss nicht transitiv sein - A vertraut B, B vertraut C aber A vertraut nicht unbedingt C.) Z.b. Baum mit Wurzel (PKI), dann gibt es 105 vertrauens-Normen, die den Ebenen eines Baumes entsprechen. Die andere Variante ist das PGP Web of Trust, bei dem der Baum ungeordneter ist und eine Art Vertrauensbereiche hat. Dass eine Zertifizierungsstruktur funktioniert, braucht es klare Regeln für den Umgang mit Zertifikate. Standards: ANSI X509 X500 openssl internet Profil RFC 5280 (alt: 3280, 2459) Definition: Zertifikat bindet (durch Signatur) einen öffentlichen Schlüssel an einen Namen (Subjekt). (siehe rfc5280 S.16 - Certificate::= SEQUENCE ... und TBSCertificate...) (in TBSCert... erscheint ’signature’ recht früh damit schon mit dem Hash-Algorithmus begonnen werden kann, aber warum steht in Certificate dann nochmal signature? -Bessere Ordnung?) Zertifikat bei CA-cert runterladen und dann mit openssl ansehen: openssl x509 -in class3.crt -text -noout openssl asn1parse -i -in class3.crt Zur ausgabe des ersten (siehe auch rfc5280): Version: es gibt momentan 3 Versionen Serial Number: ist ein Integer, kann so groß sein, das man nicht mehr in den Hash-Block mehr kommt (bis 20 Byte geht) Bundesnetzagentur.de 15549.pdf sagen dass Serien Nummern mindesten 20 Bit Entropie enthalten sollen, damit SHA-1 bis 2010 benutzt werden kann. (’Qualifizierte Signatur’) To do: siehe 6.0.6 Gültigkeit validity: Wird oft als Gültigkeitszeitraum übersetzt, was aber nicht ganz richtig ist, da nur angegeben wird, wann das Zertifikat nicht gültig ist. Besser wäre ’nicht Gewährleistungszeitraum’. 106 Die validity gibt (nach dem Standard) den Zeitraum an, in der die CA gewährleistet, aussagen über den Zustand des Zertifikats zu geben. (Gültig ODER nicht Gültig - deshalb muss das Zertifikat also nicht unbedingt gültig sein) To do: neu-ende To do: neu-20090527 Bemerkung: In der Objects.txt findet die Object-Identifier die OpenSSL kennt. To do: neu-20090527-ende Signatur: Anwendung eines Schlüssels. Ob der Signaturersteller eine bestimmte Person ist, ist damit nicht klar. Immer gleichzeitig Authentizität des Schlüssels prüfen. Dazu gibt es zwei Möglichkeiten: 1. Anarchie = Web of Trust (Beispiel: PGP) 2. Vertrauenswürdige dritte Instanz: Certification Authority, CA bzw. ZDA (Zertifizierungsdiensteanbieter). Stellt ein Zertifikat aus, das ist ein elektronisches Dokument, welches eine Identität einem Schlüssel zuordnet. Zertifikat: (Name, Schlüssel, . . .) und Signatur Problem: Im Zertifikat steht Name, Schlüssel usw. und daran hängt eine Signatur. Gegeben Nutzer Alice mit Zertifikat, darüber gibt es die CA1, die ihre Signatur zertifiziert CA1 hat selber ein Zertifikat mit einem Namen, Schlüssel usw. und daran hängt wieder eine Signatur. Das Problem verschiebt sich immer weiter nach oben. Man bekommt eine Zertifikatshierarchie und benötigt einen aufgeblähten Riesenbaum mit einer Weltwurzel. Im täglichen Leben haben sich 3-stufige Zertifikatshierarchien bewärt. Root signiert seine eigene Signatur. Vertrauen in Authentizität der Nutzerschlüssel ist für alle Nutzer gleich. Es bestimmt sich ausschließlich durch die Authentizität des Schlüssels des Root CA. Das Vertrauen in die Root CA verteilt sich auf die Nutzer. 6.0.3 X509 X509, mittlerweile bei ISO. RFC 3280: X509 Certificate and Certificate Revocation List (CRL) Profile. Abschnitt 4. Version: X509v3. Version 1 enhält keine Erweiterungen. Serial Number: In der Regel 20 Byte, muss immer eindeutig sein. 107 Signaturverfahren: für das Zertifikat, muss am Anfang (im ersten Block) stehen damit das Hashen schon begonnen werden kann. Herausgeber: Name(eindeutig): C=Country, O=Organisation, CN=Common Name, SN=Surname, ... Validity: Gültigkeitszeitraum, der Zeitraum indem die CA Gültigkeitsinformationen über das Zertifikat bereitstellen will/wird/muss Inhaber: Name (eindeutig im Bereich der CA) zur Person, also stabile Daten: Seriennummer, Versicherungsnummer, etc. Schlüsselinformationen Erweiterungen Darunter die Signatur In RFC 3280 steht, dass nach dem 31. Dezember 2003 alle Zertifikate UTF-8 kodiert sein müssen. 6.0.4 Erweiterungen Man kann bei Erweiterungen festlegen ob diese Critical oder nicht sind. Critical ist sowas wie eine Vorschrift, nicht Critical ist sowas wie eine Information. Kritische Erweiterungen müssen immer ausgewertet werden, wenn ein Programm sie nicht versteht darf es das Zertifikat nicht verarbeiten. To do: neu Per default auf false, ist außerdem optionales Argument. Wenn nicht critical dann ist es nur eine Information. Also critical muss man lesen und verstehen, nicht critical sollte man lesen, wenn man sie versteht sollte man sich daran halten. To do: neu ende Basic Constraints To do: neu Sagt ob es Zertifizierungsinstanz ist, oder eine Endnutzer Instanz ist und in welcher Ebene es sich befindet. To do: Diagramm basteln 108 Ein interessantes Beispiel (goya.crt) findet man bei der Rechnerbetriebsgruppe. To do: neu-ende CA Siginalisiert ob es ein CA-Zertifikat ist (TRUE) oder nicht (FALSE). D.h. ob das Zertifikat berechtigt ist, weitere Unterzertifikate auszustellen. To do: neu Per default false, es müsste also nicht jedesmal CA: FALSE angegeben werden. To do: neu-ende PATHLEN Beschränkt die Pfadlänge. Pathlen=0 heisst dass das Zertifikat zwar Nutzerzertifika- te ausstellen kann, aber keine weiteren CA-Zertifikate. Ist immer als Critical markiert. Subject Key Identifier und Authority Key Identifier Nicht kritisch. Beschreiben die verwendeten Schlüssel über Hash-Werte, zum Beispiel SHA-1 über den Schlüssel. Kritisch (sollte kritisch sein, z.b. bei GOYA nicht). Ist ein Bitstring der die Verwendung des Schlüssels angibt. Für eine CA also zum Beispiel nur KeyCertSign. NonRepudiation ist eigentlich für die Dokumentsignatur (content commitment). DigitalSignature ist für Authentisierung oder allgemeine Signaturmechanismen. Die beiden möglichst exklusiv setzen. Key Usage To do: neu Nicht bei Endnutzerzertifikaten nötig. To do: siehe rfc5280 - KeyUsage -HA lesen Merkmale : (0) DigitaleSignatur zur Authentifizierung (hat keine Auswirkungen auf spätere Zeiträume?) (werden zu dem aktuellen Zeitpunkt geprüft) (1) (ab X.509v4) Inhaltsbindung[contentCommitment] (z.b. Nichtabstreitbarkeit ?) (jetzt noch [nonRepudiation]) (werden zu dem Zeitpunkt zu dem sie erstellt worden sind geprüft) (0) und (1) sind Endnutzerinformationen nur ent-/verschlüsseln, Schlüssel zum verschlüsseln von Zertifikaten geignet 109 keyCertSign==TRUE - wenn man nur Zertifikate damit signieren möchte (brauch man bei CA Zertifikaten, eigentlich sollte nur eines der Bits gesetzt sein) ansonsten sollte digitalSignature gesetzt werden Key usage z.B. A0=10100000 (Erste und dritte gesetzt) oder z.B. 88=10001000 (erstes und fünftes gesetzt). authority information Nicht kritisch. Feld in dem Daten des Herausgebers abgerufen werden können. Benutzt das OCSP-Online Certificate Status Protocol. (gibt eine URI an wo man die Informationen erhalten kann - später mehr) X509v3 Certificate Policies ASN1 Strucktur siehe rfc5280 S. 33. System von Regeln für die Ausgabe von Zertifikaten, sowie den Betrieb der Zertifizierungstelle. Nutzer kann sich über die Hirarchie der CA informieren (wichtig für den Vertrauensaufbau). CPS - Certificate Policy Statement und dann zwei möglichkeiten cPSuri (uri wo die Information zu finden ist) oder userNotice (Freitext). Bsp. http://nasaca.nasa.gov/nasacp.html, dort findet man eine CPS. Wenn der Regelsatz dem CA Zertifikat zugeordnet ist (Bindung z.B. durch Root), ist es besser als wenn es nur dem EndNutzer Zertifikat zugordnet ist (Bindung nur durch die darüberliegende CA). Kurzinformationen mit der man einen Schlüssel identifizieren kann. Für Endnutzer ist der Authority Key Identifier ein Bezeichner mit dem das zugöhrige CAZertifikat zu finden ist. Kann enthalten: Authority Key Identifier KeyIdentifier - Schlüssel ID GeneralNames - Herausgeber Seriennummer CertificateSerialNumber Subject Key Identifier - SKI Schlüssel ID, hilft bei der Unterscheidung, sollte eine möglichst eindeutige Nummer sein, da aber nicht genau festgelegt wird ist die SKI nicht für Überprüfungen geeignet. 110 IP Adresse, URI, Email Adresse (hat das ’at’ Zeichen, welches in kein Datentyp passt, weshalb sie hierher (oder in den Issuer Alt Name) gehört, soll als rfc8224Name gespeichert werden (da dieser nicht groß klein sensitiv ist)) Subject Alternative Name To do: neu-ende 6.0.5 Erzeugung To do: neu Bei OpenSSL gibt es zwei möglichkeiten, mit Perl Script perl ˜/opt/openssl/apps/CA.pl -newca openssl x509 -text -nout -in cacert.pem openssl req -text -nout -in careq.pem Diese Requests folgen dem Standard PKCS 10 - rfc2986. openssl ans1parse -in careq.pem ? Attributes: [0] - Contextabhängiges Tag (nur an diesem Ort gültig) Codiert als A0, denn Contextabhängige tags fangen mit 10... an, im Gegensatz zu Universaltags die mit 00... anfangen (Beispiel für Contextabhängige Tags siehe auch bei AuhtorityKeyIdentifier) Im Request ist Set of Atritbute NICHT optional (aber kann leer sein) To do: neu-ende Wie kommen wir eigentlich zu Zertifikaten? Zertifikate kommen von einer CA, also muss man zuerst ein CA-Zertifikat erstellen. Request: Ich möchte ein Zertifikat haben. PKCS#10/RFC2986 openssl req openssl req -new -x509 erzeugt gleich ein Zertifikat openssl req -new -newkey rsa:1500 -days 40 -out user.req ein neuer Schlüssel und ein Request. Der Request enthält die Informationen des Antragsstellers, den öffentlichen Schlüssel, ein Challenge-Passwort (von der CA festgelegt) und eine Signatur über diese Daten. 111 openssl x509 -req -CA .. -CAkey .. -out .. -days 40 -in user.req -CAcreateserial -out user.x509 -extensions usr_cert -extfile ....openssl.cnf wichtig, um v3-Zertifikate zu erzeugen 6.0.6 Gültigkeit Der Gültigkeitszeitraum‘ (Validity) im Zertifikat ist der Zeitraum über den sich die ausstellende ’ Instanz verpflichtet etwas über die Gültigkeit des Zertifikats auszusagen. CRL Certificate Revocation List OCSP Online Certificate Status Protocol Sperrlistenformat auch in RFC 3280 Abschnitt 5 als X.509-Variante festgelegt. OCSP version 1, RFC 2560 To do: neu Man kann dass conf bearbeiten. Übungsaufgabe ein Zertifikatsrequest mit eigen Daten erstellen und zu zertifizieren. To do: einsortieren: Die CA schmeißt eventuell Daten des Request raus. To do: neu-ende To do: neu-20090624 Sperrlisten Version Signatur 112 Enthalten: Herausgeber Last/Next Update Sperrlisten Nummer (sollte monoton wachsen) Liste der gesperten Zertifikate(jeder Eintrag enthält ein Integer, eine Zeit und evt. CRLEntryExtension(CRLReasonCode siehe rfc5280 5.3.1)) Bemerkungen: Sperrlisten sind im DER-Format ( ..openssl... -inform DER) (Erweiterungen enthalten immer OID Octet-String) Zu CRLEntryExtension: CRLReason Code (6) (certificateHold-schwebend gesperrt) und (8) (removeFromCRL-kann/wurde wieder entsperrt werden) sind besonders und sind eher nur für Authosierung sinnvoll. Sperrlisten nehmen in der Praxis erhebliche größen ein CRLEntryExtension wird von der Bundesnetzagentur nicht benutzt. RFC5280 5.3.2: sperrdatum (revocation date) darf nicht vor dem Zeitraum der vorherigen CRL liegen, sonst ist es in der vorherigen Liste Gültig... ??? (ansehen) Aufbau des Pfad zum Vertrauensanker (RFC 5280 S.72): Das beschriebene Prüfverfahren ist nicht normativ vorgeschrieben, es reicht wenn die Funktion gleich ist http://www.bundesnetzagentur.de/media/archive/1343.pps Kettenmodel benutzt den Erstellungszeitpunkt (nicht Gewährleistungs-Beginn) (Folie3) ... http://www.bundesnetzagentur.de/enid/85f55115e236d80fc18329992037142d,0/FAQ/ Antwortss4_wp.html To do: neu-ende To do: 20090701-fehlt 113 6.1 Praktische Ausschlachtung von kryptografischen Algorithmen mit S/MIME und PKCS#7 Root-Zertifikat erzeugen: openssl genrsa 1200 > cakey.pem openssl req -x509 -new -key cakey.pem -config ./openssl.cnf > ca.cert (selbstsigniertes neues root Zertifikat mit eigenem Config Script) Root-Zertifikat anschauen: openssl x509 -in ca.cert -text -noout Nutzer der eigenen CA erstellen: openssl req -new -config ./openssl.cnf -out user.cert Erstellt mehrere Dateien, auch privkey.pem Zertifikat erstellen: openssl x509 -req -in user.req -CA ca.cert -CAkey cakey.pem -CAcreateserial\ -out user.cert -extfile ./openssl.cnf -extensions usr_cert (Zertifikat für user mit Extenstions Version 3 statt Version 1) Senden einer signierten Nachricht (Nachricht in Neu.txt): openssl smime -sign -signer user.cert -in Neu.txt -inkey privkey.pem \ -out neu.smime -text Erzeugt Datei neu.smime mit Nachricht und Signature, -text erzeugt den Eintrag für den Content Type vor der Originalnachricht in neu.smime Umwandeln der S/MIME Nachricht in PKCS7 Nachricht: openssl smime -pk7out -in neu.smime -out neu.pk7 Das gesamte (ohne Inhalt der Nachricht, eigentlich nur die Signatur) S/MIME Dokument wird in eine PKCS7 Struktur eingebunden Anschauen mit: openssl asn1parse -i -in neu.pk7 Zertifikate ausgeben mit: openssl smime pkcs7 -in neu.pk7 -print_certs -noout Zertifikate anschauen mit: openssl smime pkcs7 -in neu.pk7 -print_certs -noout -txt Verifizieren: openssl smime -verify -in neu.smime -CAfile ca.cert Verschlüsseln: 114 openssl smime -encrypt -in Neu.txt -out neu.smime -text user.cer Nachricht ohne Signatur verschlüsselt Entschlüsseln: openssl smime -decrypt -in neu.smime -text -recip user.cer \ -inkey privkey.pem Für die Einbindung in Browser: openssl pkcs12 -export -name Annie -inkey privkey.pem \ -in user.cert -out user.p12 Um auch das CA Zertifikat mit einzubinden: openssl pkcs12 -export -name Annie -inkey privkey.pem \ -in user.cert -out user.p12 [-certfile ca.cert -CAfile ca.cert -chain] Private Schlüssel auspacken: openssl pkcs8 6.2 PKCS PKCS Public Key Cryptography Standards 1 RSA 3 Diffie-Hellman 5 Cryptography mit Passworten 6 Zertifikate 7 Cryptographic Message Syntax 8 private Schlüssel 9 Attributtypen 10 Zertifikatsrequest 11 Cryptographic Token 12 Personal Information Exchange 13 Elliptische Kurven 15 Chipkarten, Token: Formate 6.2.1 PKCS#7: 1.5 November 93 RFC 3852 To do: neu-20090708 CMS Email (SMIME) 115 XML Signaturen XMLDSIG; XMLENC Dokument → signiertes Dokument openssl genpkey -algorithm rsa -pkeyopt rsa_keygen_bits:300 — openssl -chek -text zu kleine Werte (¡256) für den Schlüssel werden nicht akzeptiert (Wert ist immer noch etwas klein). Aber die Ausgabe ist nicht ganz korrekt. openssl genpkey -algorithm rsa -pkeyopt rsa_keygen_pubexp:1 ist leider möglich 6.3 CMS(Cryptographic Message Syntax) rfc3852 SignedData: • Version • Hash Algorithmus • gekapselter Inhalt • Certifikat Liste • Widerrufungsliste (Sperrinformationen) • ... • Signer Infos (Signaturen, davon kann es mehrere geben, elektronische Signatur nach dem Signaturgesetz, Signer Info enthält selber noch einmal einen Signaturblock - der als Digitale Signatur aufgefasst werden kann) – – – – – – Version Id Attributes Algo sig Value ... • Signer Id • Signed Attributes (z.B. Zeit, Ort, Message Digest) Die Signatur dieses Blockes wird erstellt, indem der Hash Wert (nur des Blockes) signiert wird. Wenn es signed Attributes gibt, sind also außerdem Hash Wert des Dokuments und Inhaltstyp(Contenttype) im Signed Attributes enthalten und erst dann wird der Signed Attributes Block signiert. Es wird jeweils er Hash-Algorithmus verwendet der oben genannt wird. 116 Außerdem Signing Certificate • ... Frage ist wo wird der Wert Signiert, der sagt welcher Hash-Algorithmus verwendet wird? Wenn nicht könnte man eventuell den Algorithmus austauschen? Man könnte den Hash-Algorithmus als SignedAttribute einfügen. To do: neu-ende CMS (Cryptographic Message Syntax) Beschreibung des Formates mit dem man Krypto- nachrichten erstellen kann Kryptographische Nachricht Struktur, vorne Bezeichner, hinten Daten. Daten = irgendwas, spannend: Welche Typen gibt es eigentlich. Signed-data Content-Type Was jetzt kommt sind signierte Daten Liste der unterstuetzen Has- hfunktion, dann gekapselter Inhalt, dann eine Liste von Zertifikaten (optional), optional Sperrlisten, dann Signaturbloecke (SignerInfo) SignedData ::= SEQUENCE { Versionsnummer, Liste der unterstützten Hashfunktionen, Ursprüngliche Nachricht selbst, Liste von Zertifikaten Optional, Sperrlisten Optional, Signer Infos } SignedInfo ::= SEQUENCE { Versionsnummer, Signer Identifier (Wer der Signierer eigentlich gewesen sein soll), Hashfunktionen, die bei der Signatur verwendet wird, Signierte Attribute, Verwendete Signaturalgorithmus, Signaturwert, Unsignierte Attribute } SignerInfo ::= SEQUENCE { Versionsnummer, Signer Identifier (Wer der Signierer eigentlich gewesen sein soll), Bezeichner des Hashalgorithmus mit dem die endgültige Signatur erstellt wird Signierte Attribute Optional, 117 Signatur Algorithmus, Signature SignatureValue, Unsigned Attributes Optional } SignerIdentifier ::= SEQUENCE { issuerAndSerialNumber, subjectKeyIdentifier (Eindeutiger Hinweis, wer der Aussteller ist) } SignerInfo Signaturblock, der eine Datenstruktur fuer eine Signatur bereitstellt. Steht drin: Ver- sionsnummer, SignerIdentifier, verwendeter Hash-Algorithmus, dann signierte Attribute, verwendeter Signaturalgorithmus, Signaturwert, unsignierte Attribute SignerIdentifier Aussteller und Seriennummer, oder Schluesselidentifier (subjectKeyIdenti- fier) Signierte Attribute Sammlung von Attributen die signiert sind. Was dabei sein sollte: erstes Attribut Content-Type, wenn die signierten Daten nicht nur Rohdaten sind, sondern gekapselte Daten eine s bestimmten Typs. Ein weiteres nuetzliches Attribut: Message-Digest. Dann Signing-Time. Content-Type Object-Identifier, der einen bestimmten Typ impliziert Message-Digest Hash der aus den Daten ausgerechnet wird. Als Octet-String Signing-Time Zeit von der behauptet wird dass die Signatur zu dieser Zeit geleistet wurde. Signatur Es werden die signierten Attribute signiert, dort ist auch der Hash des Dokuments als messageDigest enthalten. Wenn keine signedAttributes existieren wird das Dokument direkt gehasht. Weitere sinnvolle signierte Attribute: Commitment-Type Was bedeutet die Signatur? zum Beispiel virtuelle Poststelle, Eingangs- stempel; Auslieferung, Einschreiben, Urheberschaft, gelesen, ... Zeitstempel (spezielle Signatur eines authentischen Zeitservers) ist eine Information, dass das Dokument vorher existiert hat. Signing Certificate Beschreibt, mit welchem Schluessel zu welchem Zertifikat ist unterschrie- ben worden/welches Zertifikat moechte der Signierer zur Ueberpruefung verwendet haben. Austausch des Zertifikats fuehrt zu anderer Urheberschaft, ist ein realer Angriff. Verhindert die Urheberschaft auszutauschen. (rfc2634 S. 46) Folge mit: Zertifikats Hash, IssuerSerial(Herausgeber und Seriennummer) (leider ist da SHA1 als Algorithmus festgelegt) in rfc5035: Folge mit Hash-Algorithmus (optional, default ist aber SHA256), Zertifikat Hash, Issuer Serial (Nun Hash als Octet String) Da der Wert des Hash Algorithmus optional ist, ist diese Variante rückwärtskompatibel. 118 Signing Location Ort an dem die Signatur geleistet wurde. Weitere nuetzliche unsignierte Attribute: Zeitstempel ist eine Information, wann die Signatur existiert hat. Hash über die Signatur, Time, Server, davon Signatur. not after Information für die Signatur Countersignature Zweite Signatur (Gegenzeichnung). Signaturblock über eine andere Signa- tur. (Mitsignatur, Bestätigung eines signierten Dokuments, wichtiges Feld für Mehrfachsignaturen) Hashwert des signature Feldes, (3. Hash Wert), nicht alle in einander gekappselt, sonder ansammlung von Signaturen Archiv Zeitstempel neuer Hash-Algorithmus, signiert Dokument, alle Signaturen, alle Attri- bute (signiert, unsigniert) Damit kann mann folgendes machen: 2009 2001 Dokb RS A512 S HA1 S HA256 S HA512 / S ignatur ^c / t1 Y , t2T , at1 2010 at2 at3 Für XML: XML-DSIC, XML-ENC 7 Wichtige Neuerungen bei den Versionsänderungen • Von 0.9.8 zu 0.9.9: Verbesserungen bei den Extensions von Certificate Revocation Lists • Von 0.9.7h zu 0.9.8: UTF8-Support für das ca-Kommando • SHA1 ist nun default-Hash-Algorithmus, statt MD5 • Patentierte Algorithmen RC5 und MD2 müssen beim Kompilieren extra angegeben werden • Neue FIPS 180-2 Algorithmen, SHA-224/-256/-384/-512 wurden implementiert 119 • Neuer Parameter -selfsign für das ca-Kommando • IPv6 Support bei den Zertifikatserweiterungen • Ausweitung der Eliptischen Kurven Bibliothek 8 OpenSSL hintergehen 8.1 die eine Primzahl ganz klein erzeugen • Öffnen einer Datei in genrsa: crypto/rsa/rsa\_gen.c • Ändern den Teil “/* generate p and q */” so daß die eine Primzahl 10bit lang ist( bitsp=10 ) • Wir erzeugen einen neuen rsa key: openssl genrsa -out rsaweak.pem 2048 und erstellen hierdurch eine Primzahl mit 10 bit, die andere zufällig (also so in etwa 2038bit) • Wir schauen uns den key an: openssl rsa -in rsaweak.pem -text -noout und sehen: die eine Primzahl ist 35879, die andere hat 2046 bit Länge. Das kann man lecker faktorisieren. • Öffnen crypto/bn/bn\_prime.h: die Zahl kommt durch den kleinen Primzahltest durch: dieser geht nur bis ca. 17000 8.2 beide Primzahlen nah beieinander • Und wieder in rsa\_gen.c (Zeile 136 in der do-while-Schleife hinter degenerate): • BN\_copy(rsa->q, rsa->p); // wir setzen q gleich p BA\_add\_word(rsa->q, 20); // wir addieren 20 auf q for(i=1; !BN\_is\_prime\_ex(rsa->q, 5, ctx, NULL); i++) BN\_add\_word(rsa->q, 2); // wir erhoehen q bis zur naechsten Primzahl • hierdurch erzeugen wir zwei Primzahlen, die sich enorm ähnlich sind (wieder mit obigen Kommandos) Der Angreifer kennt in diesem Fall den Exponenten, damit ist das Verfahren völlig unsicher. 8.3 Vorschrift des BSI √ 0.1 ≤ |log10 p − log10 q|, also p √ >10 2 ∗ q. Das kann man aber mit q =10 2 ∗ p im Quellcode umgehen. 120 8.4 Programmierung: Zufallszahlenerzeugung und andere nette features Die “callback” Funktion gibt den Fortschritt bei Suche nach p und q als Punkt (Fermat Primzahlentest) und Plus (Miller-Rabin-Test) aus. Datentyp/Struktur zum Speichern der auftretenden großen Zahlen Binärfeld: BIGNUM p ist unsigned char* p = BN\_bn2hex((RSA *)pub\_rsa)->n); // Zum Ausgeben eines BIGNUMs ((pub\_rsa)->n).d[...] // einzelne Teile im Datenblock eines BIGNUMs editieren Zufallszahlen findet man in crypto/rand/\{rand.h, rand\_lib.c, rand.c\} Diese beiden Kombinationen vor entsprechenden Programmen: i2d oder d2i: intern to data, data to intern pub\_rsa = d2i\_RSAPublickey(NULL, \&str, len) (l\"ange von str)\\ Transformiert Binärdaten Zeichenkette in interne public Key Datenstruktur mit ASN.1 S(buf) gibt Speicherplatz frei, überschreibt ihn vorher noch einmal mit Zufallsbytes. 9 Zusammenfassung • Symmetrische Verschlüsselungsverfahren – DES * 64 Bit Blockchiffre * 16 Runden Feistelnetzwerk mit 48 Bit Rundenschlüsseln * 56 Bit Schlüssellänge plus 8 Paritätsbits * XOR, Transformationsfunktion mit S-Boxen – IDEA * 64 Bit Blockchiffre * 8 Runden Feistelnetzwerk mit je 6 · 16 Bit Rundenschlüsseln * 128 Bit Schlüssellänge 16 16 * XOR, ADD modulo 2 , MULT modulo 2 + 1 – Blowfish * 64 Bit Blockchiffre * 16 Runden Feistelnetzwerk * 32-448 Bit Schlüssellänge * XOR, Transformationsfunktion mit XOR, CONCAT und viel Schlüsselmaterial – AES 121 * 128, 192, 256 Bit Blockchiffre * 10, 12, 14 Runden Feistelnetzwerk * 128, 192, 256 Bit Schlüssellänge * Substitution, ShiftRow, MixColumn, KeyAddition – RC4 * Stromchiffre * 10, 12, 14 Runden Feistelnetzwerk * variabele Schlüssellänge bis 2048 Bit – RC5 * wählbare Blockchiffre (openssl 32 Bit) * wählbare Runden Feistelnetzwerk (openssl 12) * wählbare Schlüssellänge (openssl 128 Bit) – GOST * * * * 64 Bit Blockchiffre 32 Runden Feistelnetzwerk 256 Bit Schlüssellänge ADD, ROT, 8 S-Boxen • Asymmetrische Verschlüsselungsverfahren – RSA (Verschlüsseln und Signieren) – Diffie-Hellmann Schlüsselaustausch – ElGamal Crypto-System (basierend auf DH) – Rucksackverschlüsseln (gebrochen) – Merkle Puzzle (viele Nachrichten) – Rabin Verfahren erster Teil: mit OpenSSL spielen, zweiter Teil: Konzepte; eine Woche vor der Prüfung evt. fragen was dran kommen wird; Prüfungstermine: 20.07.2005 oder 04.10.2005 oder nach Vereinbarung Zur Prüfung 10 Mathematische Techniken 10.1 Multiplikatives Inverses (nach www.tzi.de/˜hs/Lehre/U9 mathD1.pdf) 122 10.1.1 Behauptung Seien a, b ∈ Z zwei teilerfremde ganze Zahlen, d.h. ggT (a, b) = 1. Dann existiert ein a0 ∈ Z mit a0 · a ≡ 1 mod b. 10.1.2 Beweis Betrachte die Menge {ak mod b|k ∈ N, k ≥ 1}. Da ggT (a, b) = 1 gilt, folgt, dass ggT (ak , b) = 1 für alle k ∈ N mit k ≥ 1. Denn da a teilerfremd zu b ist, so gilt dies auch für alle Potenzen von a. Daher ist die betrachtete Menge eine Untermenge der endlichen Menge {x mod b|x ∈ Z, ggT (x, b) = 1} und daher selbst endlich. Also kann existiert k1 , k2 mit ak1 ≡ ak2 mod b. Nehmen wir an, k1 < k2 und setzen n := k2 − k1 , dann gilt ak1 · an = ak2 ≡ ak1 mod b. Daher folgern wir an ≡ 1 mod b, d. h. an−1 · a ≡ 1 mod b. Also setzen wir a0 := an−1 und die Behauptung ist erfüllt. 10.2 Kleiner Fermatscher Satz 10.2.1 Behauptung Aus der Wikipedia (unter GNU Free Documentation License): Der kleine fermatsche Satz, kurz der kleine Fermat, ist ein Lehrsatz in der Zahlentheorie. Er macht eine Aussage über die Eigenschaften von Primzahlen und wurde aufgestellt im 17. Jahrhundert von Pierre de Fermat. Dieser Satz beschreibt eine allgemein gültige Kongruenz: a p ≡ a mod p wobei a eine ganze Zahl und p eine Primzahl ist (die weitere Symbolik wird im Artikel Kongruenz beschrieben). Falls a kein Vielfaches von p ist, kann man das Resultat in die häufig benutzte Form a p−1 ≡ 1 mod p bringen. 10.2.2 Beweis Der Beweis beruht auf der Tatsache, dass, wenn zwei Zahlen a und b zueinander inkongruent (modulo einer festen Zahl n) sind, auch die beiden Produkte x · a und x · b inkongruent modulo n sind für x > 0 und ggT (x, n) = 1. Denn: 123 sei a , b mod n, n eine Primzahl, a, b natürliche Zahlen. Angenommen: a·x≡b·x mod n für eine natürliche Zahl x mit ggT (x, n) = 1. Dann gibt es eine natürliche Zahl k, so dass: a·x−b·x=k·n x · (a − b) = k · n x = n · (k/(a − b)) Da n eine Primzahl und x eine natürliche Zahl ist, ist k/(a − b) entweder eine natürliche Zahl, −1/n oder 1/n. Die letzten beiden Fälle widersprechen der Annahme, dass a , b mod n, der erste Fall widerspricht der Annahme, dass ggT (x, n) = 1. Damit ist die Annahme falsch und es gilt für x, so dass ggT (x, n) = 1: a · x , b · x mod n Aus der Wikipedia (unter GNU Free Documentation License): Im folgenden betrachtet man zum einen die Menge A aller Reste mod p - also alle natürlichen Zahlen kleiner als p, und zum anderen die Menge B, die diese Reste multipliziert mit a enthält. Zwei beliebige Zahlen aus A sind zueinander inkongruent modulo p. Aus dem oberen Satz folgt, dass damit auch zwei beliebige Zahlen aus B zueinander inkongruent sind. Dadurch ergibt sich, dass das Produkt über alle Zahlen aus A kongruent zum Produkt aller Zahlen aus B ist: 1 · 2 · 3 · · · · · (p − 1) ≡ (1 · a) · (2 · a) · · · · · ((p − 1) · a) mod p also W ≡ W · a p−1 mod p wobei W das Produkt 1·2·3·...·(p−1) ist. Da es in Restklassenkörpern stets ein multiplikatives Inverses gibt, kann man diese W dividieren und man erhält: a p−1 ≡ 1 mod p 10.2.3 Verallgemeinerung Man kann den kleinen fermatschen Satz zum Satz von Euler verallgemeinern: Für zwei teilerfremde Zahlen n und a gilt: aϕ(n) ≡ 1 mod n wobei ϕ(n) die Eulersche Phi-Funktion bezeichnet. Diese hat als Ergebnis die Anzahl der Zahlen zwischen 1 und n−1 welche teilerfremd zu n sind. Ist n eine Primzahl, so ist ϕ(n) = n−1, so dass man Fermats kleinen Satz als Spezialfall erhält. Mit Hilfe des kleinen fermatschen Satzes entwickelte Fermat den fermatschen Primzahltest. 124 10.2.4 Praktische Anwendung auf Primzahlen (p - a, a < p, a , 0) Wenn gilt a p−1 . 1 mod p ist, dann kann p keine Primzahl sein. (Umkehrung muss nicht gelten!) Wenn man mit a beiweisen kann das p keine Primzahl sein kann, dann nennen wir a Kanditat. (Es gibt aber sogenannte Carmichaelzahlen die kein Kandidat ist.?) To do: nacharbeiten Carmichaelzahlen Wenn (p − 1) gerade ist p−1 2 = k eine Ganzzahl. Ist a2k ≡ 1 mod p (ak )2 ≡ p (ak − 1)(ak + 1) ≡ 0 mod p Also wenn p eine Primzahl ist, dann ist entweder ak ≡ 1 mod p oder ak ≡ 1 mod p Daraus folgt wenn ak . 1 mod p und ak . −1 mod p dann ist p keine Primzahl. k k Somit gilt auch, wenn k gerade ist und a 2 . 1 und a 2 . −1 dann ist p keine Primzahl. Betrachten p − 1 = 2t · r (r ungerade). Sei a < p und p - a 2 t In ar , a2r , a2 ·r , . . . , a2 ·r = a p−1 (Reste mod p) Wenn die Folge nicht mit 1 endet ist p keine Primzahl. Wenn vor der ersten 1 in der Folge keine 1 steht ist p keine Primzahl. Wir nennen a einen Zeugen, wenn man mit a beweisen kann, das p keine Primzahl ist. Jede Zahl p die keine Primzahl ist hat mindestens 34 aller Zahlen a (mit ggT(a, p) = 1) als Zeugen. (Jeder Kandidat ist ein Zeuge) Damit ergibt sich der Rabin-Miller-Test: Wähle zufällig ein a < p und teste ob a ein Zeuge ist. Mit hoher (beliebig genauer) Wahrscheinlichkeit ist p Primzahl. Bei großen Zahlen werden die Zeugen mehr. openssl genrsa -out key.rsa 800 Generating RSA private key, 800 bit long modulus ....+++++++ .......................................+++++++ e is 65537 (0x10001) Generiert den Schlüssel und speichert in ’key.rsa’. Punkte Bedeutet keine kleine Primzahl Rabin-Miller Test schlägt fehl. Plus ist ein erfolgreicher Rabin Miller Test bei größeren Zahlen brauch man weniger Tests, da es mehr Zeugen gibt [...] 10.3 Chinesischer Restklassensatz (nach www.tzi.de/˜hs/Lehre/U9 mathD1.pdf) 125 10.3.1 Behauptung Seien m1 , m2 , ..., mr paarweise teilerfremde ganze Zahlen, d. h. ggT (mi , m j ) = 1 für alle i , j, (i, j ∈ {1, 2, ..., r}), und sei M = m1 · m2 ... · mr . Dann existiert für jede Liste a1 , ..., ar mit 0 ≤ ai < mi für 1 ≤ i ≤ r genau ein x ∈ Z mit 0 ≤ x < M, welches effizient berechnet werden kann und für das gilt: x ≡ a1 mod m1 x ≡ a2 mod m2 ... x ≡ ar mod mr Bemerkung: Es ist leicht einzusehen, dass jedes x0 ∈ Z mit x0 = x + k · M für ein k ∈ Z, d. h. x0 ≡ x mod M, genau dasselbe Gleichungssystem löst wie x. Der Beweis wird zeigen, dass für ein gegebenes x nur x0 von dieser Form dasselbe Gleichungssystem lösen können. 10.3.2 Beweis Zunächst beweisen wir die Existenz und setzen dazu Mi := M/mi , daher gilt ggT (Mi , mi ) = 1. Aus diesem Grund existiert auch ein multiplikatives Inverses Ni ∈ Z mit Mi · Ni ≡ 1 mod mi (vgl. multiplikative Inverse). Zu beachten ist jedoch, dass für alle j ∈ {1, ..., r} mit i , j stets Mi · Ni ≡ 0 mod m j gilt. Nun definieren wir x via: x≡ r X ai · Mi · Ni mod M i=1 Für jedes i existiert ein v ∈ Z, so dass x sich folgendermaßen darstellen lässt: x = Mi · Ni · ai + v · mi Dies gilt, da jedes M j mit j , i mi als Faktor enthält. Offensich erfüllt x also die obigen Gleichungen. x ist das einzige mit 0 ≤ x < M, welches für die gegebene Liste a1 , a2 , ..., ar alle Gleichungen löst, denn falls x0 und x00 zwei verschiedene Lösungen sind, so gilt x0 − x00 ≡ 0 mod mi für alle i ∈ 1, ..., r d. h. x0 − x00 ist ein Vielfaches aller mi und damit auch von M, da nach Voraussetzung ggT (mi , m j ) = 1 fur alle i, j ∈ {1, ..., r} mit i , j erfüllt ist. Somit folgt x0 ≡ x00 mod M, d. h. 0 ≤ x0 , x00 < M kann nicht auftreten, und der Beweis ist abgeschlossen. 126 10.4 Square and multiply Der folgende rekursive Algorithmus berechnet xn für natürliche Zahlen x und n, indem sukzessive der Exponent reduziert wird: • Falls n = 1: xn = x • Sonst, falls n gerade: xn = (x2 )n/2 • Sonst: xn = x · (x2 )(n−1)/2 Damit kann xn in O(ln(n)) Rechenschritten (quadrieren und multiplizieren) berechnet werden, indem in jedem Schritt des Algorithmus der Exponent halbiert wird und höchstens vier Berechnungen ausgeführt werden. 10.5 Montgomery Reduktion (Moduloberechnung ohne Division) Heute was ganz verrücktes: Modulo-Multiplikation ohne Division Problem bei RSA und anderen Algorithmen: m Modul gegeben und g Zahl gegeben und man rechnet aus: ga mod m Aufwand der Berechnung mit Square and Multiply: Größe des Exponenten in Bits Multiplikationen + gleichviele Modulooperationen Berechnung von x · y mod m = x · y − (x · y div m) ∗ m Division aufwendig! Daher Methode dies ohne Division bzw. mit einer schmerzfreien Division durch eine Zweierpotenz zu tun. Dafür Kosten von Hin- und Rücktransformationen. Hier Skizze 1 x → X = x · r mod m y → Y = y · r mod m X ∗ Y = X · Y · r−1 = x · y · r mod m Wir berechnen t0 ≡ −m−1 mod r (Preprocessing) 1. x −→ X = x · r mod m 2. y −→ Y = y · r mod m 3. X ∗ Y = X · Y · r−1 mod m = x · r · y · r · r−1 = x · y · r mod m Zur Bestimmung von X ∗ Y: t1 t2 t3 t3 = X·Y echte Multiplikation = t1 · t0 mod r Multiplikation unten = (t1 + t2 · m) div r Multiplikation oben = X ∗ Y oder (t3 − m) = X ∗ Y 127 1. t3 ist durch r teilbar 2. t3 ≡ X · Y · r−1 mod m 3. 0 ≤ t3 ≤ 2m Zu 1: t1 + t2 · m≡ t1 + t1 · t0 · m ≡ t1 + t1 · m · (−m)−1 ≡ t1 − t1 ≡ 0 Zu 2: (t1 +t2 ·m) r mod r mod r mod r = t3 mod m (t1 · t2 · m) · r−1 mod m≡ t1 · r−1 + t2 · r−1 · m ≡ X · Y · r−1 mod m Beispiel: 5 ∗ 3 = t1 = 15 t2 = 15 · 23 mod r = 45 t3 = 15 + 45 · 13 = 6 Zu 3: t1 t2 · m t1 + t2 · m t3 ≤ < < < (m − 1)2 r·m 2·r·m 2·m t3 ≡ X · Y · r−1 mod m x ∗ r2 = X = x · r mod m X ∗ 1 = x mod m Beispiel: m = 13, r = 100, t0 = 23 r mod m r = 9 mod 13 r2 = 3 mod 13 Ziel: 6 · 5 mod 13 6∗3=2 5∗3=6 128 2 ∗ 6 =. . . t1 = t2 = t3 = x x x∗1= Wenn eine Division länger als 1, 5 Multiplikationen dauert, dann lohnt sich das Verfahren. Der Erfinder heisst übrigens Peter L. Montgomery. (Montgomery Reduktion) www.mi.informatik.unifrankfurt.de/teaching/ws0001/krypto algo/montgomery.pdf Montgomery-Multiplikation To do: siehe Mathematischer Anhang...zusammenfügen Die Reduktion modulo m erfordert eine Division, aber Divisionen sind ’teuer’... Dies kann man aber wie folgt vereinfachen: Um die Division zu vermeiden, ’transformiert’ man die Zahlen: Sei gesucht das Produkt x · y mod m x −→ X y −→ Y x · y −→ X ∗ Y R = (zweierPotenz) > m und die Division durch R muss einfach sein. X = x · R mod m X ∗ Y = X · Y · R−1 mod m (wobei die modulo Reduktion nun nicht mehr jedes mal ausgeführt werden muss, sonder nur am Anfang und am Ende der ’Transformation’) 1. Berechne m0 = −m−1 mod R (−m, R) = 1 ⇒ XGCD : m0 · m = −1 mod R 2. t = X · Y (echte Multiplikation) 3. t1 = t · m0 mod R (echte Multiplikation und oben abschneiden, also eine leichtere modulo Reduktion da R eine zweier Potenz ist) (dabei gilt t2 < m2 + R · m) 4. t2 = t + t1 · m (echte Multiplikation und eine Addition) (dabei gilt t3 < (m+R)·R R = 2m) 5. t3 = t2 divR (also ’unten abschneiden’) 6. Wenn t3 > m dann t3 = t3 − m 129 Nun ist t3 = X ∗ Y. Dafür muss t3 < m sein oder in Schritt 6 t3 < 2m sein. Wir mussten also prüfen: 1. t3 < m 2. Division in 5. ’geht auf’: t2 ist durch r teilbar t2 mod R ≡ (t + t1 · m) ≡ t + (t · m0 ) · m mod R ≡ t + t(−1) mod R ≡ 0 mod R. 3. t3 = X ∗ Y? t3 · R mod m ≡ t2 R · R mod m ≡ t2 ≡ t + t1 · m ≡ t mod m ≡ X · Y mod m Wir haben also den folgenden Aufwand: 1. ’Transformation’ 2. ’Rechnung’ 3. Zurück ’transformieren’ x ∗ R2 = x · R2 · R−1 mod m = x · R = X mod m X ∗ 1 = X · 1 · R−1 ≡ x · R · R−1 ≡ x mod m Man benötigt also zwei zusätzliche Operationen zur transformation. Dafür kommt die Operation ’*’ ohne Divisionen aus. Beispiel m = 17 R = 100 7 · 11 mod 17 x ∗ ↓ X = (x · R) mod m ∗ (y · R) m1 = −m−1 mod 100 suche also ein m1 mit m1 · 17 = −1 mod 100: m1 = 47 130 y ↓ Y = mod m mod m To do: Bsp Magma Quelltext siehe Homepage Bem dazu: Wenn R groß genug ist, kann man die Subtraktion von m weglassen Mathematischer Hintergrund ∼ (Zm , +, ·) −→ (Zm , +, ∗) Was ist das Einselement und das Inverse? 10.6 Nochwas? vielleicht ... zur Prüfung: Zwei Teile (ein theoretischer, ein praktischer). Ein openssl-Kommando das in der VL nicht behandelt wurde, wird drankommen (zum Beispiel speed, ca, etc.). Theoretischer Teil: 1. symmetrische Verfahren (was sind symmetrische Verfahren, wodurch charakterisiert) 2. Integritätsschutz (wie kann man Integritätsschutz gewährleisten) 3. asymmetrische verfahren (siehe 1.) 4. Signatur (was sind Signaturen, wofür verwendet man sie, was ist ˜konzept, was ist sicher, was ist unsicher) 5. Vertrauensstruktur (zum Beispiel PGP) 6. Client-Server-Authentisierung (SSL-Protokoll, Kerberos) 7. Sicherheitsparameter (wo sind die, welchen Einfluß auf die Sicherheit haben sie) 8. X.509 (elektronische Identität) 9. RFC-Security (3280, 3279, 3446, ...) Mathematische Verfahren: 1. Square and Multiply, Double and Add 2. Euklidischer Algorithmus 3. RSA, DH 4. DSA 5. AES 6. das eine oder andere symmetrische Verfahren, Strom-/Blockchiffre 7. Elliptische Kurven eher nicht, reicht zu wissen dass man mit Addition in EK das gleiche erreichen kann wie mit Multiplikation im Restklassenkörper 8. kleiner Fermat eher nicht 131 9. Montgomery-Multiplikation vielleicht auch nicht, sollte aber bekannt sein Für MD5-, AES-, etc. Grundfunktionen reicht evt. wissen wo man nachschauen muss. Dann nachweisen, dass man mit Openssl spielen kann: 1. Verschlüsseln mit DES/3DES/BF/AES . . . 2. Prüfsummenberechnung 3. Konfigurationsfile 4. RSA-Verschlüsselung 5. 0.9.8 – 0.9.7 (dynamisch) 6. Zertifikat 7. DSA-Verschlüsselung 8. Passwörter (passwd) und Salt 9. E-Mail-Nachricht erstellen und sichern (S/MIME-Anwendung) Zum Punkt: Ich möchte eine 1 haben, was muss ich dafür tun? Was haben sie ausserhalb der Vorlesung schonmal gelesen, ... Was fehlte ihnen an der Vorlesung, was fanden sie doof? 132