Kapitel 9: Kryptographie: DES
Transcription
Kapitel 9: Kryptographie: DES
Kapitel 9: Kryptographie: DES Java SmartCards, Kap. 9 (1/19) Symmetrische Verschlüsselung (Secret key) • Verfahren: DES, Triple-DES, AES, IDEA, Blowfish, . . . • 1 Schlüssel K für Ver-/Entschlüsselung C = EK (P ), DK (C) = P • Meistens: Schlüssellänge = Blocklänge (8, 16, 24, 32, . . . Bytes) • Eigenschaften: Sicherheit liegt nur im Schlüssel Schlüssel nicht erratbar (auch wenn P und C bekannt sind!) Verschlüsselung nicht erratbar Entschlüsselung mit falschem Schlüssel ergibt Unsinn Java SmartCards, Kap. 9 (2/19) Data Encryption Standard (DES) • 1976 als Standard akzeptiert, IBM Entwicklung (Anfang 70er), von NSA modifiziert freigegeben • gut in Hardware realisierbar • 64 Bit Schlüssellänge, 56 Bit echter Schlüssel ⇒ Blockgröße 8 Byte • Eine Runde: Substitution (XOR) + Permutation, 16 Runden • Ein Designziel: Jedes Bit der Ausgabe basiert auf jedem Bit der Eingabe und jedem Schlüsselbit • 8 magische“ S-Boxen für Substitution ” Inzwischen unsicher, aber nie geknackt“ ” • Java SmartCards, Kap. 9 (3/19) Nie geknackt“: Gegeben: Klartext und Chiffre, gesucht: der Schlüssel. ” Es ist kein Verfahren bekannt, mit dem man den Schlüssel schneller findet, als durch systematisches Testen aller Schlüssel. Schlüssel: F8 C4 08 0D 6E 76 EA 76 Klartext: 00 00 00 00 00 00 00 00 Chiffre: B0 73 DC 3F B2 09 53 6D 11111000 11000100 00001000 00001101 01101110 01110110 11101010 01110110 10110000 01110011 11011100 00111111 10110010 00001001 01010011 01101101 Java SmartCards, Kap. 9 (4/19) Java SmartCards, Kap. 9 (5/19) DES – Eine Runde Java SmartCards, Kap. 9 (6/19) Differential Cryptanalysis The design took advantage of certain cryptanalytic techniques, most prominently the technique of “differential cryptanalysis,” which were not known in the published literature. After discussions with NSA, it was decided that disclosure of the design considerations would reveal the technique of differential cryptanalysis, a powerful technique that can be used against many ciphers. This in turn would weaken the competitive advantage the United States enjoyed over other countries in the field of cryptography. [Don Coppersmith IBM 1992] (Wieder-)Entdeckt 1990 von Eli Biham und Adi Shamir. DES mit 8 Runden: 214 chosen plaintexts, 29 Verschlüsselungen. DES mit 16 Runden: 247 chosen plaintexts, 237 Verschlüsselungen. Java SmartCards, Kap. 9 (7/19) Schlüssel: F8 C4 08 0D 6E 76 EA 76 Klartext: 00 00 00 00 00 00 00 00 Chiffre: B0 73 DC 3F B2 09 53 6D 11111000 11000100 00001000 00001101 01101110 01110110 11101010 01110110 10110000 01110011 11011100 00111111 10110010 00001001 01010011 01101101 Rechendauer: 4 Milliarden Schlüsseltests pro Sekunde auf 4 Milliarden Rechnern = 264 Tests pro Sekunde, 1 Jahr ≈ 225 Sekunden 56 Bit Länge ⇒ 256 Schlüssel ⇒ 4 Millisekunden 2112 Schlüssel probieren ⇒ 8388608 Jahre 256 Bit Schlüssellänge (AES) ⇒ 1050 Jahre Java SmartCards, Kap. 9 (8/19) RSA’s DES Challenge III is solved in record time Start: January 18, 1999 9:00 AM PST Prize: $10,000 IV: da 4b be f1 6b 6e 98 3d Plaintext: See you in Rome (second AES Conference, March 22-23, 1999) Ciphertext: bd 0d de 91 45 bc de 82 07 c6 e6 95 88 a9 f0 2f 52 fd 8a 25 99 01 99 8b eb 60 ab 9c e5 d0 b8 53 96 48 7d 8a 4d 46 20 96 47 6f 5a d2 83 9c 1c 95 a8 ee b1 b4 70 a0 a4 5c 30 02 6b 2d 23 63 02 bf c8 7b 3c 70 93 8d 81 ee 98 de 1b 18 cd bd 89 71 99 96 41 f6 05 2e c2 e2 Coming in at 22 hours 15 minutes, the DES Challenge III was solved ” by the Electronic Frontier Foundation’s Deep Crack in a combined effort with distributed.net.“ Java SmartCards, Kap. 9 (9/19) distributed.net – ca. 100.000 PCs: At the end of the contest, over 250 billion keys (possible codes ” for decrypting the encrypted message) were being checked each second.“ Deep Crack – Spezialrechner für DES (Öffentlich, 250.000 $) 1536 ASICs, 36864 search units, 40 MHz, 16 Takte pro Schlüssel ⇒ 2.5 Millionen Tests pro unit/Sekunde ⇒ 92 Milliarden Tests/Sekunde ⇒ Maximal 9.05 Tage um DES zu knacken! 3DES: 1049229366788527530565065435109369569680144061811429 Jahre! Java SmartCards, Kap. 9 (10/19) 3DES, DESede • Problem bei DES: Schlüssellänge fest • 3 verschiedene DES Schlüssel K1 , K2 , K3 • C = EK3 (DK2 (EK1 (P ))) • Doppelt“ so sicher wie DES (22n statt 2n Versuche) ” Für DES gilt nicht: Zu K1 , K2 existiert immer K3 mit EK2 (EK1 (P )) = EK3 (P ) • Variante: Nur 2 Schlüssel ⇒ C = EK1 (DK2 (EK1 (P ))) • Blocklänge 8 Byte • 4A 5E 85 3D BD B1 05 15 01001010 01011110 10000101 00111101 10111101 10110001 00000101 00010101 Java SmartCards, Kap. 9 (11/19) Padding Standards zum Auffüllen des Textes auf Vielfache der Blocklänge. 1. NoPadding: Text muss Vielfaches der Blocklänge sein. 2. X9.23, ISO10126-2: Mit Zufallszahlen oder Nullen auffüllen, letztes Byte enthält Anzahl der Padding-Bytes 3. RFC 1423, PKCS 5: Paddingbyte = # Paddingbytes 4. 0x80 + Null-Bytes Bei 2./3./4. mindestens 1 Padding-Byte Java SmartCards, Kap. 9 (12/19) Modes Was tun, wenn mehr als ein Block verschlüsselt werden soll? ECB: Electronic Codebook Mode Jeder Block Text wird separat verschlüsselt ⇒ Gleicher Text mit gleichem Schlüssel gibt gleiche Chiffre CBC: Cipher Block Chaining nächsten Block mit vorherigem Verknüpfen: Ci = EK (Pi ⊕ Ci−1 ), Pi = Ci−1 ⊕ DK (Ci ) Erster Block C0 (IV = initialization vector) beliebig, nicht geheim, sollte zufällig sein. Weitere Modes: Cipher Feedback (CFB), Output Feedback (OFB) ⇒ ALG DES ECB NOPAD, ALG DES CBC NOPAD Java SmartCards, Kap. 9 (13/19) Kryptographie in Java: DESede (1) 1. Initialisierung eines Providers: private final static String cryptProvider = "BC"; java.security.Security.addProvider( new org.bouncycastle.jce.provider.BouncyCastleProvider()); 2. Generierung eines Schlüssels: javax.crypto.KeyGenerator keygen = javax.crypto.KeyGenerator.getInstance("DESede", keygen.init(192); cryptProvider); javax.crypto.SecretKey key = keygen.generateKey(); 3. Ausdrucken“ des Schlüssels: ” swt.util.HexString.printReadable(key.getEncoded()); Kodierung: RAW (Bytearray = Schlüssel) Java SmartCards, Kap. 9 (14/19) Kryptographie in Java: DESede (2) 4 Einlesen“ des Schlüssels: ” private final static byte[] desede key = {...}; javax.crypto.SecretKeyFactory sessionkf = javax.crypto.SecretKeyFactory.getInstance("DESede", cryptProvider); javax.crypto.SecretKey the key = sessionkf.generateSecret( new javax.crypto.spec.DESedeKeySpec(desede key)); Java SmartCards, Kap. 9 (15/19) Kryptographie in Java: DESede (3) 1. Verschlüsseln: javax.crypto.Cipher cip = javax.crypto.Cipher.getInstance("DESede/ECB/NoPadding", cryptProvider); cip.init(javax.crypto.Cipher.ENCRYPT MODE, the key); byte[] to enc = {1, 2, 3, 4, 5, 6, 7, 8 }; byte[] enc = cip.doFinal(to enc); 2. Entschlüsseln: cip.init(javax.crypto.Cipher.DECRYPT MODE, the key); byte[] dec = cip.doFinal(enc); Java SmartCards, Kap. 9 (16/19) Kryptographie in JavaCard: DESede (1) 1. Imports: import javacard.security.*; import javacardx.crypto.*; 2. Initialisieren des Schlüssels: DESKey key = (DESKey)KeyBuilder.buildKey( KeyBuilder.TYPE DES, KeyBuilder.LENGTH DES3 3KEY, false); key.setKey(desede key, (short)0); Cipher cip = Cipher.getInstance(Cipher.ALG DES ECB NOPAD,false); Allokiert Speicher ⇒ nur im Konstruktor! Java SmartCards, Kap. 9 (17/19) Kryptographie in JavaCard: DESede (2) 3. Verschlüsseln: cip.init(key, Cipher.MODE ENCRYPT); cip.doFinal(buffer, ISO7816.OFFSET CDATA, (short)8, buffer, ISO7816.OFFSET CDATA); 4. Entschlüsseln: cip.init(key, Cipher.MODE DECRYPT); cip.doFinal(buffer, ISO7816.OFFSET CDATA, (short)8, buffer, ISO7816.OFFSET CDATA); short doFinal(byte[] inBuff, short inOffset, short inLength, byte[] outBuff, short outOffset) Java SmartCards, Kap. 9 (18/19) Kryptographie in JavaCard: DESede (3) • doFinal gibt Länge des verschlüsselten Text zurück • No padding: Länge muss Vielfaches der Blockgröße sein ⇒ Ausgabelänge = Eingabelänge Bei Cipher block chaining kann Initialisierungsvektor IV verwendet werden: Cipher cip = Cipher.getInstance(Cipher.ALG DES CBC NOPAD,false); cip.init(key, Cipher.MODE ENCRYPT); ⇒ IV = {0,0,0,0,0,0,0,0} oder cip.init(key, mode, array, offset, (short)8) Java SmartCards, Kap. 9 (19/19)