Kapitel 2: Chipkarten - Institut für Informatik

Transcription

Kapitel 2: Chipkarten - Institut für Informatik
Kapitel 2: Chipkarten
Chip card technologies hold great promise as the replacement for
”
magnetic stripe card technology. However, the adoption of chip cards
on a mass scale has been slow to develop. One significant reason for this
slow adoption is the lack of standards among many different vendor
implementations of chip cards.
The world’s leading financial institutions that make up the membership
of the Visa International Service Association have identified multiapplication chip cards as the strategic technology for future banking
cards.“
Software- und Systemsicherheit, Kap. 2 (1/17)
Plastikkarten
1. Diners Club Kreditkarte (50er Jahre) mit Aufdruck des Karteninhabers
2. Prägedruck
3. Magnetstreifen
4. Identification Card with Integrated Circuit (Patent 1968)
5. Speicherkarte (Memory Card)
6. SmartCard (Integrated Circuit Card, ICC)
Software- und Systemsicherheit, Kap. 2 (2/17)
SmartCards
8/16 Bit CPU
•
32K ROM
•
16 – 64K EEPROM
•
0,5 – 4K RAM
•
5 Mhz clock
•
1024 Bit RSA/3-DES
•
9600 – 55800 Bit/sec
C1
C2
C3
C5
C6
C7
⊢ 1, 1 ⊣
•
⊢ 1, 25 ⊣
C1
C2
C3
C5
C6
C7
:
:
:
:
:
:
Vcc = 5V
Reset
Clock
Ground
Vpp
I/O
Software- und Systemsicherheit, Kap. 2 (3/17)
SmartCards
32 Bit CPU
•
240 K ROM
•
400 K EEPROM
•
16 K RAM
•
66 Mhz clock
•
2048 Bit RSA/EC
C1
C2
C3
C5
C6
C7
⊢ 1, 1 ⊣
•
⊢ 1, 25 ⊣
C1
C2
C3
C5
C6
C7
:
:
:
:
:
:
Vcc = 5V
Reset
Clock
Ground
Vpp
I/O
Software- und Systemsicherheit, Kap. 2 (4/17)
Normierung: ISO7816 1–15 (1995 – 2006)
ISO7816-1 Physical characteristics
ISO7816-2 Dimensions and location of the contacts
ISO7816-3 Electronic signals and transmission protocols
ISO7816-4 Inter-industry commands for interchange
ISO7816-11 Personal verification through biometric methods
⇒ Normierung essentiell für globalen Masseneinsatz
Software- und Systemsicherheit, Kap. 2 (5/17)
ISO7816 1: Physical characteristics
•
Schutz gegen UV Licht/Röntgenstrahlen
•
Schutz vor (statischer) Elektrizität/Magnetfeld
•
Breite 85.47mm - 85.72mm, Höhe 53.92mm - 54.03mm,
Dicke 0.76mm + 0.08mm
•
Höhe der Kontakte: < 0.1 mm Differenz zur Karte
•
Schutz gegen Druck auf die Oberfläche
•
Verbiegen: 2cm längs, 1cm quer (30× pro sec., 1000 Mal)
•
Verdrehen: 15 Grad (30× pro sec., 1000 Mal)
Software- und Systemsicherheit, Kap. 2 (6/17)
Spezifikation der Kontakte
Software- und Systemsicherheit, Kap. 2 (7/17)
ISO7816-3: Signale
I/O : (C 7) serielle Datenübertragung
VPP : (C 6) Programmierspannung (für EEPROM)
GND : (C 5) Erdung
CLK : (C 3) Takt (5 Mhz) – wird ausgehandelt
RST : (C 2) Reset
VCC : (C 1) Stromversorgung: 4,75 ≤ V ≤ 5,25, ≤ 200 mA
(C 4, C 8) unbenutzt
Software- und Systemsicherheit, Kap. 2 (8/17)
Weitere Spezifikationen
•
EMV 4.1: Integrated Circuit Card Specification for Payment Systems
Erweiterungen für Kreditkarten (PINs, authenticate)
Europay, MasterCard, Visa
•
Global Platform – Card Specification
life cycle, Card manager, security domains
Global Platform, Visa
•
PC/SC: Interoperability Specification for ICCs and Personal Computer Systems
Kommunikation mit Kartenleser
Bull, Gemplus/Gemalto, HP, IBM, Microsoft, Schlumberger, Siemens, Sun, Toshiba, VeriFone
Software- und Systemsicherheit, Kap. 2 (9/17)
•
ETSI (European Telecommunications Standards Institute):
GSM, UMTS
•
EN 726 (Europäische Norm): Anforderungen an Chipkarten und
Endgeräte für Telekommunikationszwecke
•
ISO 10202: Bankkarten
•
ISO 14443: Identification cards – Contactless integrated circuit(s)
cards – Proximity cards (= RFIDs)
•
ISO 18092, ECMA 340, ETSI TS 102 190: Near Field Communication Interface and Protocol (NFC)
•
...
Software- und Systemsicherheit, Kap. 2 (10/17)
Mitspieler
Chiphersteller: Philips, Infineon, Hitachi, Siemens, Toshiba, . . .
Betriebssysteme: JavaCard (SUN), MULTOS (Mondex),
viele proprietäre
JavaCard Kartenherausgeber: Gemplus/Gemalto, Schlumberger,
Gieseke & Devriant, IBM
Anwendungsspezifikationen: Visa, MasterCard, ZKA (Zentraler Kreditausschuss), gematik (Gesellschaft für Telematikanwendungen
der Gesundheitskarte mbH), ICAO (International Civil Aviation
Organization)
Software- und Systemsicherheit, Kap. 2 (11/17)
Anwendungen
•
Authentifizierung
•
Speicher für PINs und
geheime Schlüssel
•
Reisepass,
Studentenausweis,
Führerschein, . . .
•
SIM
•
Elektronische Geldbörse
•
Elektronische Fahrkarten
Software- und Systemsicherheit, Kap. 2 (12/17)
Anwendungen
•
Authentifizierung
•
Speicher für PINs und
geheime Schlüssel
•
Reisepass,
Studentenausweis,
Führerschein, . . .
•
SIM
•
Elektronische Geldbörse
•
Elektronische Fahrkarten
Sicherheit
Kein Speicher-Auslesen
(tamper-proof, physikalisch)
+ starke Kryptographie
(digitale Signaturen)
+ kryptographische Protokolle
(anwendungsspezifisch)
⇒ Kein unauthorisierter Zugriff
(kein Lesen, kein Schreiben)
Software- und Systemsicherheit, Kap. 2 (12/17)
Lebenszyklus einer SmartCard (EN 726)
1. Herstellung IC und Karte (Hersteller)
Chip- und Modulherstellung, Einsetzen in Karte
2. Initialisierung der Karte (Kartenherausgeber, card issuer )
Laden von Betriebssystem, geheimen Schlüsseln
3. Personalisierung der Karte
(Anwendungsanbieter, application provider )
Laden der Anwendung, geheimer Schlüssel, PINs etc.
4.
Benutzung der Karte (Inhaber, card holder )
5. Beendigung der Benutzung
Löschen der Anwendung, Sperren der Karte
Software- und Systemsicherheit, Kap. 2 (13/17)
Multiapplikative Karten/Global Platform
Cardmanager
•
gehört Card Issuer
•
verwaltet Schlüssel
•
lädt/löscht Anwendungen während der Benutzungsphase
•
ist selbst Applikation mit Registry
Security Domain
•
gehört Application Provider
•
verwaltet Schlüssel
•
Delegated Management Privilege: darf selbst Anwendungen laden
Software- und Systemsicherheit, Kap. 2 (14/17)
Application Life Cycle
Multiapplikative Karten: Mehrere Anwendungen dynamisch (in der
Benutzungsphase) ladbar
1. Laden des (digital signierten) Anwendungscodes (Executable Load
File) ⇒ AID (application identifier) in registry
2. Installieren der Anwendung: installed
⇒ Ressourcenallokation, Linking, AID, Initialisierung
3. Personalisieren der Anwendung: selectable/personalized
4. Beenden der Anwendung: blocked, locked, gelöscht
Software- und Systemsicherheit, Kap. 2 (15/17)
Eine Card Session
•
Power – Karte in Kartenleser
•
Reset – ATR, Answer to Reset
•
Aushandeln Protokoll, Takt
•
Cardmanager empfängt Kommandos
•
Abfrage Applikationen (optional)
•
select AID – Auswahl Applikation
Cardmanager schickt select + alle weiteren Kommandos (außer
neuem select) an Applikation
•
deselect (nicht garantiert!)
Bei power off/reset kein deselect ⇒ Rücksetzen von Authorisierungen bei select
Software- und Systemsicherheit, Kap. 2 (16/17)
JavaCard Architektur
Applet 1
Applet 1
Applet 1
Card
Manager
JavaCard API
JCRE
Java Card VM
Card specific Operating System
Software- und Systemsicherheit, Kap. 2 (17/17)
Kapitel 3: JavaCard
Java für spezielle Geräte
Designentscheidungen:
•
Weglassen unsinniger Klassen/Hinzufügen nützlicher Klassen
•
Berücksichtigung von Ressourcenbeschränkungen
Anpassungen:
•
JavaCard 2.x für Chipkarten (wir: 2.2.1)
•
Mitte 2008: JavaCard 3, classic vs. connected edition
•
Java 2 Micro Edition für Handhelds
•
JavaTV für digitales TV (Settop Box)
Software- und Systemsicherheit, Kap. 3 (1/16)
Kurze Auffrischung: Java
•
Primitive Typen: boolean, byte, short, int, long, char, float,
double
•
Referenztypen: Objekte, Arrays, (Strings)
•
Exceptions, dynamischer Methoden-Lookup
•
Packages, Klassen, Interfaces, statische Initialisierung
•
Applets, Threads, Garbage Collection
•
vordefinierte Klassen: Class loader, security manager, Streams
•
Erweiterungen: GUI (awt, swing), JCA (Java Cryptographic
Architecture)
Software- und Systemsicherheit, Kap. 3 (2/16)
JavaCard
•
Primitive Typen: boolean, byte, short, int, long, char, float,
double
•
Referenztypen: Objekte, Arrays, (Strings)
•
Exceptions, dynamischer Methoden-Lookup
•
Packages, Klassen, Interfaces, statische Initialisierung
•
Applets, Threads, Garbage Collection
•
vordefinierte Klassen: Class loader, security manager, Streams
•
Erweiterungen: GUI (awt, swing), J CA (Java Cryptographic
Architecture)
Software- und Systemsicherheit, Kap. 3 (3/16)
API: Zusätzliche Klassen
APDU
Kommunikation mit dem Terminal
Applet
Installieren und Starten der Anwendung
JCSystem
Transaktionen, Speicherverwaltung
OwnerPIN
Zugriff auf Karten-PIN
ISO7816
Statusworte, Konstanten
ISOException
Exceptions
Util
Hilfsfunktionen
KeyBuilder
Kryptographie
Cipher
Ver-/Entschlüsseln
Software- und Systemsicherheit, Kap. 3 (4/16)
Ein Applet auf die Karte laden
1. MyApplet.java programmieren
2. Mit (Standard) JDK Compiler (1.2/1.3) kompilieren (mit richtigem Classpath!) ⇒ MyApplet.class
3. CAP Konverter: MyApplet.class ⇒ MyApplet.cap bzw. MyApplet.jar
CAP (= converted applet): ByteCode, besser codiert
z.B.: Byte basiert, kein constant pool, . . .
CAP Konverter konvertiert immer ein ganzes Package
⇒ mehrere Klassen möglich, aber nur ein Package
4. Vorher: Offline byte code verifier
Prüft, dass keine Strings, Integers, nicht unterstützte Klassen benutzt werden.
Software- und Systemsicherheit, Kap. 3 (5/16)
Lebenszyklus eines Applets
•
Nach Laden des .jar-files mit JCardManager:
JCRE
load
install
register
Applet
select
process
delete
reset
deselect
•
Abgeleitet von Applet
•
Methoden install, register, select, process, deselect
Software- und Systemsicherheit, Kap. 3 (6/16)
Application Life Cycle
Multiapplikative Karten: Mehrere Anwendungen dynamisch (in der
Benutzungsphase) ladbar
1. Laden des (digital signierten) Anwendungscodes (Executable Load
File) ⇒ AID (application identifier) in registry
2. Installieren der Anwendung: installed
⇒ Ressourcenallokation, Linking, AID, Initialisierung
3. Personalisieren der Anwendung: selectable/personalized
4. Beenden der Anwendung: blocked, locked, gelöscht
Software- und Systemsicherheit, Kap. 3 (7/16)
import javacard.framework.*;
class CopyCardSimple extends Applet {
final static byte BALANCE
= 0x02 ;
final static byte LOAD
= 0x04;
final static byte PAY
= 0x06;
short value = 0;
Software- und Systemsicherheit, Kap. 3 (8/16)
// called once by JCVM
public static void install(byte[] bArray, short bOffset,
byte bLength)
{ new CopyCardSimple(); }
CopyCardSimple() { register(); }
oder
register(bArray, (short)(bOffset+1),(byte)bArray[bOffset])
Software- und Systemsicherheit, Kap. 3 (9/16)
// called when applet is selected
public boolean select() { return true; }
// called for every APDU
public void process(APDU apdu) throws ISOException {
switch (apdu.getBuffer()[ISO7816.OFFSET_INS]) {
case LOAD:
load(apdu)
; return;
case PAY:
pay(apdu)
; return;
case BALANCE: balance(apdu)
; return;
case ISO7816.INS_SELECT:
return;
default: ISOException.throwIt (ISO7816.SW_INS_NOT_SUPPORTED);
}
}
Software- und Systemsicherheit, Kap. 3 (10/16)
private void balance(APDU apdu) throws ISOException {
byte expected = apdu.getBuffer()[ISO7816.OFFSET_LC];
if (expected != 2) ISOException.throwIt(ISO7816.SW_WRONG_LENGTH);
Util.setShort(apdu.getBuffer(), ISO7816.OFFSET_CDATA, value);
apdu.setOutgoingAndSend(ISO7816.OFFSET_CDATA, (short) 2);
}
Software- und Systemsicherheit, Kap. 3 (11/16)
private void load(APDU apdu) throws ISOException {
byte[] buf = apdu.getBuffer();
if (buf[4] != 2) ISOException.throwIt(ISO7816.SW_WRONG_LENGTH);
short len = apdu.setIncomingAndReceive();
if (len != 2) ISOException.throwIt(ISO7816.SW_WRONG_LENGTH);
short val = Util.getShort(buf, ISO7816.OFFSET_CDATA);
if (val <= 0 || (short)(val + value) > (short)1000 )
ISOException.throwIt(ISO7816.SW_DATA_INVALID);
value += val;
}
Software- und Systemsicherheit, Kap. 3 (12/16)
private void pay(APDU apdu) throws ISOException {
short len = apdu.setIncomingAndReceive();
if (len != 2) ISOException.throwIt(ISO7816.SW_WRONG_LENGTH);
byte[] buf = apdu.getBuffer();
short val = Util.getShort(buf, ISO7816.OFFSET_CDATA);
if (val <= 0 || (short)(value - val) < 0)
ISOException.throwIt(ISO7816.SW_DATA_INVALID);
value -= val;
ISOException.throwIt(ISO7816.SW_NO_ERROR);
}
} // end of class CopyCardSimple
Software- und Systemsicherheit, Kap. 3 (13/16)
Speichermanagement
•
EEPROM: electrically erasable programmable read-only memory,
persistent
Appletcode + Heap (Felder + Objekte + Arrays)
•
RAM: random access memory, transient, flüchtig
Lokale Variablen + transiente Arrays
•
Stromausfall
⇒ Transaktionen (für Zuweisungen)
⇒ kein deselect ⇒ Initialisierung in select
Software- und Systemsicherheit, Kap. 3 (14/16)
Programmierrichtlinien
Keine Garbage-Collection, langsames EEPROM
•
So einfach wie möglich programmieren
•
Alle Objekte/Arrays beim Installieren anlegen (bzw. beim ersten
select)
•
Lokale Variablen liegen im RAM ⇒ Laufvariablen lokal!
(wesentlich schneller, schont EEPROM)
•
Lokale Variablendeklaration byte[] nonce = new byte[8];
allokiert Array im Heap (EEPROM)
•
Keine rekursiven Methoden
•
Möglichst nichts statisch (außer Konstanten)
Software- und Systemsicherheit, Kap. 3 (15/16)
Speicher wird allokiert bei . . .
1.
new AnyObject();
2.
new byte[25]
3.
byte[] ar = {0,0,0,0};
4. jeder javacard...getInstance() Methode
Speicher wird nicht allokiert bei . . .
1. apdu.getBuffer()
2. Util.arrayCopy(...)
3. DESKey.setKey(...)
4. Cipher.init(...)
Software- und Systemsicherheit, Kap. 3 (16/16)
Kapitel 4: Kommunikation mit der Karte
Relevanter Standard: ISO 7816-4
Kartenleser/Terminal: Master, Smartcard: Slave
APDU = Application Protocol Data Unit: Folge von Bytes
Terminal → Karte: Command APDU
Karte → Terminal: Response APDU
Protokolle:
•
T=0 asynchronous half duplex character transmission protocol
•
T=1 asynchronous half duplex block transmission protocol
•
direkte/inverse Konvention
Software- und Systemsicherheit, Kap. 4 (1/14)
Command APDU:
CLA
INS
P1
P2
Lc
90
02
00
00
02
Daten
01
2C
Le
8
CLA. Class-Byte: ISO/proprietär/verschlüsselt
INS. Instruction-Byte: Was tun? (gerade, 6= 6x, 9x)
P1, P2. 2 beliebige Parameter-Bytes
Lc. Length-Byte: Anzahl Datenbytes
Le. Length-Byte: Anzahl erwartete Antwortbytes
Response APDU:
Daten
01
2C
SW1
SW2
90
00
Software- und Systemsicherheit, Kap. 4 (2/14)
Statuswort SW = SW1+SW2
ISO: SW1 = 90 (ok), SW1 = 6x (Fehler), SW1 = 60 (Wait Extension)
90 00
No Error
SW NO ERROR, SW OK
67 00
Wrong length
SW WRONG LENGTH
69 82
Security condition not satisfied
SW PIN REQUIRED
69 84
Data invalid
SW DATA INVALID
69 85
Conditions not satisfied
SW CONDITIONS NOT. . .
6A 82
File not found
SW FILE NOT FOUND
6D 00
INS value not supported
SW INS NOT SUPPORTED
6E 00
CLA value not supported
SW CLA NOT SUPPORTED
6F 00
No precise diagnosis
SW UNKNOWN
Software- und Systemsicherheit, Kap. 4 (3/14)
Das Protokoll (1)
1. Kein Input, kein Output
CLA
INS
P1
P2
0
SW1
SW2
Software- und Systemsicherheit, Kap. 4 (4/14)
Das Protokoll (2)
2. Kein Input, aber Output bekannter Länge
CLA
INS
P1
P2
Le
Ack
Daten
90
00
Le = Anzahl erwartete Antwort-Bytes, 0 = 256!
oder
CLA
INS
P1
P2
Le
SW1
SW2
Software- und Systemsicherheit, Kap. 4 (5/14)
Das Protokoll (3)
3. Input, kein Output
CLA
INS
P1
P2
Lc
Lc = Anzahl Datenbytes
Ack
Daten
SW1
SW2
SW1
SW2
oder
CLA
INS
P1
P2
Lc
Software- und Systemsicherheit, Kap. 4 (6/14)
Das Protokoll (4)
4. Input und Output
CLA
INS
P1
P2
Lc
Ack
Daten
Le
Daten
90
00
Software- und Systemsicherheit, Kap. 4 (7/14)
Das Protokoll (4’)
4’. Input und Output (= Input/kein Output, kein Input/Output)
CLA
INS
P1
P2
Lc
Ack
Daten
61
00
C0
00
00
xx
xx
Ack
Daten
90
00
Software- und Systemsicherheit, Kap. 4 (8/14)
Ack und Timeout
•
Ack = Ins ⇒ Alle Daten auf einmal übertragen
•
Ack = ! Ins ⇒ Daten einzeln übertragen
•
Ack für Programmierer transparent, aber:
setIncomingAndReceive() in JavaCard!
•
Spezialfall: Wait Extension 0x60 statt Ack oder SW
•
Timeout: Abhängig von (berechnet aus) ATR und Taktrate
•
Behandlung Le und Fehler: Abhängig von Middleware
Bei uns: Le wird nicht an die Karte geschickt!
Software- und Systemsicherheit, Kap. 4 (9/14)
Das Class-Byte
•
CLA = 0x0X (APDU-Struktur und Bedeutung laut ISO)
•
CLA = 0x8X, 0x9X (Struktur wie ISO, Bedeutung proprietär)
•
CLA = 0xAX: Wie ISO, wenn nicht anders definiert
•
CLA = 0xB0 – 0xCF: ISO, 0xD0 – 0xFE: Proprietär
•
CLA = 0xFF: Wahl des Protokolls (T=0, T=1)
•
X = b4 b3 b2 b1 :
00xx:
01xx:
10xx:
11xx:
keine Security
proprietäre Security
secure messaging, ohne Header
secure messaging, mit Header
•
xx: Logischer Kanal/Art des SM: MAC, Verschlüsselt, . . .
•
Wir: CLA = 0x90
Software- und Systemsicherheit, Kap. 4 (10/14)
INS-Byte und SW
•
Einschränkungen an INS: 6= 00, 6= 6x, 6= 9x, nicht ungerade!
•
ISO definiert 18 Instruktionen, z.B.
0x82: External Authenticate
0xA4: Select File, P1 = 04: Selection by name
0xC0: Get Response
Andere für Daten: put/get data/binary/record . . .
•
Select APDU: 00
•
SW = 0x9000 ok, SW = 0x6XYY, X 6= 0: Fehler
•
Eigene Fehler: 0x62YY, 0x63YY, 0x64YY, 0x65YY
A4
04
00
Lc
AID
Software- und Systemsicherheit, Kap. 4 (11/14)
Der Kartenleser
Quasi-Standard: PC/SC
De-Facto: Beliebig viele Implementierungsunterschiede
Unsere Schnittstelle:
swt = new SWTTerminalInterface()
String[] swt.getReaderNames()
SWTReader swt.getReader(String readerName)
class SWTReader:
void connect()
boolean isPresent()
byte[] transmit(byte[] data)
Auch möglich: Direkte Benutzung der PC/SC API
Software- und Systemsicherheit, Kap. 4 (12/14)
Zugriff auf den Kartenleser
1. Kartenleser-Objekt holen: r = swt.getReader(name );
2. Verbindung herstellen: r.connect();
(Exception, falls keine Karte im Leser)
3. Selektion des Applet per select-APDU:
00
A4
04
00
Lc
Applet-AID
4. Kommunikation mit der Karte:
byte[] transmit(byte[] to send)
Eingabe: Vollständiges Command-APDU als Byte Array
(≥ 5 Byte, nicht zu lang!)
Ausgabe: Response-APDU als Byte Array (genauso lang wie
Antwort, mind. 2 Bytes)
Software- und Systemsicherheit, Kap. 4 (13/14)
Umgang mit Stromunterbrechungen
•
Einlegen/Herausziehen der Karte wird nicht automatisch bemerkt.
•
Exception beim nächsten transmit.
•
Nach Exception: Verhalten abhängig von Kartenleser
•
Einlegen/Herausziehen der Karte durch Aufforderung des Benutzers, oder: separater Thread mit isPresent().
Hilfsklassen
•
swt.util.ByteArray: Umgang mit Byte Arrays: setShort, getShort,
append, subarray, . . .
•
swt.util.HexString: Pretty-printing von Byte Arrays in Hex-Format:
dump, hexify, printReadable, hex to byte . . .
•
swt.util.ISO7816: Statuswörter
Software- und Systemsicherheit, Kap. 4 (14/14)
Kapitel 5: Die JavaCard API
Relevante Spezifikation: JavaCard 2.2.1 API
Packages
javacard.framework (5 Interfaces, 6 Klassen, 8 Exceptions) grundlegende Funktionalität
javacard.security (15 Interfaces, 7 Klassen, 1 Exception)
javacardx.crypto (1 Interface, 1 Klasse) Kryptographie
javacard.framework.service (3 Interfaces, 4 Klassen) rudimentäre
RMI Unterstützung
Software- und Systemsicherheit, Kap. 5 (1/17)
Relevante Klassen
•
interface javacard.framework.ISO7816
•
class javacard.framework.APDU
•
class javacard.framework.Applet
•
class javacard.framework.Util
•
class javacard.framework.ISOException
•
Krypto interfaces: DESKey, RSAPrivateKey, RSAPublicKey
•
Krypto Klassen: KeyBuilder, MessageDigest, RandomData, Signature,
Cipher
Software- und Systemsicherheit, Kap. 5 (2/17)
public abstract class javacard.framework.Applet
•
public static void install(byte bArray[], short bOffset,
byte bLength)
Wird einmal beim Installieren des Applet aufgerufen.
Sollte Konstruktor und register aufrufen.
Danach ist das Applet selektierbar.
•
protected Applet(): Konstruktor
•
protected final void register()
Muss einmal in install aufgerufen werden.
Trägt Applet in Registry des Cardmanagers ein.
•
protected final void register(byte bArray[], short bOffset,
byte bLength)
Version für erweiterte Openplatform 2.0.1’ Syntax
Software- und Systemsicherheit, Kap. 5 (3/17)
•
public boolean select()
Wird aufgerufen, wenn Applet selektiert wird
Typischer Code: Rücksetzen von Flags etc.
Sollte true liefern
•
public abstract void process(APDU apdu)
Wird nach select aufgerufen, wenn ein Kommando an die Karte
geschickt werden.
Erhält auch das select-Kommando
•
public void deselect()
Wird bei weiterem select-Kommando aufgerufen.
Wird nicht bei reset oder Stromunterbrechung aufgerufen!
Software- und Systemsicherheit, Kap. 5 (4/17)
•
protected final boolean selectingApplet()
true falls APDU ist select
•
public Shareable getShareableInterfaceObject(AID clientAID,
byte parameter)
Für Kommunikation zwischen Applets.
Software- und Systemsicherheit, Kap. 5 (5/17)
Eigene Applets
public class MyApplet extends Applet . . .
Das eigene Applet sollte folgende Methoden überschreiben:
•
install
•
select
•
process
Software- und Systemsicherheit, Kap. 5 (6/17)
Interface javacard.framework.ISO7816
Definition von Indizes und Statuswörtern: CLA
INS
P1
P2
Lc
package javacard.framework;
public interface ISO7816 {
public
public
public
public
public
public
final
final
final
final
final
final
static
static
static
static
static
static
byte
byte
byte
byte
byte
byte
OFFSET_CLA
OFFSET_INS
OFFSET_P1
OFFSET_P2
OFFSET_LC
OFFSET_CDATA
=
=
=
=
=
=
0;
1;
2;
3;
4;
5;
public final static byte INS_SELECT = (byte)0xA4;
Software- und Systemsicherheit, Kap. 5 (7/17)
ISO Statusworte: public static final short
SW NO ERROR
0x9000
SW BYTES REMAINING 00
0x6100
SW WRONG LENGTH
0x6700
SW SECURITY STATUS NOT SATISFIED
0x6982
SW FILE INVALID
0x6983
SW DATA INVALID
0x6984
SW CONDITIONS NOT SATISFIED
0x6985
SW COMMAND NOT ALLOWED
0x6986
SW WRONG DATA
0x6A80
SW FUNC NOT SUPPORTED
0x6A81
SW FILE NOT FOUND
0x6A82
Software- und Systemsicherheit, Kap. 5 (8/17)
SW RECORD NOT FOUND
0x6A83
SW FILE FULL
0x6A84
SW INCORRECT P1P2
0x6A86
SW WRONG P1P2
0x6B00
SW CORRECT LENGTH 00
0x6C00
SW INS NOT SUPPORTED
0x6D00
SW CLA NOT SUPPORTED
0x6E00
SW UNKNOWN
0x6F00
Software- und Systemsicherheit, Kap. 5 (9/17)
Class javacard.framework.APDU
Kapselt eine APDU, steuert die Kommunikation
•
public byte[] getBuffer()
selektiert den APDU Buffer
Dient zur Eingabe und Ausgabe
Initial von der JVM mit Nullen beschrieben
APDU Header wird hineinkopiert
Länge: hier 262 Bytes, kann zwischen JCREs variieren
Darf nicht an ein Feld zugewiesen werden(!) (Security)
•
public short setIncomingAndReceive()
Liest die Datenbytes einer APDU
Ergebnis ist Anzahl gelesener Bytes
Software- und Systemsicherheit, Kap. 5 (10/17)
Class javacard.framework.APDU (2)
Spezielle Methoden für T = 1:
•
public static short getInBlockSize()
•
public static short getOutBlockSize()
•
public static byte getProtocol()
•
public byte getNAD()
•
public short receiveBytes(short bOff)
Hier: T = 0 ⇒ nur setIncomingAndReceive
Software- und Systemsicherheit, Kap. 5 (11/17)
Class javacard.framework.APDU (3)
Daten verschicken
•
public void setOutgoingAndSend(short bOff, short len)
Vorher: Daten in APDU Buffer schreiben von Offset bOff mit
Länge len (max. 256)
setOutgoingAndSend aufrufen
Danach APDU Buffer nicht mehr modifizieren
Keine andere send Methode aufrufen
•
public void waitExtension()
Fordert mehr Rechenzeit vom Terminal (falls Timeout auftritt)
Aber: Nicht bei install!
Software- und Systemsicherheit, Kap. 5 (12/17)
Class javacard.framework.APDU (4)
Daten verschicken (low level Methoden – nicht verwenden!)
•
public short setOutgoing()
Ergebnis ist laut API das Le-Byte
Achtung: Le wird evtl. nicht an die Karte geschickt!
⇒ nicht verwenden!
•
public short setOutgoingNoChaining()
•
public void setOutgoingLength(short len)
•
public void sendBytes(short bOff, short len)
•
public void sendBytesLong(byte outData[], short bOff,
short len)
Software- und Systemsicherheit, Kap. 5 (13/17)
Zusammenfassung: APDUs in JavaCard
byte[] getBuffer()
short setIncomingAndReceive() – Daten empfangen
void waitExtension()
void setOutgoingAndSend(short offset, short len) – Antwort
Wichtig: genau so viele Bytes schicken wie erwartet werden, len = le.
APDU-Buffer wiederverwenden, max. 256 Byte schicken.
JVM hängt 9000 an.
Oder: Nichts tun ⇒ Antwort = 9000.
Oder: Exception werfen: ISOException.throwIt(sw) ⇒ Antwort = sw.
Eigene Statusworte: 0x6xxx
Software- und Systemsicherheit, Kap. 5 (14/17)
javacard.framework.ISOException
extends javacard.framework.CardRuntimeException
extends java.lang.RuntimeException
•
public static void throwIt(short sw)
Wirft eine ISOException
sw: Statuswort, das ans Terminal geschickt wird.
•
public short getReason(), public void setReason(short reason)
Lesen/setzen des Statuswort (unnötig!)
Nur ein Exception-Object, das mit throwIt wiederverwendet wird.
Ansonsten: Error-handling wie in Java.
Nicht behandelte Fehler ⇒ Karte antwortet mit 6F 00.
Software- und Systemsicherheit, Kap. 5 (15/17)
class javacard.framework.Util (1)
•
public static byte arrayCompare(byte[] src, short srcOff,
byte[] dest, short destOff,
short length)
Ergebnis: 0 falls gleich, -1 oder 1 sonst
•
public static short arrayCopy(byte[] src, short srcOff,
byte[] dest, short destOff,
short length)
Funktioniert auch, wenn src == dest
Ergebnis: (short)(destOff + length)
•
public static short arrayCopyNonAtomic(byte[] src, short
srcOff, byte[] dest, short destOff, short length)
•
public static void arrayFillNonAtomic(byte[] bArray,
short bOff, short sLen, byte bValue)
Software- und Systemsicherheit, Kap. 5 (16/17)
class javacard.framework.Util (2)
•
public static short setShort(byte[] bArray, short boff,
short svalue)
Schreibt einen short-Wert in zwei Byte
•
public static short getShort(byte[] barray, short boff)
Liest einen short-Wert aus zwei Byte
•
public static short makeShort(byte b1, byte b2)
Anmerkungen zu Arrays
•
Multidimensionale Arrays sind verboten
•
short[] ist möglich, aber meistens sinnlos
•
Object[] ist möglich, Object kann wieder Arrays enthalten
Software- und Systemsicherheit, Kap. 5 (17/17)
Kapitel 6: Arithmetik in JavaCard
Problem: Keine Integers in JavaCard
ToDo: Rechnen mit Bytes und Shorts
Software- und Systemsicherheit, Kap. 6 (1/21)
Hex-Notation
1 Byte = 8 Bit, b7 b6 b5 b4 b3 b2 b1 b0
Software- und Systemsicherheit, Kap. 6 (2/21)
Hex-Notation
1 Byte = 8 Bit, b7 b6 b5 b4 b3 b2 b1 b0
0101
| {z }
| {z } 1110
Software- und Systemsicherheit, Kap. 6 (2/21)
Hex-Notation
1 Byte = 8 Bit, b7 b6 b5 b4 b3 b2 b1 b0
7
6
5
4
1110
=
0
∗
2
+
1
∗
2
+
0
∗
2
+
1
∗
2
+
0101
| {z } | {z }
1 ∗ 23 + 1 ∗ 22 + 1 ∗ 21 + 0 ∗ 20 = 94
Software- und Systemsicherheit, Kap. 6 (2/21)
Hex-Notation
1 Byte = 8 Bit, b7 b6 b5 b4 b3 b2 b1 b0
7
6
5
4
1110
=
0
∗
2
+
1
∗
2
+
0
∗
2
+
1
∗
2
+
0101
| {z } | {z }
1 ∗ 23 + 1 ∗ 22 + 1 ∗ 21 + 0 ∗ 20 = 94
5
E
= 0x5E = 5 ∗ 16 + 14 = 94
Hex: 0. . . 9, 10 = A, 11 = B, 12 = C, 13 = D, 14 = E, 15 = F
Software- und Systemsicherheit, Kap. 6 (2/21)
Wertebereiche in Java
Typ
Länge
Minimaler Wert
byte
8 Bit
-128
short
16 Bit
-32768
int
32 Bit
-2147483648
long
64 Bit
-9223372036854775808
Maximaler Wert
127
32767
2147483647
9223372036854775807
Software- und Systemsicherheit, Kap. 6 (3/21)
Arithmetik in Java:
Java Language Specification 4.2.2 (Integer Operations):
If an integer other than a shift operator has at least one operand of type long, then the operation is carried out using
64-bit precision, and the result of the numerical operator is of
type long. If the other operand is not long, it is first widened
(§5.1.4) to type long by numeric promotion (§5.6). Otherwise, the operation is carried out using 32-bit precision, and the
result of the numerical operator is of type int. If either operand is not an int, it is first widened to type int by numeric
promotion.
Software- und Systemsicherheit, Kap. 6 (4/21)
Arithmetik in Java:
•
Argumente werden automatisch nach int konvertiert
•
Berechnung mit Integers
•
Ergebnis ist int
•
Kein Check auf Over-/Underflow
short x, y; . . . short z = (short)(x * y); (Cast notwendig)
1.000.000 ∗ 1.000.000 = −727.379.968 (Overflow)
(Bem.: Ein Argument long: Berechnung/Ergebnis long,
analog für float, double)
Software- und Systemsicherheit, Kap. 6 (5/21)
Arithmetik in Java:
•
Automatische Konvertierung byte → short → int
•
Umgekehrt ist expliziter Cast notwendig!
•
•
Cast: überzählige“ Bits abschneiden
”
Ergebnis von Arithmetikoperationen ist immer vom Typ int.
•
Arithmetikoperationen: +, -, *, /, % und
•
Bitoperationen: & (And), | (Or), ^ (Xor), ~ (Komplement)
links-shift <<, rechts-shift >> (mit Vorzeichen), >>> (mit Nullen)
•
Negative Zahlen: 2er-Komplement
Software- und Systemsicherheit, Kap. 6 (6/21)
Arithmetik in Java:
Java Language Specification 5.1.2 (Widening Primitive Conversion):
A widening conversion of a signed integer value to an integral
type T simply sign-extends the two’s-complement representation of the integer value to fill the wider format.
Java Language Specification 5.1.3 (Narrowing Primitive Conversion):
A narrowing conversion of a signed integer to an integral type
T simply discards all but the n lowest bits, where n is the
number of bits used to represent type T. In addition to a possible loss of information about the magnitude of the numeric
value, this may cause the sign of the resulting value to differ
from the sign of the input value.
Software- und Systemsicherheit, Kap. 6 (7/21)
2er-Komplement:
1. Schritt:
bilde Bitdarstellung des Betrags
34 ⇒ 0010 0010
Software- und Systemsicherheit, Kap. 6 (8/21)
2er-Komplement:
1. Schritt:
bilde Bitdarstellung des Betrags
2. Schritt:
bitweise Invertierung
34 ⇒ 0010 0010
⇒ 1101 1101
Software- und Systemsicherheit, Kap. 6 (8/21)
2er-Komplement:
1. Schritt:
bilde Bitdarstellung des Betrags
34 ⇒ 0010 0010
2. Schritt:
bitweise Invertierung
⇒ 1101 1101
3. Schritt:
addiere 1
⇒ 1101 1110 = -34
Software- und Systemsicherheit, Kap. 6 (8/21)
2er-Komplement:
1. Schritt:
bilde Bitdarstellung des Betrags
34 ⇒ 0010 0010
2. Schritt:
bitweise Invertierung
⇒ 1101 1101
3. Schritt:
addiere 1
⇒ 1101 1110 = -34
0010 0010
+34
=
0000 0000 0010 0010
0000 0000 0000 0000 0000 0000 0010 0010
1101 1110
-34
=
1111 1111 1101 1110
1111 1111 1111 1111 1111 1111 1101 1110
(byte)
(short)
(int)
(byte)
(short)
(int)
Software- und Systemsicherheit, Kap. 6 (8/21)
Eigenschaften
Software- und Systemsicherheit, Kap. 6 (9/21)
Eigenschaften
•
Führendes Bit ist Vorzeichen: 0 =
ˆ positive, 1 =
ˆ negative Zahl
Software- und Systemsicherheit, Kap. 6 (9/21)
Eigenschaften
•
Führendes Bit ist Vorzeichen: 0 =
ˆ positive, 1 =
ˆ negative Zahl
•
⇒ größte Byte-Zahl: 0111 1111 = 0x7F = 127
Software- und Systemsicherheit, Kap. 6 (9/21)
Eigenschaften
•
Führendes Bit ist Vorzeichen: 0 =
ˆ positive, 1 =
ˆ negative Zahl
•
⇒ größte Byte-Zahl: 0111 1111 = 0x7F = 127
•
⇒ kleinste Byte-Zahl: 1000 0000 = 0x80 = -128
Software- und Systemsicherheit, Kap. 6 (9/21)
Eigenschaften
•
Führendes Bit ist Vorzeichen: 0 =
ˆ positive, 1 =
ˆ negative Zahl
•
⇒ größte Byte-Zahl: 0111 1111 = 0x7F = 127
•
⇒ kleinste Byte-Zahl: 1000 0000 = 0x80 = -128
•
Cast schneidet obere Bits ab: 0000 1000 1111 1111 ⇒ 1111 1111
Software- und Systemsicherheit, Kap. 6 (9/21)
Eigenschaften
•
Führendes Bit ist Vorzeichen: 0 =
ˆ positive, 1 =
ˆ negative Zahl
•
⇒ größte Byte-Zahl: 0111 1111 = 0x7F = 127
•
⇒ kleinste Byte-Zahl: 1000 0000 = 0x80 = -128
•
Cast schneidet obere Bits ab: 0000 1000 1111 1111 ⇒ 1111 1111
Beobachtung: Cast hat etwas mit Modulo 256 zu tun.
Software- und Systemsicherheit, Kap. 6 (9/21)
Eigenschaften
•
Führendes Bit ist Vorzeichen: 0 =
ˆ positive, 1 =
ˆ negative Zahl
•
⇒ größte Byte-Zahl: 0111 1111 = 0x7F = 127
•
⇒ kleinste Byte-Zahl: 1000 0000 = 0x80 = -128
•
Cast schneidet obere Bits ab: 0000 1000 1111 1111 ⇒ 1111 1111
Beobachtung: Cast hat etwas mit Modulo 256 zu tun.
Frage: Lässt sich Cast als einfache mathematische Formel darstellen?
Software- und Systemsicherheit, Kap. 6 (9/21)
Cast und Rest
•
Rest: 5 % 3 =
Software- und Systemsicherheit, Kap. 6 (10/21)
Cast und Rest
•
Rest: 5 % 3 = 2, -5 % 3 =
Software- und Systemsicherheit, Kap. 6 (10/21)
Cast und Rest
•
Rest: 5 % 3 = 2, -5 % 3 = -2, 5 % -3 =
Software- und Systemsicherheit, Kap. 6 (10/21)
Cast und Rest
•
Rest: 5 % 3 = 2, -5 % 3 = -2, 5 % -3 = 2, -5 % -3 =
Software- und Systemsicherheit, Kap. 6 (10/21)
Cast und Rest
•
Rest: 5 % 3 = 2, -5 % 3 = -2, 5 % -3 = 2, -5 % -3 = -2
Software- und Systemsicherheit, Kap. 6 (10/21)
Cast und Rest
•
Rest: 5 % 3 = 2, -5 % 3 = -2, 5 % -3 = 2, -5 % -3 = -2
•
int i; (byte)i = ?
Software- und Systemsicherheit, Kap. 6 (10/21)
Cast und Rest
•
Rest: 5 % 3 = 2, -5 % 3 = -2, 5 % -3 = 2, -5 % -3 = -2
•
int i; (byte)i = ?
0 ≤ i ∧ i % 256 ≤ 127
→ (byte)i = i % 256
0 ≤ i ∧ 127 < i % 256
→ (byte)i = (i % 256) − 256
i < 0 ∧ i % 256 < −128 → (byte)i = (i % 256) + 256
i < 0 ∧ − 128 ≤ i % 256 → (byte)i = i % 256
Software- und Systemsicherheit, Kap. 6 (10/21)
6 weitere Bemerkungen dazu:
1. Arithmetik ist vom Typ int:
byte b = (byte)(x + y);
(x, y Bytes)
byte b = (byte)(x & 0x7F);
(x Byte)
•
Beide Argumente werden in Integers umgewandelt
•
die Rechenoperation wird auf Integers ausgeführt
•
das Ergebnis ist ein Integer
⇒ Cast notwendig. (Auch wenn Ergebnis in ein Byte passt.)
2. Integer Literale:
•
Konstanten sind immer vom Typ Integer
byte b = 0x20; (narrowing primitive conversion)
byte b = (byte)0xA0; (kein signed Byte)
f((short)0) (bei Methoden keine narrowing primitive conversion)
Software- und Systemsicherheit, Kap. 6 (11/21)
3. Casts: A0 = 1010 0000 - führendes 1-Bit
byte → int: A0 → FF FF FF A0
int → byte: 00 00 00 A0 → A0
4. Signed vs. Unsigned Bytes:
(int)0xA0 = 160, aber (int)(byte)0xA0 = –96.
unsigned byte → int: (b & 0xFF)
da (int)((byte)0xA0 & 0xFF) = 160
5. int → High-Byte, Low-Byte:
(i >> 8) & 0xFF und i & 0xFF (vgl. setShort)
High-Byte, Low-Byte → int:
(b1 << 8) | (b2 & 0xFF) (vgl. getShort)
6. (short)(-1 >>> 15) == -1
Software- und Systemsicherheit, Kap. 6 (12/21)
Short- vs. Integer-Arithmetik
1. Beispiel: short x1 = 20000, x2 = (short)((x1 * 5) / 10);
Integer-Arithmetik:
Software- und Systemsicherheit, Kap. 6 (13/21)
Short- vs. Integer-Arithmetik
1. Beispiel: short x1 = 20000, x2 = (short)((x1 * 5) / 10);
Integer-Arithmetik: x2 = 10000
Short-Arithmetik:
Software- und Systemsicherheit, Kap. 6 (13/21)
Short- vs. Integer-Arithmetik
1. Beispiel: short x1 = 20000, x2 = (short)((x1 * 5) / 10);
Integer-Arithmetik: x2 = 10000
Short-Arithmetik:
x2 = –3107
Software- und Systemsicherheit, Kap. 6 (13/21)
Short- vs. Integer-Arithmetik
1. Beispiel: short x1 = 20000, x2 = (short)((x1 * 5) / 10);
Integer-Arithmetik: x2 = 10000
Short-Arithmetik:
x2 = –3107
2. Beispiel: short x1 = 20000, x2 = 30000,
x3 = (short)((x1 + x2) - x2);
Integer-Arithmetik:
Software- und Systemsicherheit, Kap. 6 (13/21)
Short- vs. Integer-Arithmetik
1. Beispiel: short x1 = 20000, x2 = (short)((x1 * 5) / 10);
Integer-Arithmetik: x2 = 10000
Short-Arithmetik:
x2 = –3107
2. Beispiel: short x1 = 20000, x2 = 30000,
x3 = (short)((x1 + x2) - x2);
Integer-Arithmetik: x3 = 20000
Short-Arithmetik:
Software- und Systemsicherheit, Kap. 6 (13/21)
Short- vs. Integer-Arithmetik
1. Beispiel: short x1 = 20000, x2 = (short)((x1 * 5) / 10);
Integer-Arithmetik: x2 = 10000
Short-Arithmetik:
x2 = –3107
2. Beispiel: short x1 = 20000, x2 = 30000,
x3 = (short)((x1 + x2) - x2);
Integer-Arithmetik: x3 = 20000
Short-Arithmetik:
x3 = 20000
Software- und Systemsicherheit, Kap. 6 (13/21)
Short- vs. Integer-Arithmetik
1. Beispiel: short x1 = 20000, x2 = (short)((x1 * 5) / 10);
Integer-Arithmetik: x2 = 10000
Short-Arithmetik:
x2 = –3107
2. Beispiel: short x1 = 20000, x2 = 30000,
x3 = (short)((x1 + x2) - x2);
Integer-Arithmetik: x3 = 20000
Short-Arithmetik:
x3 = 20000
3. Beispiel: short x1 = 20000, x2 = 30000;
boolean res = (x1 < x1 + x2);
Integer-Arithmetik:
Software- und Systemsicherheit, Kap. 6 (13/21)
Short- vs. Integer-Arithmetik
1. Beispiel: short x1 = 20000, x2 = (short)((x1 * 5) / 10);
Integer-Arithmetik: x2 = 10000
Short-Arithmetik:
x2 = –3107
2. Beispiel: short x1 = 20000, x2 = 30000,
x3 = (short)((x1 + x2) - x2);
Integer-Arithmetik: x3 = 20000
Short-Arithmetik:
x3 = 20000
3. Beispiel: short x1 = 20000, x2 = 30000;
boolean res = (x1 < x1 + x2);
Integer-Arithmetik: res = true;
Short-Arithmetik:
Software- und Systemsicherheit, Kap. 6 (13/21)
Short- vs. Integer-Arithmetik
1. Beispiel: short x1 = 20000, x2 = (short)((x1 * 5) / 10);
Integer-Arithmetik: x2 = 10000
Short-Arithmetik:
x2 = –3107
2. Beispiel: short x1 = 20000, x2 = 30000,
x3 = (short)((x1 + x2) - x2);
Integer-Arithmetik: x3 = 20000
Short-Arithmetik:
x3 = 20000
3. Beispiel: short x1 = 20000, x2 = 30000;
boolean res = (x1 < x1 + x2);
Integer-Arithmetik: res = true;
Short-Arithmetik:
res = false;
Software- und Systemsicherheit, Kap. 6 (13/21)
Der cap-Converter:
•
prüft, dass kein int, long, . . . benutzt wird.
•
prüft, dass short-Arithmetik = int-Arithmetik
⇒ Rechengesetze
Beispiele:
Software- und Systemsicherheit, Kap. 6 (14/21)
Der cap-Converter:
•
prüft, dass kein int, long, . . . benutzt wird.
•
prüft, dass short-Arithmetik = int-Arithmetik
⇒ Rechengesetze
Beispiele:
1.
(short)((x * y) - z)
Software- und Systemsicherheit, Kap. 6 (14/21)
Der cap-Converter:
•
prüft, dass kein int, long, . . . benutzt wird.
•
prüft, dass short-Arithmetik = int-Arithmetik
⇒ Rechengesetze
Beispiele:
1.
(short)((x * y) - z)
Ok
Software- und Systemsicherheit, Kap. 6 (14/21)
Der cap-Converter:
•
prüft, dass kein int, long, . . . benutzt wird.
•
prüft, dass short-Arithmetik = int-Arithmetik
⇒ Rechengesetze
Beispiele:
1.
(short)((x * y) - z)
2.
x + y < z
Ok
Software- und Systemsicherheit, Kap. 6 (14/21)
Der cap-Converter:
•
prüft, dass kein int, long, . . . benutzt wird.
•
prüft, dass short-Arithmetik = int-Arithmetik
⇒ Rechengesetze
Beispiele:
1.
(short)((x * y) - z)
Ok
2.
x + y < z
Fehler!
Software- und Systemsicherheit, Kap. 6 (14/21)
Der cap-Converter:
•
prüft, dass kein int, long, . . . benutzt wird.
•
prüft, dass short-Arithmetik = int-Arithmetik
⇒ Rechengesetze
Beispiele:
1.
(short)((x * y) - z)
Ok
2.
x + y < z
Fehler!
3.
(x + y) / 1000
Software- und Systemsicherheit, Kap. 6 (14/21)
Der cap-Converter:
•
prüft, dass kein int, long, . . . benutzt wird.
•
prüft, dass short-Arithmetik = int-Arithmetik
⇒ Rechengesetze
Beispiele:
1.
(short)((x * y) - z)
Ok
2.
x + y < z
Fehler!
3.
(x + y) / 1000
Fehler!
Software- und Systemsicherheit, Kap. 6 (14/21)
Prinzip
short-Arithmetik = int-Arithmetik, wenn . . .
1. das Ergebnis einer Operation (sofort) nach (short) oder (byte)
gecastet wird:
(short)(x ⊕ y)
2. oder die Operation innerhalb eines Casts stattfindet und bestimmte Rechenregeln gelten:
(short)(a ⊕1 ((b ⊕2 c) ⊕3 d))
3. oder das Ergebnis von der Größe her in ein short passt:
byte b, c; ⇒ −32768 < b * (x % c) < 32767
Software- und Systemsicherheit, Kap. 6 (15/21)
Rechengesetze (1):
s, t: bel. Ausdrücke mit Ergebnistyp int, z. B. s = (x * y) * z
1.
Unäres Minus:
(short)(- s)
2.
Addition:
(short)(s + t) = (short)((short)s + t)
3.
Subtraktion:
(short)(s - t) = (short)(s - (short)t)
4.
Multiplikation:
(short)(s * t) = (short)((short)s * t)
= (short)(- (short)s)
und sämtliche Varianten.
Bem.: 1. wird vom cap converter nicht akzeptiert.
Software- und Systemsicherheit, Kap. 6 (16/21)
Rechengesetze (2):
1.
Komplement:
Bitweises Und:
(short)(~s)
(short)(s & t)
= (short)(~(short)s)
= (short)((short)s & t)
2.
3.
Bitweises Oder:
(short)(s | t)
= (short)((short)s | t)
4.
Bitweises Xor:
(short)(s ^ t)
= (short)((short)s ^ t)
5.
Links-Shift:
(short)(s << n) = (short)((short)s << n)
und sämtliche Varianten.
Software- und Systemsicherheit, Kap. 6 (17/21)
Rechengesetze (3):
Im Allgemeinen (auch für Varianten):
1. (short)(s / t) 6= (short)((short)s / (short)t)
Beispiel: s = 216 , t = 215
2. (short)(s % t) 6= (short)((short)s % (short)t)
Beispiel: s = 2 ∗ 216 − 1, t = 216 − 1
3. (short)(s >> n) 6= (short)((short)s >> n)
Beispiel: s = 215 , n = 1
4. (short)(s >>> n) 6= (short)((short)s >>> n)
Beispiel: s = 215 , n = 1
gilt natürlich, wenn s und t in ein short passen.
Software- und Systemsicherheit, Kap. 6 (18/21)
Rechengesetze (4):
Im Allgemeinen (auch für Varianten):
1. s < t 6⇔ (short)s < (short)t
2. (short)s == (short)t 6⇒ s == t
aber natürlich s == t ⇒ (short)s == (short)t
⇒ (short)(x + y) == z Cast ist notwendig!
gilt natürlich, wenn s und t in ein short passen.
Software- und Systemsicherheit, Kap. 6 (19/21)
Rechengesetze (5):
. . . gilt, wenn s und t in ein short passen?
1. short x,y,z ⇒ x & y “passt” – Ok!
⇒ (x & y) == z kein Cast notwendig.
Ebenso für |, ^ , ~, >>, >>>
2. short x,y,z ⇒ x % y “passt” – Ok!
⇒ (x % y) == z kein Cast notwendig.
Ebenso für /
3. byte x,y ⇒ x + y, x + 127 “passt” – Ok!
⇒ (x + y) == z kein Cast notwendig.
Ebenso für -, *
4. byte x,y,z ⇒ x + y + z, x + 128 “passt” – Fehler!
Software- und Systemsicherheit, Kap. 6 (20/21)
Spezielle Konstrukte:
1. Bei Compound assignment impliziter cast:
short x;
x += y + z; ok, ≡ x = (short)(x + (y + z))
x /= y + z; nicht ok, ≡ x = (short)(x / (y + z))
2. Bei Shift wird 2. Argument n implizit zu (n & 31):
x >> n ≡ x >> (n & 31)
Software- und Systemsicherheit, Kap. 6 (21/21)
Kapitel 7: Kryptographie: Grundlagen
Software- und Systemsicherheit, Kap. 7 (1/13)
•
Nicht: Wie funktioniert Verfahren xyz?
•
Nicht: Warum ist Verfahren xyz sicher?
Software- und Systemsicherheit, Kap. 7 (2/13)
•
Nicht: Wie funktioniert Verfahren xyz?
•
Nicht: Warum ist Verfahren xyz sicher?
•
Dafür: Wie benutze ich Verfahren xyz?
•
Dafür: Wie kombiniere ich Verfahren zu Protokollen?
Software- und Systemsicherheit, Kap. 7 (2/13)
Basisoperationen: mathematische Verfahren
Standardkombinationen: Signatur, MAC, blinde Signatur etc.
Eigenschaften: Authentifizierung, Nichtrückweisbarkeit etc.
Kombination: kryptographische Protokolle
Eigenschaften: Fälschungssicher, nicht kopierbar etc.
Unser Interesse: logische (abstrakte) Eigenschaften
Software- und Systemsicherheit, Kap. 7 (3/13)
Grundbegriffe
•
Cryptography: Lehre“ vom Verschlüsseln
”
Cryptanalysis: Lehre“ vom Code-Knacken
”
Plaintext/Klartext: unverschlüsselter Text
•
Cipher/Chiffre: verschlüsselter Text
•
Alice, Bob: ehrliche Kommunikationsteilnehmer
•
Eve, Mallory: Bösewichte
•
•
Software- und Systemsicherheit, Kap. 7 (4/13)
Ziele:
1. confidentiality/Vertraulichkeit
Niemand (sonst) kann die Nachricht lesen.
2. authentication/Authentisierung
Der Absender der Nachricht ist der richtige.
3. integrity/Unveränderbarkeit
Die Nachricht wurde nicht modifiziert.
4. nonrepudiation/Nichtrückweisbarkeit
Der Absender kann nicht abstreiten, die Nachricht geschickt zu
haben.
Software- und Systemsicherheit, Kap. 7 (5/13)
Theorie der Verschlüsselung
Prinzipien:
Confusion: Verschleiern des Zusammenhangs zwischen Plaintext und
Cipher, z. B. durch Substitution.
Caesar-Chiffre: Buchstabe := Buchstabe + 3:
Jdoold hvw rpqlv glylvd lq sduwhv wuhv
⇒ Gallia est omnis divisa in partes tres
Diffusion: Verschleiert Redundanzen, indem sie im Text verteilt werden, z. B. durch Transposition/Permutation.
12345 ⇒ 32451
(Position 1→5, 2→2, 3→1, 4→3, 5→4)
Blockchiffren: confusion und diffusion
Stromchiffren: nur confusion, da nur ein Byte/Bit auf einmal verschlüsselt wird
Software- und Systemsicherheit, Kap. 7 (6/13)
ROT13 (Substitutionschiffre)
Ersetze A durch N, B durch O, . . . x durch x+13
Gurer jnf n lbhat ynql bs Evtn,
Jub ebqr jvgu n fzvyr ba n gvtre;
Gurl erghearq sebz gur evqr
Jvgu gur ynql vafvqr,
Naq gur fzvyr ba gur snpr bs gur gvtre.
Heute: Text/Schlüssel immer Folgen von Bits (Bytes)
Software- und Systemsicherheit, Kap. 7 (7/13)
Gutes Kryptoverfahren
•
Problem bei ROT13: Wenn Verfahren bekannt:
Jede Nachricht kann entschlüsselt werden.
•
⇒ Verfahren mit einem Schlüssel parametrisieren
•
Die Sicherheit eines Verschlüsselungs- (Krypto-)verfahrens sollte
nur im Schlüssel liegen. (Kerckhoffs)
⇒ Der Algorithmus ist öffentlich.
aber: siehe Geschichte der Enigma in WWII
Gutes Verschlüsselungsverfahren:
Aufgabe: Gegeben Klartext und Chiffre: Finde Schlüssel.
Das effizienteste bekannte Verfahren ist, alle Schlüssel
durchzuprobieren.
Software- und Systemsicherheit, Kap. 7 (8/13)
Angriffe (1)
•
Entschlüsseln einer Nachricht
⇒ einmaliger Erfolg
•
Finden eines Schlüssels
⇒ potentiell viele Nachrichten entschlüsselbar
•
Fälschen einer digitalen Signatur
Kollisionen bei Hashverfahren finden
u.v.m.
•
Knacken eines Verschlüsselungsverfahrens
Effiziente Möglichkeit, Schlüssel/Klartext zu finden
Software- und Systemsicherheit, Kap. 7 (9/13)
Angriffe (2)
Software- und Systemsicherheit, Kap. 7 (10/13)
Angriffe (2)
1. Ciphertext-only attack: Nur verschlüsselte Nachrichten verfügbar.
Software- und Systemsicherheit, Kap. 7 (10/13)
Angriffe (2)
1. Ciphertext-only attack: Nur verschlüsselte Nachrichten verfügbar.
2. Known-plaintext attack: verschlüsselte Nachrichten und Klartext
verfügbar.
Software- und Systemsicherheit, Kap. 7 (10/13)
Angriffe (2)
1. Ciphertext-only attack: Nur verschlüsselte Nachrichten verfügbar.
2. Known-plaintext attack: verschlüsselte Nachrichten und Klartext
verfügbar.
3. Chosen-plaintext attack: Wie 2., aber Angreifer kann Klartexte
wählen. (Orakel/Blackbox)
Software- und Systemsicherheit, Kap. 7 (10/13)
Angriffe (2)
1. Ciphertext-only attack: Nur verschlüsselte Nachrichten verfügbar.
2. Known-plaintext attack: verschlüsselte Nachrichten und Klartext
verfügbar.
3. Chosen-plaintext attack: Wie 2., aber Angreifer kann Klartexte
wählen. (Orakel/Blackbox)
4. Adaptive-chosen-plaintext attack: Wie 3., aber nächster Klartext
kann nach Analyse der vorherigen Ergebnisse gewählt werden.
Software- und Systemsicherheit, Kap. 7 (10/13)
Angriffe (2)
1. Ciphertext-only attack: Nur verschlüsselte Nachrichten verfügbar.
2. Known-plaintext attack: verschlüsselte Nachrichten und Klartext
verfügbar.
3. Chosen-plaintext attack: Wie 2., aber Angreifer kann Klartexte
wählen. (Orakel/Blackbox)
4. Adaptive-chosen-plaintext attack: Wie 3., aber nächster Klartext
kann nach Analyse der vorherigen Ergebnisse gewählt werden.
5. Chosen-ciphertext attack: verschlüsselte Nachrichten wählbar.
Software- und Systemsicherheit, Kap. 7 (10/13)
Angriffe (2)
1. Ciphertext-only attack: Nur verschlüsselte Nachrichten verfügbar.
2. Known-plaintext attack: verschlüsselte Nachrichten und Klartext
verfügbar.
3. Chosen-plaintext attack: Wie 2., aber Angreifer kann Klartexte
wählen. (Orakel/Blackbox)
4. Adaptive-chosen-plaintext attack: Wie 3., aber nächster Klartext
kann nach Analyse der vorherigen Ergebnisse gewählt werden.
5. Chosen-ciphertext attack: verschlüsselte Nachrichten wählbar.
6. Rubber-hose cryptanalysis – Bestechung, Erpressung, Überredung,. . .
Software- und Systemsicherheit, Kap. 7 (10/13)
... Kryptographie allein reicht nicht ...
From: Support webmail
To: [email protected]
Subject: Virus Alert
Fill the columns
below
and send back.
USERNAME:
PASSWORD:
PHONE NUMBER:
BIRTHDAY:
USER ID:
Software- und Systemsicherheit, Kap. 7 (11/13)
One-time Pads
Gegeben: Plaintext P , #P = n Bytes,
geheimer zufälliger Schlüssel K mit #K = n.
Verschlüsseln: C = EK (P ) = P ⊕ K (XOR)
Entschlüsseln: P = C ⊕ K (C Ciphertext/Chiffre)
Software- und Systemsicherheit, Kap. 7 (12/13)
One-time Pads
Gegeben: Plaintext P , #P = n Bytes,
geheimer zufälliger Schlüssel K mit #K = n.
Verschlüsseln: C = EK (P ) = P ⊕ K (XOR)
Entschlüsseln: P = C ⊕ K (C Ciphertext/Chiffre)
Als einziges Krypto-System absolut sicher
(sofern Schlüssel wirklich zufällig)
Software- und Systemsicherheit, Kap. 7 (12/13)
One-time Pads
Gegeben: Plaintext P , #P = n Bytes,
geheimer zufälliger Schlüssel K mit #K = n.
Verschlüsseln: C = EK (P ) = P ⊕ K (XOR)
Entschlüsseln: P = C ⊕ K (C Ciphertext/Chiffre)
Als einziges Krypto-System absolut sicher
(sofern Schlüssel wirklich zufällig)
Wichtig: K darf nur einmal verwendet werden!!!
Software- und Systemsicherheit, Kap. 7 (12/13)
One-time Pads
Gegeben: Plaintext P , #P = n Bytes,
geheimer zufälliger Schlüssel K mit #K = n.
Verschlüsseln: C = EK (P ) = P ⊕ K (XOR)
Entschlüsseln: P = C ⊕ K (C Ciphertext/Chiffre)
Als einziges Krypto-System absolut sicher
(sofern Schlüssel wirklich zufällig)
Wichtig: K darf nur einmal verwendet werden!!!
Sonst: C1 ⊕C2 = (P1 ⊕K)⊕(P2 ⊕K) = (P1 ⊕P2 )⊕(K ⊕K) = P1 ⊕P2
Software- und Systemsicherheit, Kap. 7 (12/13)
00
47
3E
1E
42
15
04
0D
08
07
4F
0E
00
50
0F
0F
00
1A
48
0B
49
2D
57
07
00
00
07
00
20
0A
50
47
01
0D
00
00
14
0C
02
00
41
18
00
09
16
54
00
09
7B
02
00
00
1D
32
01
0C
48
00
1B
38
00
59
53
08
01
53
54
41
18
45
0C
07
53
38
42
09
48
05
54
0F
1D
0A
07
17
09
05
45
36
08
0C
10
46
00
53
04
45
0F
1B
41
13
00
45
46
00
41
58
13
03
06
0F
17
49
41
20
08
4D
55
1A
55
00
05
02
54
57
06
07
15
21
01
00
07
43
00
07
18
0A
48
00
0F
45
20
00
0D
69
53
1C
41
50
03
0C
53
4E
4D
45
00
00
55
60
0D
45
00
23
07
0A
43
4B
4D
0F
45
55
10
00
06
01
03
46
4E
45
.........EAW..U.
GP....E.FF ..A‘E
>...{8......HP.U
........SAM...E.
B. ..YS..XU!....
...A.S8.E...ES#.
.HP...B...U. N..
..G.2..E.....M..
.I...SH6A..C.ECF
.-...T......i.KN
OW.THAT..IT.S.ME
..
Software- und Systemsicherheit, Kap. 7 (13/13)
Kapitel 8: Kryptographie: DES
Software- und Systemsicherheit, Kap. 8 (1/20)
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
Software- und Systemsicherheit, Kap. 8 (2/20)
Data Encryption Standard (DES)
•
1976 als Standard akzeptiert, IBM Entwicklung (Anfang 70er),
von NSA modifiziert freigegeben, FIPS 46-3
•
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“
”
•
Software- und Systemsicherheit, Kap. 8 (3/20)
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
Software- und Systemsicherheit, Kap. 8 (4/20)
Software- und Systemsicherheit, Kap. 8 (5/20)
DES – Eine Runde
Software- und Systemsicherheit, Kap. 8 (6/20)
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]
Software- und Systemsicherheit, Kap. 8 (7/20)
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.
Software- und Systemsicherheit, Kap. 8 (7/20)
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
Software- und Systemsicherheit, Kap. 8 (8/20)
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
Software- und Systemsicherheit, Kap. 8 (8/20)
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
Software- und Systemsicherheit, Kap. 8 (8/20)
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
Software- und Systemsicherheit, Kap. 8 (8/20)
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
Software- und Systemsicherheit, Kap. 8 (8/20)
RSA’s DES Challenge III
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
Software- und Systemsicherheit, Kap. 8 (9/20)
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.“
Software- und Systemsicherheit, Kap. 8 (9/20)
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.“
Software- und Systemsicherheit, Kap. 8 (10/20)
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 $)
Software- und Systemsicherheit, Kap. 8 (10/20)
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
Software- und Systemsicherheit, Kap. 8 (10/20)
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
Software- und Systemsicherheit, Kap. 8 (10/20)
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
Software- und Systemsicherheit, Kap. 8 (10/20)
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!
Software- und Systemsicherheit, Kap. 8 (10/20)
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!
2010: 68 Stunden (292 Mrd. Tests/Sekunde) mit 128 FPGAs
Software- und Systemsicherheit, Kap. 8 (10/20)
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!
2010: 68 Stunden (292 Mrd. Tests/Sekunde) mit 128 FPGAs
3DES: 1049229366788527530565065435109369569680144061811429 Jahre!
Software- und Systemsicherheit, Kap. 8 (10/20)
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
•
Nachfolger: AES (128, 196 oder 256 Bit Schlüssellänge), FIPS 197
Software- und Systemsicherheit, Kap. 8 (11/20)
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
Software- und Systemsicherheit, Kap. 8 (12/20)
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
Software- und Systemsicherheit, Kap. 8 (13/20)
Angriff auf CBC und PKCS 5
September 2010: New Attack Against ASP.NET: It’s serious“
”
⇒ Auslesen von web.config, Entschlüsseln von Cookies u.a.
Problem: Was tun, wenn Padding nicht stimmt? Fehlermeldung?
Software- und Systemsicherheit, Kap. 8 (14/20)
Angriff auf CBC und PKCS 5
September 2010: New Attack Against ASP.NET: It’s serious“
”
⇒ Auslesen von web.config, Entschlüsseln von Cookies u.a.
Problem: Was tun, wenn Padding nicht stimmt? Fehlermeldung?
Gegeben C = EK (P ). Sei r = r1 ..(r8 ⊕ i) zufälliger Block. Teste rC.
Software- und Systemsicherheit, Kap. 8 (14/20)
Angriff auf CBC und PKCS 5
September 2010: New Attack Against ASP.NET: It’s serious“
”
⇒ Auslesen von web.config, Entschlüsseln von Cookies u.a.
Problem: Was tun, wenn Padding nicht stimmt? Fehlermeldung?
Gegeben C = EK (P ). Sei r = r1 ..(r8 ⊕ i) zufälliger Block. Teste rC.
Falls kein Paddingfehler: P ⊕ r hat korrektes Padding. (1, 22, 333, ...)
Software- und Systemsicherheit, Kap. 8 (14/20)
Angriff auf CBC und PKCS 5
September 2010: New Attack Against ASP.NET: It’s serious“
”
⇒ Auslesen von web.config, Entschlüsseln von Cookies u.a.
Problem: Was tun, wenn Padding nicht stimmt? Fehlermeldung?
Gegeben C = EK (P ). Sei r = r1 ..(r8 ⊕ i) zufälliger Block. Teste rC.
Falls kein Paddingfehler: P ⊕ r hat korrektes Padding. (1, 22, 333, ...)
Teste r1 ..(rj ⊕ 1)..(r8 ⊕ i)C für (j = 1..7).
Alle fehlerhaft: letztes Byte P8 = r8 ⊕ 1, sonst r8 ⊕ j
Software- und Systemsicherheit, Kap. 8 (14/20)
Angriff auf CBC und PKCS 5
September 2010: New Attack Against ASP.NET: It’s serious“
”
⇒ Auslesen von web.config, Entschlüsseln von Cookies u.a.
Problem: Was tun, wenn Padding nicht stimmt? Fehlermeldung?
Gegeben C = EK (P ). Sei r = r1 ..(r8 ⊕ i) zufälliger Block. Teste rC.
Falls kein Paddingfehler: P ⊕ r hat korrektes Padding. (1, 22, 333, ...)
Teste r1 ..(rj ⊕ 1)..(r8 ⊕ i)C für (j = 1..7).
Alle fehlerhaft: letztes Byte P8 = r8 ⊕ 1, sonst r8 ⊕ j
Byte 7: Teste r1 ..r6 (r7 ⊕ i)(P8 ⊕ 2)
usw.
Software- und Systemsicherheit, Kap. 8 (14/20)
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());
Software- und Systemsicherheit, Kap. 8 (15/20)
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:
Software- und Systemsicherheit, Kap. 8 (15/20)
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",
cryptProvider);
Software- und Systemsicherheit, Kap. 8 (15/20)
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);
Software- und Systemsicherheit, Kap. 8 (15/20)
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();
Software- und Systemsicherheit, Kap. 8 (15/20)
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)
Software- und Systemsicherheit, Kap. 8 (15/20)
Kryptographie in Java: DESede (2)
4 Einlesen“ des Schlüssels:
”
private final static byte[] desede key = {...};
Software- und Systemsicherheit, Kap. 8 (16/20)
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);
Software- und Systemsicherheit, Kap. 8 (16/20)
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));
Software- und Systemsicherheit, Kap. 8 (16/20)
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);
Software- und Systemsicherheit, Kap. 8 (17/20)
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!
Software- und Systemsicherheit, Kap. 8 (18/20)
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)
Software- und Systemsicherheit, Kap. 8 (19/20)
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)
Software- und Systemsicherheit, Kap. 8 (20/20)
Kapitel 9: Nonces und Hashes
Software- und Systemsicherheit, Kap. 9 (1/16)
Nonce
•
Leo: for the nonce = einstweilen (for the time being)
•
OED:
•
pan anes = for or with a view to the one (thing, occasion)
•
(ane/anes analog zu ene/enes = once)
•
In ME poetry used as a metrical tag or stop-gap, with no special
meaning, often rhyming with bones and stones
•
for the time being; temporarily
•
nonce-word: the term used in this dictionary to describe a word
which is apparently used only for the nonce
•
Criminal slang: one convicted of a sexual offence, esp. childmolesting
Software- und Systemsicherheit, Kap. 9 (2/16)
Zufallszahlen (1)
•
Nonces, random numbers
•
Echte (physikalische) Generatoren (indeterministisch)(?)
teuer, groß, problematisch
Software- und Systemsicherheit, Kap. 9 (3/16)
Zufallszahlen (1)
•
Nonces, random numbers
•
Echte (physikalische) Generatoren (indeterministisch)(?)
teuer, groß, problematisch
Software- und Systemsicherheit, Kap. 9 (3/16)
Zufallszahlen (2)
•
In Software: Pseudo-Zufallszahlengeneratoren (PRNGs)
zufällige/geheime Initialisierung (seed), dann deterministisch
•
für Kryptographie: zusätzliche Anforderungen
•
z. B. auf DES + MD5 basierend mit geheimem Schlüssel
•
FIPS 186-2, ANSI X9.31, ANSI X9.62-1998
Software- und Systemsicherheit, Kap. 9 (4/16)
Zufallszahlen (3)
Eigenschaften:
•
sieht zufällig aus
Gleichverteilung der Werte
statistische Analyse zeigt keine Korrelation
•
nicht vorhersagbar
Nächster Wert nicht vorhersagbar, auch wenn alle bisherigen Werte
bekannt
Software- und Systemsicherheit, Kap. 9 (5/16)
Zufallszahlen (4)
Wenn lang genug (z.B. ≥ 8 Byte, 264 = 18446744073709551616 Werte)
⇒ Zahl nicht erratbar
⇒ Während der Lebenszeit der Anwendung wird die gleiche Zahl
nicht zweimal erzeugt
Verwendung: nur ein einziges Mal (= Nonce)
•
In einer Nachricht: Schutz vor Replay
•
Als Sessionkey: Schadensbegrenzung, wenn Schlüssel bekannt wird.
Software- und Systemsicherheit, Kap. 9 (6/16)
Debian OpenSSL-Debakel
September 2006: Debian-Maintainer Kurt Roeckx modifiziert
ssleay rand add(), um Warnmeldungen von Memorydebuggern (statischen Checkern) zu vermeiden. (Zugriff auf nicht initalisierten Speicher)
/*
* Don’t add uninitialised data.
MD_Update(&m,buf,j);
*/
⇒ nur 215 Seed-Werte für OpenSSL PRNG
Mai 2008: Problem wird entdeckt
Ergebnis: Alle so erzeugten (SSL/SSH host) keys sind erratbar, d. h.
der private key bekannt!
Software- und Systemsicherheit, Kap. 9 (7/16)
Kryptographische Hashfunktionen
•
Verfahren: MD5, SHA-1, RIPEMD, SHA-512, . . .
•
Hashfunktion H (bel. lange Eingabe, Hashwert 128 Bit, 160 Bit)
•
Einwegfunktion, kein effizientes Verfahren für H −1 (bekannt)
•
Ähnliche Texte ⇒ unähnliche Hashwerte
(1 Bit in M ändern ⇒ > 64 Bit in h(M ) geändert)
•
Eigenschaften:
h = H(M ) leicht berechenbar, H −1 schwierig (unmöglich)
Gegeben M : Schwierig M ′ mit H(M ) = H(M ′ ) zu finden
Schwierig, M, M ′ mit H(M ) = H(M ′ ) zu finden
•
Symmetrische Verschlüsselung mit CBC nicht gut genug
•
Bruce Schneier (1996): I am wary of using MD5“
”
Software- und Systemsicherheit, Kap. 9 (8/16)
MD5 - Kollision
d1
12
83
80
dd
0f
96
31
46
e4
37
53
57
f9
dd
7e
88
3c
e2
7e
65
02
ab
83
5b
b4
e8
2b
c5
40
25
d8
87
ce
6f
e6
04
71
82
da
54
f7
ee
58
41
3e
03
b6
2a
c4
3e
5a
31
fd
70
70
69
b8
08
56
02
80
3d
fb
51
34
39
a8
9a
7f
25
8f
63
0d
06
89
e8
5b
06
1e
98
55
f7
ae
d2
c6
af
ad
cd
6d
48
98
f9
34
c9
ac
cd
21
5c
06
9f
d4
a0
bc
2f
09
d9
36
e9
b6
ca
f4
1d
c9
9f
a8
b5
b3
bd
19
33
83
87
02
f2
c6
42
93
d1
12
83
80
dd
0f
96
31
46
e4
37
53
57
f9
dd
7e
88
3c
e2
7e
65
02
ab
83
5b
34
e8
ab
c5
40
25
d8
87
ce
6f
e6
04
f1
82
da
54
f7
ee
58
41
3e
03
b6
2a
c4
3e
5a
31
fd
70
70
69
b8
08
56
02
80
3d
fb
51
34
39
28
9a
7f
25
8f
63
0d
06
89
e8
5b
06
1e
98
55
f7
ae
d2
c6
af
ad
cd
6d
48
98
f9
34
c9
ac
cd
21
5c
06
9f
d4
a0
bc
2f
09
d9
36
e9
b6
ca
f4
1d
c9
9f
a8
b5
b3
bd
19
33
83
07
02
72
c6
42
93
Software- und Systemsicherheit, Kap. 9 (9/16)
August 2004: Xiaoyun Wang, Dengguo Feng, Xuejia Lai, Hongbo Yu:
Collisions for Hash Functions MD4, MD5, HAVAL-128 and RIPEMD
. . . it takes about one hour to find . . . “ zwei Nachrichten mit gleichem
”
Hashwert
2007: Marc Stevens, Arjen K. Lenstra, and Benne de Weger: Erzeugung von beliebigen Executables mit gleichem MD5 Wert (durch
Anhängen von Bytes am Ende der Dateien).
2008: Alexander Sotirov, Marc Stevens und Jacob Appelbaum: Fälschen
von Zertifikaten (einer Zertifizierungsstelle)
Software- und Systemsicherheit, Kap. 9 (10/16)
15 Februar 2005: Bruce Schneier
SHA-1 has been broken. Not a reduced-round version. Not a simplified
”
version. The real thing.“
•
Findet Kollisionen mit 263 statt 280 Versuchen.
•
Keine Hashfunktion hat 10 Jahre gehalten . . . “
”
Software- und Systemsicherheit, Kap. 9 (11/16)
15 Februar 2005: Bruce Schneier
SHA-1 has been broken. Not a reduced-round version. Not a simplified
”
version. The real thing.“
•
Findet Kollisionen mit 263 statt 280 Versuchen.
Keine Hashfunktion hat 10 Jahre gehalten . . . “
”
November 2007: NIST schreibt SHA-3 Wettbewerb aus
•
31.10.2008: 64 Einreichungen
2010: noch 14 übrig
Entscheidung 2012 geplant
Software- und Systemsicherheit, Kap. 9 (11/16)
Hashwerte: Anwendungen
•
als Einwegfunktion:
speichere Hash(Passwort) statt Passwort (Unix)
•
als Schutz vor trojanischen Pferden:
speichere Hash(file) separat von file (CD-RO),
prüfe täglich (tripwire)
Software- und Systemsicherheit, Kap. 9 (12/16)
Hashwerte bei Kommunikation
•
als Schutz vor Übertragungsfehlern: sende Daten + Hash(Daten)
•
als Schutz vor böswilliger Manipulation:
Daten + Hash(Daten) - nicht gut genug
Enc(Daten) - nicht gut genug
Enc(Daten + JAVACARD“) - CBC-Mode
”
Enc(Daten) + Hash(Daten)
Daten + Enc(Hash(Daten))
Software- und Systemsicherheit, Kap. 9 (13/16)
Message Authentication Code (MAC)
•
Zwei Parteien, beide kennen gemeinsamen Secret Key K
•
MAC = EK (H(P )), verschickt wird P + MAC, oder
•
Verschlüssele P mit 3DES im CBC Mode, MAC ist letzter Block
(ALG DES MAC8 NOPAD), oder führende 4 Byte des letzten
Blocks (ALG DES MAC4 NOPAD).
•
HMAC: H(K ⊕ opad + H(K ⊕ ipad + Message))
•
Eigenschaften:
Nachricht muss von einer Person stammen, die K kennt.
P wurde während der Übertragung nicht modifiziert.
Nur wer K kennt, kann MAC überprüfen.
Software- und Systemsicherheit, Kap. 9 (14/16)
Zufallszahlen und Hashen in Java
class java.security.SecureRandom
•
rand = new java.security.SecureRandom();
•
rand.nextBytes(byte array);
Füllt byte array mit zufälligen Werten.
class MessageDigest
•
md = MessageDigest.getInstance("SHA1",cryptProvider);
•
Hashwert berechnen:
byte[] digest(byte[] input)
Software- und Systemsicherheit, Kap. 9 (15/16)
Zufallszahlen und Hashen in JavaCard
class RandomData
•
rand = RandomData.getInstance(RandomData.ALG SECURE RANDOM);
•
setSeed: Initialisierung des Generators – unnötig!
•
generateData(bArray, offset, howMany);
class MessageDigest
•
md = MessageDigest.getInstance(MessageDigest.ALG SHA, false);
•
Verfahren: ALG SHA(-1) (20 Bytes), ALG MD5 (16 Bytes)
•
Hashwert berechnen:
short doFinal(byte[] inBuff, short inOffset, short inLength,
byte[] outBuff, short outOffset)
Software- und Systemsicherheit, Kap. 9 (16/16)
Kapitel 10: Kopierkarte – Protokolle
Aufgabe: Design einer Karte, die Punkte speichert
Anforderungen:
1. Schutz vor gefälschten Karten
2. Schutz vor unauthorisiertem Laden von Punkten
3. kein Schutz vor technischem Equipment (zweiter Chip, Signalleitungen, . . . ) – oder doch?
4. nur symmetrische Verschlüsselung
Wie sehen Protokolle aus?
Software- und Systemsicherheit, Kap. 10 (1/7)
Lösung Nr. 1
Laden
Abbuchen
T→C
load + n
C→T
ok
T→C
pay + n
C→T
ok
Software- und Systemsicherheit, Kap. 10 (2/7)
Lösung Nr. 1
Laden
Abbuchen
T→C
load + n
C→T
ok
T→C
pay + n
C→T
ok
Unsicher!
Software- und Systemsicherheit, Kap. 10 (2/7)
Lösung Nr. 1
Laden
Abbuchen
T→C
load + n
C→T
ok
T→C
pay + n
C→T
ok
Unsicher!
Jeder kann Punkte auf eine echte Karte laden!
Software- und Systemsicherheit, Kap. 10 (2/7)
Lösung Nr. 1
Laden
Abbuchen
T→C
load + n
C→T
ok
T→C
pay + n
C→T
ok
Unsicher!
Jeder kann Punkte auf eine echte Karte laden!
Man kann mit einer gefälschten Karte bezahlen!
Software- und Systemsicherheit, Kap. 10 (2/7)
Lösung Nr. 2
Laden
Abbuchen
T→C
load + Passphrase1 + n
C→T
ok
T→C
pay + n
C→T
hash(Passphrase2)
Software- und Systemsicherheit, Kap. 10 (3/7)
Lösung Nr. 2
Laden
Abbuchen
T→C
load + Passphrase1 + n
C→T
ok
T→C
pay + n
C→T
hash(Passphrase2)
Unsicher!
Software- und Systemsicherheit, Kap. 10 (3/7)
Lösung Nr. 2
Laden
Abbuchen
T→C
load + Passphrase1 + n
C→T
ok
T→C
pay + n
C→T
hash(Passphrase2)
Unsicher!
Passphrase1 kann mit gefälschter Karte protokolliert werden!
Software- und Systemsicherheit, Kap. 10 (3/7)
Lösung Nr. 2
Laden
Abbuchen
T→C
load + Passphrase1 + n
C→T
ok
T→C
pay + n
C→T
hash(Passphrase2)
Unsicher!
Passphrase1 kann mit gefälschter Karte protokolliert werden!
hash(Passphrase2) kann ausgelesen werden!
Software- und Systemsicherheit, Kap. 10 (3/7)
Gefordert: Authentisierung von Terminal und Karte
Software- und Systemsicherheit, Kap. 10 (4/7)
Gefordert: Authentisierung von Terminal und Karte
Situation: Alice will wissen, dass Bob echt ist.
Software- und Systemsicherheit, Kap. 10 (4/7)
Gefordert: Authentisierung von Terminal und Karte
Situation: Alice will wissen, dass Bob echt ist.
⇒ Bob muss beweisen, dass er ein Geheimnis (jetzt) kennt.
Software- und Systemsicherheit, Kap. 10 (4/7)
Gefordert: Authentisierung von Terminal und Karte
Situation: Alice will wissen, dass Bob echt ist.
⇒ Bob muss beweisen, dass er ein Geheimnis (jetzt) kennt.
⇒ Das Geheimnis muss dabei geheim bleiben.
Software- und Systemsicherheit, Kap. 10 (4/7)
Lösung Nr. 3
T und C kennen geheimen Schlüssel K
Laden
Abbuchen
T→C
load + ES (K)[Passphrase1] + n
C→T
ok
T→C
pay + n
C→T
ES (K)[hash(Passphrase2)]
Software- und Systemsicherheit, Kap. 10 (5/7)
Lösung Nr. 3
T und C kennen geheimen Schlüssel K
Laden
Abbuchen
T→C
load + ES (K)[Passphrase1] + n
C→T
ok
T→C
pay + n
C→T
ES (K)[hash(Passphrase2)]
Unsicher! – Replayattacke!
Software- und Systemsicherheit, Kap. 10 (5/7)
Lösung Nr. 3
T und C kennen geheimen Schlüssel K
Laden
Abbuchen
T→C
load + ES (K)[Passphrase1] + n
C→T
ok
T→C
pay + n
C→T
ES (K)[hash(Passphrase2)]
Unsicher! – Replayattacke!
ES (K)[Passphrase1] kann protokolliert werden!
Software- und Systemsicherheit, Kap. 10 (5/7)
Lösung Nr. 3
T und C kennen geheimen Schlüssel K
Laden
Abbuchen
T→C
load + ES (K)[Passphrase1] + n
C→T
ok
T→C
pay + n
C→T
ES (K)[hash(Passphrase2)]
Unsicher! – Replayattacke!
ES (K)[Passphrase1] kann protokolliert werden!
ES (K)[hash(Passphrase2)] kann ausgelesen werden!
Software- und Systemsicherheit, Kap. 10 (5/7)
Lösung Nr. 4
T und C kennen geheimen Schlüssel K, N1 , N2 sind Zufallszahlen
(Random numbers, nonces)
Laden
Abbuchen
T→C
load + ES (K)[Passphrase1 + N1 ] + n
C→T
ok
T→C
pay + n
C→T
ES (K)[hash(Passphrase2 + N2 )]
Software- und Systemsicherheit, Kap. 10 (6/7)
Lösung Nr. 4
T und C kennen geheimen Schlüssel K, N1 , N2 sind Zufallszahlen
(Random numbers, nonces)
Laden
Abbuchen
T→C
load + ES (K)[Passphrase1 + N1 ] + n
C→T
ok
T→C
pay + n
C→T
ES (K)[hash(Passphrase2 + N2 )]
Unsicher! – Replayattacke!
Software- und Systemsicherheit, Kap. 10 (6/7)
Lösung Nr. 4
T und C kennen geheimen Schlüssel K, N1 , N2 sind Zufallszahlen
(Random numbers, nonces)
Laden
Abbuchen
T→C
load + ES (K)[Passphrase1 + N1 ] + n
C→T
ok
T→C
pay + n
C→T
ES (K)[hash(Passphrase2 + N2 )]
Unsicher! – Replayattacke!
ES (K)[Passphrase1 + N1 ] kann protokolliert werden!
Software- und Systemsicherheit, Kap. 10 (6/7)
Lösung Nr. 4
T und C kennen geheimen Schlüssel K, N1 , N2 sind Zufallszahlen
(Random numbers, nonces)
Laden
Abbuchen
T→C
load + ES (K)[Passphrase1 + N1 ] + n
C→T
ok
T→C
pay + n
C→T
ES (K)[hash(Passphrase2 + N2 )]
Unsicher! – Replayattacke!
ES (K)[Passphrase1 + N1 ] kann protokolliert werden!
ES (K)[hash(Passphrase2 + N2 )] kann ausgelesen werden!
Software- und Systemsicherheit, Kap. 10 (6/7)
Prinzip: Challenge – Response
T und C kennen geheimen Schlüssel K, N ist eine Zufallszahl
Challenge
T→C
N
Response
C→T
ES (K)[N ]
Terminal entschlüsselt Antwort mit K und vergleicht mit N .
Wenn N neu ist (noch nie verwendet wurde), wird Replay verhindert.
Software- und Systemsicherheit, Kap. 10 (7/7)
Kapitel 11: Authentisierungsprotokolle
Software- und Systemsicherheit, Kap. 11 (1/21)
Wide-Mouth Frog (Burrows)
S: (Authentisierungs-)Server, Ta , Ts Zeitstempel
Kas , Kbs geheime Schlüssel (zwischen A und S bzw. B und S),
Kab Sessionkey
1.
A → S:
A, {Ta , B, Kab }Kas
2.
S → B:
{Ts , A, Kab }Kbs
Software- und Systemsicherheit, Kap. 11 (2/21)
Otway-Rees Protokoll (1987)
S: (Authentisierungs-)Server, M, Na , Nb Nonces
Kas , Kbs geheime Schlüssel (zwischen A und S bzw. B und S),
Kab Sessionkey
1.
A → B:
M, A, B, {Na , M, A, B}Kas
2.
B → S:
M, A, B, {Na , M, A, B}Kas , {Nb , M, A, B}Kbs
3.
S → B:
M, {Na , Kab }Kas , {Nb , Kab }Kbs
4.
B → A:
M, {Na , Kab }Kas
Software- und Systemsicherheit, Kap. 11 (3/21)
Yahalom Protokoll (1988)
S: (Authentisierungs-)Server, Na , Nb Nonces
Kas , Kbs geheime Schlüssel (zwischen A und S bzw. B und S),
Kab Sessionkey
1.
A → B:
A, Na
2.
B → S:
B, {A, Na , Nb }Kbs
3.
S → A:
{B, Kab , Na , Nb }Kas , {A, Kab }Kbs
4.
A → B:
{A, Kab }Kbs , {Nb }Kab
Software- und Systemsicherheit, Kap. 11 (4/21)
Needham-Schroeder (1978)
mit geheimen (symmetrischen) Schlüsseln
1.
A → S:
A, B, Na
2.
S → A:
{Na , B, Kab , {Kab , A}Kbs }Kas
3.
A → B:
{Kab , A}Kbs
4.
B → A:
{Nb }Kab
5.
A → B:
{Nb − 1}Kab
Problem: Nachricht 3 könnte ein Replay sein.
Software- und Systemsicherheit, Kap. 11 (5/21)
Kerberos
vom MIT (Miller et. al. 1987)
Ts , Ta Zeitstempel, L Lebensdauer
1.
A → S:
A, B
2.
S → A:
{Ts , L, Kab , B, {Ts , L, Kab , A}Kbs }Kas
3.
A → B:
{Ts , L, Kab , A}Kbs , {A, Ta }Kab
4.
B → A:
{Ta + 1}Kab
Software- und Systemsicherheit, Kap. 11 (6/21)
SmartCard Anwendungen
Bequemlichkeit
Authentisierung
Krankenkassendaten
Kreditkarte
Geheimnisse
E-Cash
SIM (Handy)
D-Box (Pay-TV)
Geldkarte
Unveränderbar
Personalausweis
Schutz vor Mißbrauch
Studentenausweis
Digitale Signatur
Führerschein
Software- und Systemsicherheit, Kap. 11 (7/21)
Konzentration auf Anwendungsanbieter und Kartenhalter:
Mehrseitige Sicherheit
gleiche / unterschiedliche / widersprechende Interessen
Spezialität von Smartcard-Anwendungen:
•
Kartenhalter ist potenziell feindlich
•
Karte hat Geheimnisse, die Halter nicht kennen/manipulieren darf
•
Beschränkte Ressourcen!
Software- und Systemsicherheit, Kap. 11 (8/21)
Besonderheiten bei Smartcards
1. Beschränkte Ressourcen: Oft nur 3DES und Zufallszahlen
2. langsame Datenübertragung
3. Kartenhalter als Angreifer: Unbeschränkter Zugriff auf die Karte
4. Kommunikation Karte/Leser kann physikalisch geschützt werden
aber: hilft nicht gegen zweiten Chip auf der Karte(?)
5. Kombination mit Infrastruktur (z. B. vernetzte Server)
6. Risiko: Eine Karte geknackt, alle geknackt?
⇒ Protokolldesign muss Schutzziele, Ressourcen und
Angreifermöglichkeiten berücksichtigen
Software- und Systemsicherheit, Kap. 11 (9/21)
Sichere Kommunikation mit der Smart Card
Grundlage: ISO 7816-4, EMV, Openplatform, etc.
1. Gegenseitige Authentisierung (mutual authentication)
2. Integrität der Nachrichten (Message Integrity): APDU MACs
Auch/speziell: DAPs (Data Authentication Patterns) zum Laden
von Applikationen
3. Vertraulichkeit der Nachrichten (Message Data Confidentiality)
Aber: Nur für Command APDU spezifiziert.
Software- und Systemsicherheit, Kap. 11 (10/21)
Mutual Authentication (Prinzip)
Terminal
Generate host
Karte
→ Initialize Update →
challenge
Generate card challenge
Generate session keys
← answer ←
Calculate card cryptogram
Generate session keys
Verify card cryptogram
Calculate host
cryptogram
→ External
Authenticate →
Verify host cryptogram
← answer ←
Software- und Systemsicherheit, Kap. 11 (11/21)
Smard Card Schlüssel
1. Globaler Master-Schlüssel MK
2. statischer Kartenschlüssel für gegenseitige Authentisierung und
Verschlüsselung (von MK abgeleitet)
3. statischer Kartenschlüssel für MAC (von MK abgeleitet)
4. statischer Kartenschlüssel für key encryption (von MK abgeleitet)
5. Pro Session: MAC-Schlüssel (aus Challenges abgeleitet)
6. Pro Session: Encryption Schlüssel (aus Challenges abgeleitet)
Alle Schlüssel 16 Byte (3DES mit 2 Schlüsseln)
Software- und Systemsicherheit, Kap. 11 (12/21)
Mutual Authentication (APDUs)
1. Initialize Update: Schlüsselnr. + Zufallszahl N1
80
50
0D
00
08
00 00 00 00 00 00 00 00
1C
P1 = 0D: Key set version
P2 = 00: Key index (00: erster verfügbarer)
Antwort:
43 4D
61 FF 21 57 F4 07 17 11
0D 01
F5 2D 82 9E AA CA E9 BB
3B 34 BD 49 BA 6C 8C 2F
90
(diversification data)
(Schlüsselnummer)
(Kartenzufallszahl N2 )
(card cryptogram)
00
Software- und Systemsicherheit, Kap. 11 (13/21)
2. External Authenticate
84
82
00
00
10
B9 B0 40 11 79 C7 07 10
A1 35 A7 21 C6 10 D7 C7
(Sicherheitsstufe)
(host cryptogram)
(APDU MAC)
P1: Security Level
00 = no secure messaging
01 = MAC
03 = encryption and MAC
Software- und Systemsicherheit, Kap. 11 (14/21)
Kryptogramme
1. D = N1 + N2 + 0x80 00 00 00 00 00 00 00
2. verschlüssele D mit 3DES/CBC, IV = 0x00 00 00 00 00 00 00 00
3. cryptogram = letzter Block (letzten 8 Byte)
card cryptogram: N1 = host challenge, N2 = card challenge
host cryptogram: N1 = card challenge, N2 = host challenge
Software- und Systemsicherheit, Kap. 11 (15/21)
APDU MAC:
Bilde MAC über APDU-Header + Daten, hänge MAC an Daten an.
⇒ Nachricht unverändert (Message Integrity)
Für nächste Nachricht: alte MAC ist IV (CBC mode!) für neue MAC
⇒ Reihenfolge ok, keine Nachricht fehlt
Cryptogram: Im Prinzip eine MAC
APDU Verschlüsselung
Daten verschlüsseln ⇒ Message Data Confidentiality
(APDU-Header und MAC nicht verschlüsselt)
Schlüssel: werden bei Authentisierung erzeugt.
Software- und Systemsicherheit, Kap. 11 (16/21)
APDU MAC (Berechnung)
1. Lc := Lc + 8 (da MAC mitgeschickt werden wird)
2. Cla | 0x04 (ISO: 0x84)
3. D := neuer APDU-Header + Daten (ohne Le)
4. D := D + 0x80 + n∗ 0x00 (Padding, Vielfaches von 8)
5. E := Enc(D) (3DES/CBC, IV = 0 oder letzte MAC)
6. MAC := letzten 8 Byte von E
7. APDU = neuer APDU-Header + Daten + MAC
Software- und Systemsicherheit, Kap. 11 (17/21)
Schlüssel
Key Diversification: Berechne Schlüssel für jede Karte n
Ausgangspunkt: 2DES Mother key MK =
47 45 4D 58 50 52 45 53 | 53 4F 53 41 4D 50 4C 45
+ Diversification Data D n (16 Byte)
Verschieden pro Karte (enthält Seriennummer)
n
⇒ D1,2,3
(aus D n generiert)
Software- und Systemsicherheit, Kap. 11 (18/21)
Statische Kartenschlüssel
⇒ K1n für Authentisierung/Verschlüsselung
⇒ K2n für APDU MACs
⇒ K3n für key encryption
Kin = EncM K (Di L) + EncM K (Di R), Di = Di L + Di R
Session key derivation
⇒ encryption session key und MAC session key
Card Challenge CC = CC L + CC R (jeweils 4 Byte)
Host Challenge HC = HC L + HC R (jeweils 4 Byte)
⇒ DD = CC R + HC L + CC L + HC R, SKi = EncKi (DD)
Software- und Systemsicherheit, Kap. 11 (19/21)
Neuer Reisepass (1)
Protokoll:
1. Optischer Scan des Passes ⇒ secret master key Kp
2. T → C: Get Nonce
3. C → T: N1
4. T → C: {N1 , N2 , SL }Kp (N2 eigene Nonce, SL halber Session key)
5. C → T: {N2 , N1 , SR }Kp
6. Session key (MAC und Encryption): SL + SR
Software- und Systemsicherheit, Kap. 11 (20/21)
Neuer Reisepass (2)
Sicherheit:
•
Session key: 3DES mit zwei Schlüsseln
•
Kp = Hash(Passnummer, Geburtsdatum, Ablaufdatum Pass)
•
⇒ 109 ∗ (365 ∗ 102) ∗ (365 ∗ 10) ≈ 2 ∗ 256 Schlüssel
•
⇒ entspricht einfachem DES(!)
•
Mit Fingerabdrücken: Public-Key-Kryptographie
Software- und Systemsicherheit, Kap. 11 (21/21)
Kapitel 12: Kryptographie: RSA
Software- und Systemsicherheit, Kap. 12 (1/22)
Asymmetrische Verschlüsselung (Public key)
•
Verfahren: RSA, Elliptische Kurven, (ElGamal)
•
1 öffentlicher Schlüssel P u (public key)
•
1 privater Schlüssel P r (private key)
•
blockorientiert (1024 Bit, . . . )
•
Eigenschaften:
DP r (EP u (P )) = P, DP u (EP r (P )) = P
P r nicht erratbar, P u darf jeder kennen
Entschlüsselung mit falschem Schlüssel ergibt Unsinn
Software- und Systemsicherheit, Kap. 12 (2/22)
RSA (Rivest, Shamir, Adleman) 1978
Wähle große Primzahlen p, q(p 6= q), sei n = pq.
Wähle e mit ggT(e, (p−1)(q−1)) = 1, z. B. e = 3, e =0x01,0x00,0x01
Berechne d mit ed ≡ 1 mod (p − 1)(q − 1).
⇒ Public key: e, n, e public exponent, n modulus
⇒ Private key d, n, d private exponent, n modulus
Schlüssel-/Blocklänge: # bits von n, 1024 Bits = 128 Byte
Verschlüsseln: C = P e mod n, Entschlüsseln: P = C d mod n
In Java: n BigInteger
Sicherheit: Faktorisierung großer Zahlen (unbewiesene Vermutung)
Software- und Systemsicherheit, Kap. 12 (3/22)
Anzahl Primzahlen der Länge 1024 Bit
Software- und Systemsicherheit, Kap. 12 (4/22)
Anzahl Primzahlen der Länge 1024 Bit
12651307410331561612287515175386710353237098956273445646466036883594
00015944240673886333579519658615644189346781192373999743611737189907
91007698881506790641087948193858955233664549746019822494536141699553
95044903323238520381291863113009513502941611543079003335131774527967
6977211484011404917064419380394375
Software- und Systemsicherheit, Kap. 12 (4/22)
Anzahl Primzahlen der Länge 1024 Bit
12651307410331561612287515175386710353237098956273445646466036883594
00015944240673886333579519658615644189346781192373999743611737189907
91007698881506790641087948193858955233664549746019822494536141699553
95044903323238520381291863113009513502941611543079003335131774527967
6977211484011404917064419380394375
(ca.)
Software- und Systemsicherheit, Kap. 12 (4/22)
RSA Challenges (inzwischen zurückgezogen)
Name:
RSA-576
Prize:
$10000
Digits:
174
Digit Sum:
785
1881988129206079638386972394616504398071635633794173827007\
6335642298885971523466548531906060650474304531738801130339\
6716199692321205734031879550656996221305168759307650257059
Veröffentlicht 2001, gelöst am 3.12.2003: The factors are
3980750864240649373971255005503864911990643623425267084063\
85189575946388957261768583317
and
4727721461074353025362230719730482246329146953020971164598\
52171130520711256363590397527
Software- und Systemsicherheit, Kap. 12 (5/22)
Name:
RSA-2048
Prize:
$200000
Digits:
617
Digit Sum:
2738
2519590847565789349402718324004839857142928212620403202777\
7137836043662020707595556264018525880784406918290641249515\
0821892985591491761845028084891200728449926873928072877767\
3597141834727026189637501497182469116507761337985909570009\
7330459748808428401797429100642458691817195118746121515172\
6546322822168699875491824224336372590851418654620435767984\
2338718477444792073993423658482382428119816381501067481045\
1660377306056201619676256133844143603833904414952634432190\
1146575444541784240209246165157233507787077498171257724679\
6292638635637328991215483143816789988504044536402352738195\
1378636564391212010397122822120720357
Software- und Systemsicherheit, Kap. 12 (6/22)
12.12.2009: RSA-768 gelöst. Faktoren:
3347807169895689878604416984821269081770479498371376856891
2431388982883793878002287614711652531743087737814467999489
und
3674604366679959042824463379962795263227915816434308764267
6032283815739666511279233373417143396810270092798736308917
Rechendauer: 2,5 Jahre (ca. 80 Rechner)
Factoring a 1024-bit RSA would be ... a thousand times harder“
”
Bekanntmachung zur elektronischen Signatur nach dem Signaturge”
setz und der Signaturverordnung“ vom 6.1.2010: Minimale Schlüssellängen:
Zeitraum
Länge
bis Ende
bis Ende
bis Ende
bis Ende
bis Ende
2007
2008
2009
2010
2016
1024
1280
1536
1728
1976
Software- und Systemsicherheit, Kap. 12 (7/22)
Eigenschaften von RSA
RSA hat erwünschte und unerwünschte mathematische Eigenschaften.
Beispiel:
•
17.3.2003: Timing-Angriff (Analyse der Rechenzeit) auf OpenSSL,
um geheimen RSA server key zu finden.
Lösung: RSA blinding:
Berechne x = r e ∗ C mod n (r Zufallszahl)
P = xd /r mod n
Da r zufällig: Rechenzeit zufällig.
Software- und Systemsicherheit, Kap. 12 (8/22)
Angriff auf RSA:
1. Eve hört C (mit public key von Alice verschlüsselt), und möchte
den Klartext P = C d .
2. Vorgehen: Eve wählt r < n zufällig und berechnet
x = r e mod n, t = r −1 mod n, y = C ∗ x mod n
3. Eve bringt Alice dazu, y zu signieren
(y direkt, nicht einen Hashwert)
4. Eve erhält u = y d mod n ⇒ t ∗ u mod n = r −1 y d mod n =
r −1 ∗ C d ∗ xd mod n = P (da x = r e mod n ⇒ r = xd mod n)
Moral: Never use RSA to sign a random document presented to you
”
by a stranger.“ ⇒ Richtige Verwendung wichtig!
Software- und Systemsicherheit, Kap. 12 (9/22)
RSA-Verschlüsselung: PKCS#1
Problem: ALG RSA NOPAD – unsicher
Software- und Systemsicherheit, Kap. 12 (10/22)
RSA-Verschlüsselung: PKCS#1
Problem: ALG RSA NOPAD – unsicher
⇒ ALG RSA PKCS1 oder Padding selbst programmieren
Software- und Systemsicherheit, Kap. 12 (10/22)
RSA-Verschlüsselung: PKCS#1
Problem: ALG RSA NOPAD – unsicher
⇒ ALG RSA PKCS1 oder Padding selbst programmieren
PKCS#1: RSA Encryption Standard (RSA Data Security, 1993)
1. Sei D die zu verschlüsselnde Bytefolge, #D ≤ k−11, k Schlüssellänge
2. Bilde encryption block: EB = 0x00 + BT + PS + 0x00 + D
BT: block type, 0x02 für public key encryption
PS: padding string, Pseudozufallszahlen 6= 0x00
3. Wandle EB in Zahl x, berechne y = xd mod n,
wandle y in Bytefolge ⇒ verschlüsselte Daten
Software- und Systemsicherheit, Kap. 12 (10/22)
Anmerkungen
•
Führendes 0-Byte garantiert EB < n
•
Block type 0x00, 0x01 für private key encryption (Signatur)
•
Darstellung ist eindeutig, da 0x00 6∈ PS
•
PS sollte jedesmal neu generiert werden
•
Security Condition: # PS ≥ 8 (Durchprobieren aller EBs unmöglich)
•
Problem: Es ist mit akzeptabler Wahrscheinlichkeit möglich, Texte
zu generieren, die sich ordentlich entschlüsseln lassen.
⇒ chosen-ciphertext attack möglich.
•
Version 1.5 von 1993, aktuell Version 2.1 vom 14.6.2002, OAEP:
Optimal Asymmetric Encryption Padding
Software- und Systemsicherheit, Kap. 12 (11/22)
OAEP: Optimal Asymmetric Encryption Padding
Sicher gegen adaptive chosen-ciphertext attacks.
P Plaintext, Bilde initiales Padding D = 0x00k + 0x01 + P
Verschlüssele: (D ⊕ G(r)) + (r ⊕ H(D ⊕ G(r)))
r Zufallszahl, H Hashfunktion, G Generatorfunktion
Generatorfunktion: Hashfunktion, die eine Eingabe auf eine bestimmte
Länge aufbläht, z. B: G(r) = H(r1 ) + H(r2 ) + . . . + H(rn ), ri = r + i
Nach Entschlüsseln: A = (D ⊕ G(r)), B = (r ⊕ H(D ⊕ G(r)))
⇒ x = H(A) = H(D ⊕ G(r))
⇒ r = x ⊕ B = x ⊕ (r ⊕ x)
⇒ D = A ⊕ G(r) = (D ⊕ G(r)) ⊕ G(r).
Software- und Systemsicherheit, Kap. 12 (12/22)
Public Key Cryptographic Standards
PKCS #1: RSA Cryptography Standard
PKCS #3: Diffie-Hellman Key Agreement Standard
PKCS #5: Password-Based Cryptography Standard
PKCS #6: Extended-Certificate Syntax Standard
PKCS #7: Cryptographic Message Syntax Standard
PKCS #8: Private-Key Information Syntax Standard
PKCS #9: Selected Attribute Types
PKCS #10: Certification Request Syntax Standard
PKCS #11: Cryptographic Token Interface Standard
PKCS #12: Personal Information Exchange Syntax Standard
PKCS #13: Elliptic Curve Cryptography Standard
PKCS #15: Cryptographic Token Information Format Standard
Software- und Systemsicherheit, Kap. 12 (13/22)
RSA Schlüsselgenerierung in Java
SecureRandom rand = new SecureRandom();
java.security.KeyPairGenerator keyGen =
KeyPairGenerator.getInstance("RSA",cryptProvider);
keyGen.initialize(1024,rand);
java.security.KeyPair keypair = keyGen.generateKeyPair();
Cipher: "RSA/NONE/PKCS1PADDING"
Schlüssellänge: 1024 Bit ⇒ Modulus hat genau 128 Bytes
Software- und Systemsicherheit, Kap. 12 (14/22)
Schlüssel in Java
•
key.getFormat(): Name der Kodierung: RAW, X509, PKCS#8
•
keypair.getPublic().getEncoded(): X509
keypair.getPrivate().getEncoded(): PKCS#8
•
Kodierung kann kompliziert sein.
•
Schlüssel können so ausgetausch werden.
•
Schlüssel können nicht per serialize abgespeichert werden.
•
Richtig wäre: Verwendung eines KeyStore (oder einer SmartCard,)
•
Für JavaCard: gebraucht werden Modulus und Exponent
Software- und Systemsicherheit, Kap. 12 (15/22)
RSA Schlüssel für JavaCard
Ausgangspunkt: RSA Schlüsselpaar java.security.KeyPair kp
java.security.interfaces.RSAPrivateKey priv =
(java.security.interfaces.RSAPrivateKey)kp.getPrivate();
BigInteger mod_priv_bi = priv.getModulus();
BigInteger pre_bi = priv.getPrivateExponent();
java.security.interfaces.RSAPublicKey pub =
(java.security.interfaces.RSAPublicKey)kp.getPublic();
BigInteger mod_pub_bi = priv.getModulus();
BigInteger pue_bi = pub.getPublicExponent();
•
es gilt: mod priv bi = mod pub bi, Modulus ist der gleiche
•
bei uns (BouncyCastle): public exponent = 0x01, 0x00, 0x01
Software- und Systemsicherheit, Kap. 12 (16/22)
BigInteger in Java
byte[] pub_exp = pue_bi.toByteArray();
byte[] mod_array = mod_pub_bi.toByteArray();
byte[] priv_exp = pre_bi.toByteArray();
Dann: HexString.printReadable von modulus, priv exp, pub exp
Achtung:
•
Modulus muss genau 128 Byte haben
•
Länge mod array = 129 ⇒ führendes 0x00-Byte abschneiden!
•
Länge private exponent ≤ 128 Bytes
•
Länge priv exp = 129 ⇒ führendes 0x00-Byte abschneiden!
Software- und Systemsicherheit, Kap. 12 (17/22)
Schlüssel einlesen“ in Java
”
KeyFactory rsakf = KeyFactory.getInstance("RSA", cryptProvider);
BigInteger mod = new BigInteger(1, mod_array);
BigInteger pub = new BigInteger(1, pub_exp);
BigInteger priv = new BigInteger(1, priv_exp);
PublicKey pub_key = rsakf.generatePublic(
new java.security.spec.RSAPublicKeySpec(mod, pub));
PrivateKey priv_key = rsakf.generatePrivate(
new java.security.spec.RSAPrivateKeySpec(mod, priv));
Software- und Systemsicherheit, Kap. 12 (18/22)
RSA Verschlüsselung in Java
Cipher cip = Cipher.getInstance("RSA/NONE/PKCS1PADDING",bcp);
Verschlüsselung:
PublicKey pub_key;
cip.init(javax.crypto.Cipher.ENCRYPT_MODE,pub_key);
cip.doFinal ...
Entschlüsselung:
PrivateKey priv_key;
cip.init(javax.crypto.Cipher.DECRYPT_MODE,priv_key);
cip.doFinal ...
Achtung:
•
Immer nur mit dem public key verschlüsseln
•
Immer nur mit dem private key entschlüsseln
Software- und Systemsicherheit, Kap. 12 (19/22)
RSA Schlüssel in JavaCard
Ausgangspunkt: Modulus mod, private exponent priv,
public exponent pub als Byte Arrays (alle ≤ 128 Bytes!)
RSAPrivateKey rsa_priv_key=(RSAPrivateKey)KeyBuilder.buildKey(
KeyBuilder.TYPE_RSA_PRIVATE,KeyBuilder.LENGTH_RSA_1024,false);
RSAPublicKey rsa_pub_key=(RSAPublicKey)KeyBuilder.buildKey(
KeyBuilder.TYPE_RSA_PUBLIC,KeyBuilder.LENGTH_RSA_1024,false);
rsa_priv_key.setModulus(mod,(short)0,(short)mod.length);
rsa_priv_key.setExponent(priv,(short)0,(short)priv.length);
rsa_pub_key.setModulus(mod,(short)0,(short)mod.length);
rsa_pub_key.setExponent(pub,(short)0,(short)pub.length);
Software- und Systemsicherheit, Kap. 12 (20/22)
RSA Verschlüsselung in JavaCard
Cipher rsacip = Cipher.getInstance(Cipher.ALG RSA NOPAD,false);
Cipher rsacip = Cipher.getInstance(Cipher.ALG RSA PKCS1,false);
Verschlüsselung:
rsacip.init(rsa_pub_key, Cipher.MODE_ENCRYPT);
rsacip.doFinal(...);
Entschlüsselung:
rsacip.init(rsa_priv_key, Cipher.MODE_DECRYPT);
rsacip.doFinal(...);
Software- und Systemsicherheit, Kap. 12 (21/22)
RSA Schlüsselgenerierung in JavaCard
Klasse KeyPair:
kp = new KeyPair(ALG RSA, LENGTH RSA 1024);
kp.genKeyPair(); kp.getPublic(); kp.getPrivate();
Dauert lange, sollte nur einmal gemacht werden.
Software- und Systemsicherheit, Kap. 12 (22/22)
Kapitel 13: Die elektronische Bahnfahrkarte
Aufgabe: Bau eines Demonstrator
Ziel: Demonstration, dass eine elektronische Fahrkarte
•
keine Nachteile gegenüber einer Papierfahrkarte hat,
•
geringe Investitionskosten erfordert,
•
zur Kostenreduktion beitragen kann,
•
Vorteile für den Kunden bringt.
Realisierung: mit anonymer/multiapplikativer SmartCard
Software- und Systemsicherheit, Kap. 13 (1/9)
Anforderungen
1. Kauf der Fahrkarte per Internet und per Automat
2. Fahrkarte ist anonym, nicht an einen Zug/Platz gebunden
3. Kontrolle offline möglich
4. Rückgabe von Fahrkarten per Internet/Automat
5. Übertragen von Tickets
Software- und Systemsicherheit, Kap. 13 (2/9)
Nachteile Online-Ticket (Papier)
1. Kontrolle sehr aufwendig
2. Personengebunden (Kreditkarte oder Bahncard)
3. Mehrfachbenutzung wird erst nachträglich erkannt
Software- und Systemsicherheit, Kap. 13 (3/9)
Anforderungen Heim-PC
1. Anzeige der auf der Karte befindlichen Tickets
2. Löschen von Tickets
3. Kauf eines Tickets über das Internet
4. Schutz vor Verbindungsabbruch ⇒ Kauf wiederaufsetzbar
5. Rückgabe eines Tickets über das Internet
6. Übertragen des Tickets auf eine andere Karte
Software- und Systemsicherheit, Kap. 13 (4/9)
Anforderungen Kontrolle im Zug
1. Schaffner mit Lesegerät, Display 240x320 Pixel. Tastatur?
2. Anzeige des Tickets (garantiert echt!)
3. Anzeige nicht aller Tickets (Freigabe durch Kunde)
4. Entwertung eines Ticket, d. h. Hinzufügen einer Kontrollmarkierung. Mehrfachkontrolle soll möglich sein.
5. Kontrolle offline, d. h. ohne Zugriff auf irgendeinen Server
6. Mehrfachbenutzung, falsche Benutzung (falsche Strecke, nach Ablauf der Gültigkeit) wird erkannt.
Software- und Systemsicherheit, Kap. 13 (5/9)
Anforderungen allgemein
1. Fälschen, Manipulieren, Kopieren von Tickets unmöglich.
Designprinzip: Ticket auf der Smartcard ist echt, nicht kopierbar,
nicht manipulierbar.
2. Ist eine Karte kompromittiert, so dürfen nicht alle Karten betroffen
sein.
3. Sicherheit des Karteninhabers wichtig für die Akzeptanz!
•
Benutzung durch Unbefugte?
•
Tickets gehen nicht verloren (auch bei PC-Crash)
•
Karte blockiert nicht
4. Dolev-Yao Angreifer im Internet: Kann alle Nachrichten abhören,
manipulieren, unterdrücken, umleiten, gleichzeitig mehrere Sessions parallel betreiben . . .
Software- und Systemsicherheit, Kap. 13 (6/9)
5. einfache Fahrt, Rückfahrticket, Dauerticket
6. Maximal 10 Tickets speicherbar
7. Tickets nicht an einen Zug oder einen Platz gebunden
8. möglichst wenig personenbezogenen Daten speichern (außer zur
Abwicklung der Bezahlung/Erstattung).
Software- und Systemsicherheit, Kap. 13 (7/9)
Ihre Entscheidungen
1. Tarifsystem, Gültigkeit der Tickets
2. Seriennummern SmartCard/Ticket?
3. Wieviel Schutz des Kunden vor Dummheit/Bösartigkeit (Dritter)?
Software- und Systemsicherheit, Kap. 13 (8/9)
Frage: Wird ein symmetrisches Verschlüsselungsverfahren ausreichen?
Antwort: Nein. Die Anforderungen sind nur mit einem asymmetrischen
Verfahren erfüllbar. Verwenden Sie verschiedene Schlüssel + Zertifikate.
Frage: Wie kann das Terminal kontrollieren, ob ein Ticket für diese
Fahrt gültig ist?
Antwort: Es ist völlig ausreichend das Ticket auf dem Terminal darzustellen. Der Schaffner entscheidet dann, ob das Ticket für diese Fahrt
verwendet werden kann und stempelt es ab.
Frage: Was kann ich tun, um zu verhindern, dass die Deutsche Bahn
den Kunden benachteiligt?
Antwort: Der Bahn kann man vertrauen. Die Bahn kann es sich nicht
leisten, absichtlich ein Protokoll anzugreifen. Schließlich kann sich die
Bahn nicht ins Ausland absetzen . . .
Software- und Systemsicherheit, Kap. 13 (9/9)
Kapitel 14: Weitere kryptographische
Verfahren
Software- und Systemsicherheit, Kap. 14 (1/21)
Schlüsselaustausch
•
Verfahren: Diffie-Hellman (1976)
•
Pr(A) und Pu(B) ⇒ symmetrischer Schlüssel K
•
Pr(B) und Pu(A) ⇒ symmetrischer Schlüssel K
•
Pr(A) = x, Pr(B) = y, Pu(A) = g x mod n, Pu(B) = g y mod n
⇒ K = P u(A)y mod n = P u(B)x mod n
•
Für jedes Paar ergibt sich anderes K
•
Sicherheit: diskreter Logarithmus (n große Primzahl, g Generator)
•
Auch mit elliptischen Kurven
Software- und Systemsicherheit, Kap. 14 (2/21)
Symmetrische Stromverschlüsselung (Secret key)
•
Verfahren: RC4, A5, . . .
•
1 (initialer) Schlüssel K für Ver-/Entschlüsselung
•
stromorientiert:
Datenstrom d1 , d2 , d3 , . . .
separater Schlüsselstrom k1 , k2 , k3 , . . .
Verschlüsselung: d1 ⊕ k1 , d2 ⊕ k2 , d3 ⊕ d3 , . . .
•
schneller und einfacher als Blockchiffren
•
Anwendung: GSM, WLAN, . . .
Software- und Systemsicherheit, Kap. 14 (3/21)
RC4
•
1987 von Ron Rivest für RSA entwickelt
Software- und Systemsicherheit, Kap. 14 (4/21)
RC4
•
1987 von Ron Rivest für RSA entwickelt
•
7 Jahre lang geheim, 1994 anonym im Internet
Software- und Systemsicherheit, Kap. 14 (4/21)
RC4
•
1987 von Ron Rivest für RSA entwickelt
•
7 Jahre lang geheim, 1994 anonym im Internet
Aktueller Schlüssel: 256 Byte S0 , . . . , S255 , nächstes Schlüsselbyte kn :
i = (i + 1) mod 256; j = (j + Si ) mod 256;
swap Si and Sj ; t = (Si + Sj ) mod 256; kn = St
Software- und Systemsicherheit, Kap. 14 (4/21)
RC4
•
1987 von Ron Rivest für RSA entwickelt
•
7 Jahre lang geheim, 1994 anonym im Internet
Aktueller Schlüssel: 256 Byte S0 , . . . , S255 , nächstes Schlüsselbyte kn :
i = (i + 1) mod 256; j = (j + Si ) mod 256;
swap Si and Sj ; t = (Si + Sj ) mod 256; kn = St
Initialisierung:
1. S0 = 0, S1 = 1, . . . , S255 = 255
2. Array K0 , . . . , K255 mit (initialem) Schlüssel (evtl. wiederholen)
3. j = 0; for i = 0 to 255:
{ j = (j + Si + Ki ) mod 256; swap Si and Sj ; }
Software- und Systemsicherheit, Kap. 14 (4/21)
Digitale Signatur
•
Verfahren: RSA, DSA (digital signature algorithm)
•
Gegeben: Text P , privater Schlüssel P r, Hashfunktion H
•
signieren: SigP r (P ) = EP r (H(P )), verschickt wird: P + SigP r (P )
•
verifizieren: DP u (SigP r (P )) = H(P )
•
ALG RSA SHA PKCS1
•
Eigenschaften:
?
Signatur muss von einer Person stammen, die P r kennt.
⇒ Nichtrückweisbarkeit
P wurde während der Übertragung nicht modifiziert.
Jeder kann Signatur verifizieren (überprüfen), da P u öffentlich.
Software- und Systemsicherheit, Kap. 14 (5/21)
Digitale Signatur mit RSA
M zu signierende Message beliebiger Länge.
Signaturerzeugung:
1. Berechne H(M) (H Hashfunktion, z.B. SHA-1)
2. Berechne D = Padding + H(M) (Padding: PKCS1v5 oder OAEP)
3. Signatur S = D d mod n (d private key, n Modulus)
Signaturprüfung:
1. Berechne D wie oben
2. Berechne D ′ = S e mod n (e public key)
3. Prüfe D = D ′
Software- und Systemsicherheit, Kap. 14 (6/21)
Digitale Signatur mit DSA
DSA (= digital signature algorithm, FIPS 186-2). Standardisiert 2000.
•
Allgemeine Parameter: p, q, g
p Primzahl, q Primzahl und Teiler von p − 1, g = h(p−1)/q mod p
h beliebig mit: 1 < h < p − 1 und h(p−1)/q mod p > 1
p 512 – 1024 Bit
q 160 Bit
•
Private key x: Zufallszahl 0 < x < q
(Verwende große Zufallszahl r und x = r mod q)
•
Public key y: y = g x mod p
Sicherheit: Schwierigkeit, einen diskreten Logarithmus zu berechnen.
Software- und Systemsicherheit, Kap. 14 (7/21)
Digitale Signatur mit DSA
Signaturerzeugung:
1. Berechne D = H(M) und k Zufallszahl (k muss geheim bleiben!)
2. Berechne r = (g k mod p) mod q, s = (k −1 ∗ (D + x ∗ r)) mod q
3. Signatur S ist Paar aus r und s
Signaturprüfung:
1. Berechne w = s−1 mod q, u1 = (D ∗ w) mod p, u2 = (r ∗ w) mod q
2. Berechne v = ((g u1 ∗ y u2 ) mod p) mod q
3. Prüfe v = r?
Software- und Systemsicherheit, Kap. 14 (8/21)
Message Authentication Code (MAC)
•
Zwei Parteien, beide kennen gemeinsamen Secret Key K
•
MAC = EK (H(P )), oder
•
Verschlüssele P mit 3DES im CBC Mode, MAC ist letzter Block,
oder
•
MAC(text) = HMAC(K, text) = H((K0 ⊕opad)||H((K0 ⊕ipad)||text))
opad = B ∗ 0x5c, ipad = B ∗ 0x36 (HMAC, fips 198)
•
verschickt wird P + MAC
•
Eigenschaften:
Nachricht muß von einer Person stammen, die K kennt.
P wurde während der Übertragung nicht modifiziert.
Nur wer K kennt, kann MAC überprüfen.
Software- und Systemsicherheit, Kap. 14 (9/21)
Signaturen in Java
•
Signaturobjekt erzeugen:
sig = Signature.getInstance("SHA1withRSA", cryptProvider);
•
Signieren:
void initSign(PrivateKey theKey)
void update(byte[] data)
byte[] sign()
•
Verifizieren:
void initVerify(PublicKey theKey)
void update(byte[] data)
boolean verify(byte[] signature)
Software- und Systemsicherheit, Kap. 14 (10/21)
Signaturen in JavaCard
class Signature
•
digitale Signatur: ALG RSA SHA PKCS1
1. Berechne Hashwert mit SHA-1 (Eingabe beliebig lang)
2. Fülle Hashwert mit PKCS1 Padding auf
3. Verschlüssele mit privatem RSA Schlüssel
•
MAC: ALG DES MAC4 NOPAD, ALG DES MAC8 NOPAD
1. Verschlüssele Text mit DES/CBC bzw. 3DES/CBC
2. die ersten 4 bzw. alle 8 Bytes des letzten Block sind der MAC
•
Signaturobjekt erzeugen:
sig = Signature.getInstance(Signature.ALG RSA SHA PKCS1,false);
Software- und Systemsicherheit, Kap. 14 (11/21)
Signaturen in JavaCard (2)
•
Initialisieren:
void init(Key theKey, byte theMode)
theMode: Signature.MODE SIGN, Signature.MODE VERIFY
•
Signieren:
short sign(byte[] inBuff, short inOffset, short inLength,
byte[] sigBuff, short sigOffset)
•
Verifizieren:
boolean verify(byte[] inBuff, short inOffset,
short inLength,
byte[] sigBuff, short sigOffset,
short sigLength)
Software- und Systemsicherheit, Kap. 14 (12/21)
Challenge/Response (Authentisierung)
•
A → B: N Challenge (N Nonce)
•
B → A: SigP r (N ) Response, oder
B → A: EK (N ), oder
B → A: EK (H(N ))
•
Eigenschaften:
B kennt ein Geheimnis (P r oder K)
B kennt das Geheimnis jetzt (N ist neu)
•
Risiko: N könnte verschlüsselter Text sein!
Software- und Systemsicherheit, Kap. 14 (13/21)
Zertifikate
Problem: Woher weiß man, dass P uA auch A gehört?
•
Zuordnung Person zu Public Key P u
•
trusted third party mit privatem Schlüssel T P r
•
Jeder kennt T P u
•
Zertifikat = SigT P r (A + P uA )
•
Bei Smartcards: Jede Karte mit eigenem Schlüssel, vom Anwendungsanbieter zertifiziert.
Software- und Systemsicherheit, Kap. 14 (14/21)
Zertifikathierarchie
R
zz
z
|z
z
DD
DD
D"
A1
zz
z
z
}z
B1
zz
z
z
}z
C1
DD
DD
DD
DD
!
...
Am
DD
zz
DD
z
z
DD
D! }zzz
...
DD
DD
D!
Bn
zz
z
zz
z
z
}z
DD
DD
D!
...
Cx
Software- und Systemsicherheit, Kap. 14 (15/21)
Wissen der Teilnehmer
•
R : P rR , P u R
•
A1 : P rA1 , P uA1 , SigR (A1 + P uA1 ), P uR
•
B1 : P rB1 , P uB1 , SigA1 (B1 +P uB1 ), P uA1 , SigR (A1 +P uA1 ), P uR
•
C1 : P rC1 , P uC1 , SigB1 (C1 + P uC1 ), P uB1 , SigA1 (B1 + P uB1 ),
P uA1 , SigR (A1 + P uA1 ), P uR
⇒ Zertifikatliste
[P uC1 , SigB1 (C1 + P uC1 )], [P uB1 , SigA1 (B1 + P uB1 )], [P uA1 , SigR (A1 + P uA1 )]
Software- und Systemsicherheit, Kap. 14 (16/21)
Überprüfung der Zertifikate
Kommunikation C1 ↔ Cx :
C1 → Cx : [P uC1 , SigB1 (C1 + P uC1 )], [P uB1 , SigA1 (B1 + P uB1 )],
[P uA1 , SigR (A1 + P uA1 )]
Cx kennt: [P uCx , SigBn (Cx + P uCx )], [P uBn , SigAm (Bn + P uBn )],
[P uAm , SigR (Am + P uAm )], P uR
Vor Benutzung von P uC1 prüft Cx :
•
SigB1 (C1 + P uC1 ) mit P uB1
•
SigA1 (B1 + P uB1 ) mit P uA1
•
SigR (A1 + P uA1 ) mit P uR (Cx kennt P uR )
Software- und Systemsicherheit, Kap. 14 (17/21)
Zertifikate bei Eticket (Beispiele)
Software- und Systemsicherheit, Kap. 14 (18/21)
Zertifikate bei Eticket (Beispiele)
DB O
n
?? OOO
nn{{
n
?? OOO
n
{
n
n
{
?? OO
n {{
n
n
OOO
??
n
n
{
n
{
}
OOO
n
n
n
'
n
Server vnn Automat
Schaffner
Card
Heim PC
1. . . x
1. . . y
1. . . z
1. . . n
1. . . m
Software- und Systemsicherheit, Kap. 14 (18/21)
Zertifikate bei Eticket (Beispiele)
DB O
n
?? OOO
nn{{
n
?? OOO
n
{
n
n
{
?? OO
n {{
n
n
OOO
??
n
n
{
n
{
}
OOO
n
n
n
'
n
Server vnn Automat
Schaffner
Card
Heim PC
1. . . x
1. . . y
1. . . z
1. . . n
1. . . m
X
Software- und Systemsicherheit, Kap. 14 (18/21)
Zertifikate bei Eticket (Beispiele)
DB O
n
?? OOO
nn{{
n
?? OOO
n
{
n
n
{
?? OO
n {{
n
n
OOO
??
n
n
{
n
{
}
OOO
n
n
n
'
n
Server vnn Automat
Schaffner
Card
Heim PC
1. . . x
1. . . y
1. . . z
1. . . n
1. . . m
X
DB=Server
AA
y
AA
y
y
AA
y
y
AA
y
A
|yy
Automat
Schaffner
Card
1. . . y
1. . . z
1. . . n
Software- und Systemsicherheit, Kap. 14 (18/21)
Zertifikate bei Eticket (Beispiele)
DB O
n
?? OOO
nn{{
n
?? OOO
n
{
n
n
{
?? OO
n {{
n
n
OOO
??
n
n
{
n
{
}
OOO
n
n
n
'
n
Server vnn Automat
Schaffner
Card
Heim PC
1. . . x
1. . . y
1. . . z
1. . . n
1. . . m
X
DB=Server
AA
y
AA
y
y
AA
y
y
AA
y
A
|yy
Automat
Schaffner
Card
1. . . y
1. . . z
1. . . n
DB=Server
Card
1. . . n
Software- und Systemsicherheit, Kap. 14 (18/21)
Angriffe
•
Replay-Attacke: Angreifer hört Nachricht mit, verwendet sie später
•
Man in the middle-Attacke: A will mit B kommunizieren
Angreifer gibt sich gegenüber A als B und gegenüber B als A aus.
•
Orakel-Attacke: Angreifer bringt A dazu, unbeabsichtigt etwas zu
entschlüsseln/signieren
Angreifermodelle
•
Einschränkungen: Kann keine Schlüssel/Zufallszahlen/Hashwerte
erraten
•
Netzwerk/Funk: Kann in Echtzeit alle Nachrichten mithören, analysieren und manipulieren (Dolev-Yao Angreifer)
•
SmartCards: Kann Kommunikation Karte/Terminal mithören, analysieren, manipulieren (oder auch nicht)
Software- und Systemsicherheit, Kap. 14 (19/21)
Besonderheiten bei Smartcards
1. Beschränkte Ressourcen: Oft keine asymmetrische Kryptographie
2. langsame Datenübertragung
3. Kartenhalter als Angreifer: Unbeschränkter Zugriff auf die Karte
4. Kommunikation Karte/Leser kann physikalisch geschützt werden
aber: hilft nicht gegen zweiten Chip auf der Karte(?)
5. Kombination mit Infrastruktur (z. B. vernetzte Server)
6. Risiko: Eine Karte geknackt, alle geknackt?
⇒ Protokolldesign muß Schutzziele, Ressourcen und
Angreifermöglichkeiten berücksichtigen
Software- und Systemsicherheit, Kap. 14 (20/21)
Kryptographische Protokolle: Laden eines Ticket
1.
S→C:
N1
2.
S←C:
Sign(P r(C))[Enc(P u(DB))[N1]] + Sign(P r(DB))[P u(C)] ?
3.
S→C:
Enc(P u(C))[Sign(P r(DB))[T]]
1.
S→C:
N1
2.
S←C:
Sig(P r(C))[N1 ] + Enc(P u(DB))[N2 ] + Sign(P r(DB))[P u(C)]
3.
S→C:
Sig(P r(DB))[N2 ] + Enc(P u(C))[Sign(P r(DB))[T]]
1.
S→C:
N1
2.
S←C:
Sign(P r(C))[N2 + N1 ] + Sign(P r(DB))[P u(C)]
3.
S→C:
Enc(P u(C))[Sign(P r(DB))[T + N2 ]]
Software- und Systemsicherheit, Kap. 14 (21/21)
Kapitel 15: Weitere Protokolle
Software- und Systemsicherheit, Kap. 15 (1/22)
Needham-Schroeder Protokoll (1978)
Ziel: Gegenseitige Authentisierung in Netzwerken
Message 1
A → B:
A, B, {Na , A}P u(B)
Message 2
B → A:
B, A, {Na , Nb }P u(A)
Message 3
A → B:
A, B, {Nb }P u(B)
P u(A) Public Key von A, Na , Nb Nonces, {.}K verschlüsseln mit K
Message 2
B → A:
B, A, {Na , Nb , B}P u(A)
Software- und Systemsicherheit, Kap. 15 (2/22)
Man-in-the-Middle Angriff
A ⇔
I ⇔
Message 1
A → B:
A, B, {Na , A}P u(B)
Message 2
B → A:
B, A, {Na , Nb }P u(A)
Message 3
A → B:
A, B, {Nb }P u(B)
B
Message α.1
A → I:
A, I, {Na , A}P u(I)
Message β.1
I(A) → B:
A, B, {Na , A}P u(B)
Message β.2
B → I(A):
B, A, {Na , Nb }P u(A)
Message α.2
I → A:
I, A, {Na , Nb }P u(A)
Message α.3
A → I:
A, I, {Nb }P u(I)
Message β.3
I(A) → B:
A, B, {Nb }P u(B)
Software- und Systemsicherheit, Kap. 15 (3/22)
SMB Reflection Attack
SMB (Server Message Block): Protokoll von Microsoft (1992) zum Zugriff auf Services (Drucker, Dateisystem, ...)
1. C → S: Hello
2. S → C: N (Challenge)
3. C → S: Hash(N + Passwort)
Software- und Systemsicherheit, Kap. 15 (4/22)
Problem:
•
Angreifer gibt sich als Server aus
•
Bringt den Client dazu, den Angreifer zu kontaktieren:
<img src="\\Attacker\Share\pic.jpg">
•
Kontaktiert den SMB-Port des Client
•
Holt sich die Challenge vom Client und gibt sie dem Client zurück
•
Gibt den Hash vom Client dem Client zurück
⇒ Angreifer hat Zugriff auf Client
Entdeckt 1996 (Dominique Brezinski), wiederentdeckt 2001, gepatched
2008.
Software- und Systemsicherheit, Kap. 15 (5/22)
EMV 4.1: Integrated Circuit Card Specifications for
Payment Systems
EMV = Europay, MasterCard, Visa
•
Book 1: Application Independent ICC to Terminal Interface
Requirements
•
Book 2: Security and Key Management
•
Book 3: Application Specification
•
Book 4: Cardholder, Attendant, and Acquirer Interface
Requirements
Software- und Systemsicherheit, Kap. 15 (6/22)
Static Data Authentication (SDA)
Ziel: Erkennen unauthorisierter Änderung von (statischen) Daten nach
Personalisierung der Karte.
Software- und Systemsicherheit, Kap. 15 (7/22)
Offline Dynamic Data Authentication (DDA)
Ziel: Terminal erkennt gefälschte Karte
Software- und Systemsicherheit, Kap. 15 (8/22)
PIN Verschlüsselung
PIN in sicherem PIN Pad eingeben, zusammen mit Karten-Challenge
mit Public Key der Karte verschlüsseln, an Karte schicken.
Issuer Authentication
Kryptogramme und MACs wie bei Openplatform.
Software- und Systemsicherheit, Kap. 15 (9/22)
Digitaler Reisepass
Für das Auslesen der Fingerabdrücke: extended access control
1. basic access control (Symmetrisch, DES) weak encryption
2. Chip Authentication (Diffie-Hellman Key Exchange)
⇒ strong encryption
3. Passive Authentication (Prüfung Zertifikat des Passes)
4. Terminal Authentication (Challenge-Response)
statischer Schlüssel im Pass, jeweils neuer Schlüssel erzeugt im Terminal, Zertifikate, Public Key Infrastructure, . . .
Software- und Systemsicherheit, Kap. 15 (10/22)
elektronischer Personalausweis
Ziel: gegenseitige Authentisierung und sicherer Kanal zwischen ePA
und Terminal (vgl. Reisepass)
Protokoll: PACE (Password Authenticated Connection Establishment)
1. shared key PK = KDF(password) (key derivation)
2. T → C: Get Nonce
3. C → T: {N}PK
4. T und C: Generieren zufällige Diffie-Hellman Schlüssel, Algorithmenparameter werden aus N generiert
5. T und C: Diffie-Hellman Schlüsselaustausch ⇒ session key K
6. T und C: KMAC = KDFMAC (K), KEnc = KDFEnc (K)
7. T → C: MACKMAC (Pu(T)), C → T: MACKMAC (Pu(C))
Software- und Systemsicherheit, Kap. 15 (11/22)
SSL 3.0
Ziel: sichere Kommunikation im Internet (Client/Server)
1. handshake protocol: Authentisierung, Schlüsselgenerierung
2. record layer: eigentlicher Datenaustausch
parametrisiert mit den eigentlichen kryptographischen Verfahren
schließt mehrere Sicherheitslücken in SSL 2.0
Software- und Systemsicherheit, Kap. 15 (12/22)
SSL 3.0: Handshake
C → S: client hello: protocol version + session ID + cipher suite +
compression method + NC (28 byte)
C ← S: server hello: . . . + NS (28 byte)
C ← S: server certificate: X.509 in ASN.1 Kodierung
(optional: C ← S: certificate request, key exchange)
C ← S: server hello done
(optional: C → S: client certificate)
C → S: encrypted premaster secret: {pms}Pu(S)
C → S: change cipher specs, finished
C ← S: change cipher specs, finished
Software- und Systemsicherheit, Kap. 15 (13/22)
SSL 3.0: Schlüsselgenerierung
master secret
key block
=
MD5(pms + SHA(’A’
+ pms + NC + NS ))
+
MD5(pms + SHA(’BB’
+ pms + NC + NS ))
+
MD5(pms + SHA(’CCC’
+ pms + NC + NS ))
=
MD5(ms + SHA(’A’
+ ms + NS + NC ))
+
MD5(ms + SHA(’BB’
+ ms + NS + NC ))
+
...
Aufteilen in:
client MAC key, server MAC key, client ENC key, server ENC key, . . .
Software- und Systemsicherheit, Kap. 15 (14/22)
SSL 3.0: Ende des Handshake
finished Nachricht:
MD5(ms + pad2 + MD5(messages + Sender + ms + pad1)) +
SHA(ms + pad2 + SHA(messages + Sender + ms + pad1))
messages: Alle bisherigen Nachrichten
•
Unterschiedliche Schlüssel pro Richtung
•
Unterschiedliche Schlüssel pro Session
Software- und Systemsicherheit, Kap. 15 (15/22)
SSL 3.0: Record Layer
Nachricht N wird:
•
(optional) fragmentiert (16K), komprimiert ⇒ N′
•
P := type + version + length + N′
•
MAC := H(MAC key + pad2 + hash(MAC key + pad1 + SEQNUM + L + N′ ))
•
verschickt wird: M := t + v + L + Enc(P + MAC)
SEQNUM: Sequenznummer (gegen Replays)
L: Länge von Enc(P + MAC)
Software- und Systemsicherheit, Kap. 15 (16/22)
Schwächen in SSL 2.0
•
Schlüssellänge für Export nur 40 Bit
•
MAC nicht über alles
•
ciphersuite rollback attack: Angreifer ändert hello Nachrichten
⇒ Schwaches Verfahren wird verwendet
⇒ finished in SSL 3.0
•
version rollback attack . . .
Software- und Systemsicherheit, Kap. 15 (17/22)
Daumenregeln für Protokolldesign (1)
1. Signaturen/MACs: Auf dem gesamten Klartext
•
nicht: den verschlüsselten Text signieren
•
nicht: nur einen Teil des Klartexts signieren
2. Genügend Redundanz: Im (zu signierenden und zu verschlüsselndem) Klartext zusätzlich . . .
•
den Namen des Principals wiederholen
•
die Instruction wiederholen
Software- und Systemsicherheit, Kap. 15 (18/22)
Daumenregeln für Protokolldesign (2)
3. Auf die Reihenfolge der Schritte achten:
Bei mehreren Schritten muss man sorgfältig überlegen, wie man
garantiert:
(a) richtige Reihenfolge der Schritte
(b) kein Schritt wird ausgelassen
(c) keine anderen Schritte zwischendurch
(Bzw. ob das wichtig ist.)
4. Nicht blockieren:
Darauf achten, dass bei falscher Reihenfolge die SmartCard nicht
in einen internen Zustand gerät, bei dem kein Kommando mehr
akzeptiert wird.
Software- und Systemsicherheit, Kap. 15 (19/22)
Daumenregeln für Protokolldesign (3)
5. Verschiedene Protokollabläufe unterscheiden:
Darauf achten, dass parallele Protokollabläufe mit 2 SmartCards
nicht gemischt werden können.
6. Replays vermeiden.
Software- und Systemsicherheit, Kap. 15 (20/22)
Noch mehr Daumenregeln
(aus Anderson/Needham, Programming Satan’s Computer )
•
Be very clear about the security goals and assumptions.
•
Be clear about the purpose of encryption – secrecy, authenticity,
binding, or producing pseudorandom numbers. Do not assume that
its use is synonymous with security.
•
Be careful about how you ensure temporal succession and association.
•
Where the identity of a principal is essential to the meaning of a
message, it should be mentioned explicitly in the message.
•
Make sure you include enough redundancy.
•
Be careful that your protocol does not make some unexamined
assumptions about the properties of the underlying cryptographic
Software- und Systemsicherheit, Kap. 15 (21/22)
algorithms.
•
If a signature is affixed to encrypted data, then one cannot assume that the signer has any knowledge of the data. A third party
certainly cannot assume that the signature is authentic, so nonrepudiation is lost.
•
Do not trust the secrecy of other people’s secrets.
•
Be careful, especially when signing or decrypting data, not to let
yourself be used as an oracle by the opponent.
•
Do not confuse decryption with signature.
•
Be sure to distinguish different protocol runs from each other.
Software- und Systemsicherheit, Kap. 15 (22/22)
Kapitel 16: Security?
1993: How to rob a bank the cashcard way“
”
1993/95–2008: ‘Kentucky Fried Chip’ hack u.a.
1999: DVD-Verschlüsselung, 2000: ebook-Verschlüsselung
2001: WLAN (Un-)Sicherheit, 2001: CCC klont D2 Kundenkarte“
”
Januar 2005: RFID Chips im Autoschlüssel geknackt
Dezember 2006: Word/Excel Passwörter, XBox, HD DVD
2005-2008: Klonen des ePass, Fälschen der Daten
2008: Mifare Classic Crack, Premiere Kartentausch, IPhone entsperren
2001-2008: SMB reflection attack November 2009: TLS Renegotiation Lücke, Chip and PIN is broken“ 1.1.2010: EC-Karten Disaster
”
September 2010: Attacke auf ePerso, .NET padding attack, HDCP,
Dezember 2010: Private Key für PS3 gefunden
Software- und Systemsicherheit, Kap. 16 (1/30)
How to rob a bank the cashcard way“: ATMs
”
1993 in Großbritannien – Geldautomaten
Situation: Nachts ATMs offline (wegen batch processing)
Lösung: PIN verschlüsselt auf Magnetstreifen speichern
Problem:
Software- und Systemsicherheit, Kap. 16 (2/30)
How to rob a bank the cashcard way“: ATMs
”
1993 in Großbritannien – Geldautomaten
Situation: Nachts ATMs offline (wegen batch processing)
Lösung: PIN verschlüsselt auf Magnetstreifen speichern
Problem:
•
Kontonummer unabhängig von PIN
•
Kontonummer kann verändert werden
•
⇒ anderes Konto wird belastet
Software- und Systemsicherheit, Kap. 16 (2/30)
Geldautomaten in Großbritannien
•
Problem: Phantomabhebungen
•
Banken sagen: betrügerische Kunden
•
Kunden klagen
Ergebnis
1. Keinerlei Qualitätskontrolle bei der Softwareentwicklung
2. Es gab Betrugsmöglichkeiten (s.o.)
3. Oktober 2005 wurde bekannt: Ein IT-Zentrum war in großangelegten Betrug eingestiegen: PIN-Generierung wurde so manipuliert,
dass nur 3 verschiedene PINs erzeugt wurden
+ Testkarten = beliebiges Abheben
Software- und Systemsicherheit, Kap. 16 (3/30)
‘Kentucky Fried Chip’ hack
Digitales (Pay-)Satelliten TV – 2 Beispiele:
1. Abschaltkommando unverschlüsselt ⇒ kann blockiert werden.
2. Alle Karten mit gleichem Schlüssel, der bekannt wurde
⇒ Reaktivierung abgeschalteter Karten
Software- und Systemsicherheit, Kap. 16 (4/30)
‘Kentucky Fried Chip’ hack
Digitales (Pay-)Satelliten TV – 2 Beispiele:
1. Abschaltkommando unverschlüsselt ⇒ kann blockiert werden.
2. Alle Karten mit gleichem Schlüssel, der bekannt wurde
⇒ Reaktivierung abgeschalteter Karten
European Satellite-TV Pirate Card Encyclopaedia (1998):
Channels - which can be viewed with pirate cards? - today, all
Eurocrypt pirate cards decode all Eurocrypt channels (TV1000,
Filmnet 1, Filmnet 2, TV3 Sweden, TV3 Denmark/Norway,
TV2 Norge, Tv Plus, Z-TV, Tv6, Nickelodeon, VH-1, Filmnet
2, MTV, Eurosport, TCC, Discovery, CNN, TV1000 Cinema,
DR2, Canal +, Cine Cinema, BBC Prime). The Videocrypt2
channels are also cracked. For the Sky channels, there are sometimes working pirate cards, but they are expensive.
Software- und Systemsicherheit, Kap. 16 (4/30)
2001: CCC klont D2 Kundenkarte“
”
GSM – (europäischer) Mobilfunkstandard
•
Algorithmus A5 für Sprachverschlüsselung: 1994 im Internet
54 Bit Schlüsselmaterial ⇒ potentiell schwach, nie geknackt
A5/1 etc.: kürzere Schlüssel (Export in mittleren Osten)
•
A3, A8: Authentisierung, Schlüsselgenerierung: COMP128
1997 im Internet (geheime Studie von 1988)
Schwachstelle: 150.000 Anfragen ⇒ geheimer Schlüssel
Software- und Systemsicherheit, Kap. 16 (5/30)
•
30.7.2010: Karsten Nohl: A5/1 in 30 Sekunden entschlüsseln (Rainbow tables, brute force)
•
DefCon 2010: IMSI-Catcher für 1500 Dollar, die (falsche) Basisstation weist das Handy an, keine Verschlüsselung zu benutzen (so
in der GSM 2 Spec vorgesehen)
•
27C3 (Dezember 2010): GSM entschlüsseln in 20 Sekunden, Hardware: Wegwerfhandy + Laptop
Software- und Systemsicherheit, Kap. 16 (6/30)
2005: RFID Chips im Autoschlüssel
Digital Signature Transponder von Texas Instruments für:
•
Wegfahrsperre: Benzineinspritzung nur dann, wenn Challenge-Response
mit RFID im Autoschlüssel (im Zündschloss) erfolgreich – z. B.
Ford 2005
insgesamt 150 Mio. Schlüssel (mit/ohne Kryptographie)
•
Geldlose Bezahlung (Tanken etc.): ExxonMobil SpeedPass, 7 Mio.
Exemplare
geheimes Verfahren mit 40-bit Key, entwickelt Anfang der 90er
geknackt mit brute-force re-engineering
Quelle: www.rfidanalysis.org
Software- und Systemsicherheit, Kap. 16 (7/30)
Smart Card Protection Profile (von SCSUG):
Attackers are assumed to have various levels of expertise, resources, and motivation. Relevant expertise may be in general
semiconductor technology, software engineering, hacking techniques, or the specific TOE. Resources may range from personal computers and inexpensive card reading devices to very expensive and sophisticated engineering test and measurement devices. They may also include software routines, some
of which are readily available on the internet. Motivation may
include economic reward or the satisfication and notoriety of
defeating expert security. It is assumed that given sufficient
time and expertise, any smard card can be compromised.
Software- und Systemsicherheit, Kap. 16 (8/30)
Tamper-Proof
•
Auslesen des Speichers unmöglich
•
Abhören“ der Signalleitungen unmöglich
”
Verändern des Speichers unmöglich
•
⇒ Datenfälschung unmöglich
⇒ Geheimnisse (Schlüssel, PINs) bleiben geheim
Software- und Systemsicherheit, Kap. 16 (9/30)
Tamper-Proof ?
•
1990: Ablösen der Plastikhülle, Inspektion mit Mikroskop
•
1991: Löschen des EEPROM mit UV-Licht
•
1992: PIN-Angriff: Stromunterbrechung
•
1993: Reduzieren/Stoppen des Takts
•
1993: Ändern des ROM durch Laser-Schneider
•
1995: Erhöhen des Takts, Reduzieren der Spannung
•
1995: Timing Attacks
•
1995: Abhören der Busse mit Mikro-Nadeln, Ändern des EEPROM
Software- und Systemsicherheit, Kap. 16 (10/30)
Tamper-Proof ??
•
1996: Differential Fault Analysis: Erzeugen transienter Fehler
•
1998: Simple Power Analysis: Messung des Stromverbrauchs
•
1998: Differential Power Analysis: Messung des Stromverbrauchs
•
2001: Messung der elektromagnetischen Abstrahlung
•
2002: Erzeugen von Fehlern durch Licht
Software- und Systemsicherheit, Kap. 16 (11/30)
Die PIN-Attacke
for(byte i=0; i<4; i++)
if (buf[i] != PIN[i]) {
remaining tries--;
ISOException.throwIt(...);
}
Software- und Systemsicherheit, Kap. 16 (12/30)
Die PIN-Attacke
for(byte i=0; i<4; i++)
if (buf[i] != PIN[i]) {
remaining tries--;
ISOException.throwIt(...);
}
Problem: remaining tries steht im EEPROM
⇒ Bei Update erhöhter Stromverbrauch, Dauer ca. 5 msec.
⇒ Messbar, dass Zähler verändert wird
⇒ Änderung kann durch Stromunterbrechung verhindert werden
Software- und Systemsicherheit, Kap. 16 (12/30)
Die PIN-Attacke: Lösung
remaining_tries--;
boolean bad = false;
for(byte i=0; i<4; i++)
if (buf[i] != PIN[i]) bad = true;
if (bad) ISOException.throwIt(...);
remaining_tries++;
Software- und Systemsicherheit, Kap. 16 (13/30)
Timing Attack/Simple Power Analysis
RSA-Signatur: c = md mod n. Oft: Square and multiply Algorithmus:
c = 1; s
while (d
if (d
s = s
e = e
}
=
>
%
*
/
m;
0) do {
2 == 1) c = c * z mod n;
s mod n;
2;
Software- und Systemsicherheit, Kap. 16 (14/30)
Timing Attack/Simple Power Analysis
RSA-Signatur: c = md mod n. Oft: Square and multiply Algorithmus:
c = 1; s
while (d
if (d
s = s
e = e
}
=
>
%
*
/
m;
0) do {
2 == 1) c = c * z mod n;
s mod n;
2;
Probleme:
1. Laufzeit abhängig von # 1-Bits in d
2. Messung des Stromverbrauchs zeigt, in welchen Iterationen
c = c ∗ z mod n stattfindet.
3. ⇒ private key
Software- und Systemsicherheit, Kap. 16 (14/30)
Originale Meßkurve
Software- und Systemsicherheit, Kap. 16 (15/30)
Transformierte Kurve
Software- und Systemsicherheit, Kap. 16 (16/30)
Multiplikationskurve
Software- und Systemsicherheit, Kap. 16 (17/30)
Vergrößerung
Software- und Systemsicherheit, Kap. 16 (18/30)
Erzeugen von Fehlern
Ein extremes Beispiel:
RSA Signieren: s = md mod (p ∗ q).
Effizienter ist s1 = md mod p, s2 = md mod q, s = f (s1 , s2 )
(RSA im CRT Modus)
Annahme: 1. Berechnung korrekt, 2. falsch ⇒ p = gcd(p ∗ q, sef − m).
⇒ Schlüssel geknackt
Software- und Systemsicherheit, Kap. 16 (19/30)
Differential Fault Analysis
Idee:
•
Eine Anfrage (Signieren/Ver-/Entschlüsseln) oft (100-5000 mal)
stellen
Klartext muss nicht bekannt sein
•
Fehler verursachen (bei DES etc. in den letzten Runden)
•
die verschiedenen Ergebnisse statistisch analysieren
⇒ geheimer Schlüssel
Software- und Systemsicherheit, Kap. 16 (20/30)
Differential Power Analysis
Idee:
•
Viele (1000-10000) unterschiedliche Anfragen
(Signieren/Ver-/Entschlüsseln) stellen
Klartext muss nicht bekannt sein
•
Stromverbrauch messen
•
Messungen mit Ergebnissen statistisch korrelieren
⇒ geheimer Schlüssel
Software- und Systemsicherheit, Kap. 16 (21/30)
Gegenmaßnahmen
Hardware:
•
Besonderes Schaltungslayout
(Optische Analyse)
•
Aktiver Schutzschild
•
Sensoren
•
Dual rail logic
•
Bus/Speicher-Verschlüsselung
•
Rauschen“ im Stromverbrauch
”
(Nadeln/Messsonden)
(Takt-/Strom-Manipulation, Licht)
(Fehler erzeugen)
Software- und Systemsicherheit, Kap. 16 (22/30)
Gegenmaßnahmen
Software:
•
Zähler für (Fehl-)versuche (DFA/DPA)
•
Laufzeit unabhängig von Daten (Timing)
•
Berechnung zufällig machen (Timing/DPA)
•
Prüfsummen (Fehler)
•
Berechnungen zweimal ausführen (Fehler)
•
Ergebnisse überprüfen (Fehler)
Software- und Systemsicherheit, Kap. 16 (23/30)
Tamper-Proof ??
•
1996: Differential Fault Analysis: Erzeugen transienter Fehler
•
1998: Simple Power Analysis: Messung des Stromverbrauchs
•
1998: Differential Power Analysis: Messung des Stromverbrauchs
•
2001: Messung der elektromagnetischen Abstrahlung
•
2002: Erzeugen von Fehlern durch Licht
•
200?: . . . nächster Angriff . . .
•
(2007: Analyse Mifare RFID Schaltung)
Software- und Systemsicherheit, Kap. 16 (24/30)
Die Mifare Classic
•
Dezember 2007: Vortrag CCC’07: Karsten Nohl, Starbug, Henryk
Plötz: Mifare Security
Rekonstruktion der Schaltung aus Fotos ⇒ Karte geknackt
•
März 2008: Hack wird bestätigt (Uni Nijmegen)
•
Juli 2008: Mifare-Hersteller NXP verklagt Uni Nijmegen
•
August 2008: Boston U-Bahn verhindert per Gericht Vortrag auf
der DefCon
•
August 2008: Diplomarbeit(!) von Henryk Plötz (HU Berlin) enthält
Krypto-Algorithmus im Detail
•
Oktober 2008: Papier Uni Nijmeger erscheint auf der ESORICS
•
Oktober 2008: Programmiertools (open source) zum Mifare-Cracken
anonym im Internet veröffentlicht
Software- und Systemsicherheit, Kap. 16 (25/30)
Einsatz der Mifare Classic
Entwickelt Mitte der 90er, bessere Versionen existieren
200 Mio Karten im Umlauf (Stand 2008)
Öffentlicher Nahverkehr: Boston, London, Niederlande, Minneapolis, Südkorea, Hong Kong, China, Madrid, Rio de Janeiro, Neu Dehli,
Bangkok, ...
Mensakarte, Zugangskontrolle, ...
Software- und Systemsicherheit, Kap. 16 (26/30)
Security Team in Nijmegen
•
Reverse Engineering durch Analyse Kommunikation Leser ↔ Karte
•
Keine physikalische Attacke auf die Karte
•
Aber: stimuliert“ durch CCC’07 Vortrag
”
Extraktion des Secret Key aus dem Leser nur durch Abhören:
•
1. Attacke: Schwäche bei Initialisierung der Chiffre
2. Attacke: Zugriff auf internen Zustand der Chiffre
•
Ergebnis: Entschlüsseln der gesamten Kommunikation, Klonen von
Karten, Ändern des Zustands echter Karten
Software- und Systemsicherheit, Kap. 16 (27/30)
Struktur der Mifare Classic
Software- und Systemsicherheit, Kap. 16 (28/30)
Authentisierung
•
Power up, Senden der UID
•
T → C: AuthRequest, C → T: N1 (32 Bit), T → C: Enc(N2 +
A1 ), C → T: Enc(A2 )
Probleme
1. PRNG in der Karte ist deterministisch, Nonce hängt ab von Zeit
seit Power up.
2. PRNG im Terminal ist deterministisch, gleiche Nonces nach Neustart.
3. PRNG hat nur 16 Bit Seed, Algorithmus ist x16 +x14 +x13 +x11 +1
⇒ A1 , A2 aus N1 , N2 berechenbar
Software- und Systemsicherheit, Kap. 16 (29/30)
Verschlüsselung
•
Stromchiffre: Daten ⊕ Schlüsselstrom
•
Enc(N2 + A1 ) = (N2 ⊕ ks1 ) + (A1 ⊕ ks2 ), Enc(A2 ) = A2 ⊕ ks3
•
Abhören der Kommunikation ergibt ks2 , ks3
•
Algorithmus ist ebenfalls Polynom (48 Bit linear feedback shift
register)
•
Senden von 0 als UID und Nonce bestimmt Zustand der Chiffre
•
Ähnliche Eingaben ⇒ ähnliche Ausgaben ⇒ Filterfunktion (48 Bit
> 32 Bit) reverse engineered
•
ks2 , ks3 ⇒ secret key (in 0.1 Sekunden)
Software- und Systemsicherheit, Kap. 16 (30/30)