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)