Kryptosysteme, Digitale Signaturen, Keymanagement Digitale Signaturen Jürgen Ecker
Inhalt Einführung RSA-Signaturen ElGamal-Signaturen PKCS #1 ISO 9796 DSS
Klassifikation Digitale Signaturen mit message recovery Aus der Signatur kann die signierte Nachricht ermittelt werden, diese braucht nicht zusätzlich gesendet zu werden. Digitale Signaturen ohne message recovery Die signierte Nachricht ist zweiteilig, die Nachricht wird zusätzlich zur Signatur benötigt, um die Unterschrift überprüfen zu können. Randomisierte Signaturschemata Die Signatur hängt außer von der Nachricht und vom Schlüssel auch noch von einem zufälligen Parameter ab. Deterministische Signaturschemata Die Signatur hängt nur von der Nachricht und vom Schlüssel ab.
RSA-Signaturen mit message recovery Setup: Wähle RSA Schlüsselpaar (n,e), (n,d) Wähle eine Redundanzfunktion R, die Nachrichten zu Zahlen zwischen 1 und n-1 macht (vorerst beliebig). Signieren von m: berechne m´ = R(m) Redundanz hinzufügen berechne s = (m´)d mod n Signieren Verifizieren von s: berechne m´ = se mod n Signatur öffnen prüfe, ob m´ in R(M) liegt Redundanz prüfen berechne m = R-1(m´) message recovery
RSA-Signaturen mit message recovery Zur Redundanzfunktion Die Redundanzfunktion ist so zu wählen, dass es praktisch unmöglich ist, ohne den private key eine Signatur s zu erzeugen, so dass se mod n in R(M) liegt, d.h. die geforderte Redundanz besitzt. Beispiel: Die Funktionswerte von R sind immer von der Form xx
RSA Signaturen in der Praxis: ISO/IEC 9796 Eigenschaften für PK Signaturschemata, die aus k-Bit Nachrichten k-Bit Signaturen erzeugen zum Signieren von Nachrichten begrenzter Länge keine Hashfunktion benötigt message recovery
ISO/IEC 9796: Notation Beispiel: k=1024, d=150, z=19, r=3, t=64 Symbol Bedeutung k Bitlänge der Signatur d Bitlänge der zu signierenden Nachricht; d ≤ 8 (k+3)/16 z z = d/8 r Anzahl der Füllbits +1: r = 8z-d+1 t t = (k-1)/16; 2t Bytes enthalten zumindest k-1 Bits Beispiel: k=1024, d=150, z=19, r=3, t=64
ISO/IEC 9796: Signieren Message Auffüllen (padding): an die Nachricht m werden links 0 bis 7 Nullen angehängt, damit die Bitlänge ein Vielfaches von 8 wird. Man erhält die z-Byte Nachricht Auffüllen MP = mzmz-1 … m2m1 Signatur
ISO/IEC 9796: Signieren Message Erweiterung (extension) MP wird so oft links an MP angehängt, bis die so entstehende Bytefolge aus t Bytes besteht. Gegebenenfalls werden beim letzten Mal nur mehr die ersten paar Bytes von rechts verwendet. Man erhält die t-Byte Nachricht Auffüllen Erweiterung ME = MEtMEt-1 … ME2ME1 MP = mzmz-1 … m2m1 Signatur
ISO/IEC 9796: Signieren Redundanz π Message Verwendet wird eine Shadow-Funktion S S(ab) = π(a)π(b) man erhält die 2t-Byte-Folge zuletzt wird das Byte S(MEz) durch rS(MEz) ersetzt. Message Auffüllen Erweiterung π 1 2 3 4 5 6 7 8 9 A B C D E F Redundanz MR = S(MEt)MEtS(MEt-1)MEt-1... S(ME1)ME1 ME = MEtMEt-1 … ME2ME1 Signatur
ISO/IEC 9796: Signieren Message Truncating man nimmt die k-1 rechten Bits von MR und fügt links eine 1 an. Forcing mit dem Rabin-Signaturverfahren lassen sich nur Nachrichten signieren, die modulo 16 kongruent zu 6 sind, daher ersetzt man das letzte Byte ab durch b0110. man erhält eine k-Bit Nachricht IR Auffüllen Erweiterung Redundanz Truncating/forcing Signatur MR = S(MEt)MEtS(MEt-1)MEt-1... S(ME1)ME1
ISO/IEC 9796: Signieren Message Auffüllen Erweiterung Redundanz Signaturerstellung Die Nachricht IR wird signiert, man erhält eine k-Bit-Signatur s. Truncating/forcing Signaturerstellung Signatur
ISO/IEC 9796: Verifizieren Signatur öffnen Die Signatur s wird geöffnet und geprüft, ob die Nachricht IR´ mit 1 beginnt und mit 0110 endet. Andernfalls wird die Signatur zurückgewiesen. Signatur Signatur öffnen zurückweisen akzeptieren
ISO/IEC 9796: Verifizieren Message recovery Seien X die rechten k-1 Bits von IR´ Seien abc0110 die rechten 4 Nibbles von X. Stimmt das Format nicht, zurückweisen. Ersetze abc0110 durch abπ-1(a)c. Füge zwischen 0 und 15 Nullbits links an X an, um eine Bytefolge der Länge 2t zu erhalten Signatur Signatur öffnen message recovery zurückweisen akzeptieren
ISO/IEC 9796: Verifizieren Ermittlung von z und r: Aus MR´ = MR´2tMR´2t-1…MR´2MR´1 berechnet man für alle 1≤i≤t MR´2iS(MR´2i-1) Sind alle Ergebnisse gleich 0 wird die Signatur zurückgewiesen. Sonst ist z der kleinste Wert, so dass MR´2zS(MR´2z-1) ≠ 0. Dann ist r = (MR´2zS(MR´2z-1)) mod 16. Liegt r nicht zwischen 1 und 8, wird die Signatur zurückgewiesen. Signatur Signatur öffnen message recovery zurückweisen akzeptieren
ISO/IEC 9796: Verifizieren Ermittlung der ursprünglichen Nachricht MP´i = MR´2i-1 für 1≤i≤z. Sind die r-1 linken Bits von MP´ nicht gleich 0, so wird die Signatur zurückgewiesen. Sonst besteht M´ aus den 8z-r+1 rechten Bits von MP´. Signatur Signatur öffnen message recovery zurückweisen akzeptieren
ISO/IEC 9796: Verifizieren Redundanz prüfen Die Nachricht M´ wird (wie beim Signieren) den Schritten Auffüllen, Erweitern, Redundanz unterworfen, ist das Ergebnis nicht MR´, so wird die Signatur zurückgewiesen. Signatur Signatur öffnen message recovery Redundanz prüfen zurückweisen akzeptieren
RSA-Signaturen ohne message recovery PKCS Public Key Cryptography Standards RSA Laboratories ab 1991 PKCS #1 RSA Cryptography Standard andere: #3: DH-Key Agreement Standard #6: Extended-Certificate Syntax Standard #12: Personal Information Exchange Syntax Standard #13: Elliptic Curve Cryptography Standard …
PKCS #1: Notation Symbol Bedeutung |X| Bytelänge von X EB encryption block n RSA-Modul k k=|n| p, q n = p.q BT Blocktyp e (n,e) public key d (n,d) private key M Nachricht S Signatur MD, MD´ Hashwerte (unter MD2 oder MD5) PS Füllstring (padding string)
PKCS #1: Signieren und Verifizieren Nachricht Hashing Nachricht wird mit MD2 oder MD5 gehasht Codierung Hashwert und Hashfunktionsidentifikator werden ASN.1- und anschließend BER- codiert. Hashing Codierung Signatur
PKCS #1: Signieren und Verifizieren Formatierung D Bytestring mit |D| ≤ k-11. BT (Blocktyp) ist 00 oder 01, empfohlen wird BT=01. PS (padding string) ist Bytestring mit |PS| = k-3-|D|; ist BT=00, dann sind alle Bytes von PS gleich 00, ist BT=01, dann sind alle Bytes von PS gleich FF. EB = 00BTPS00D. Nachricht Hashing Codierung Blockformatierung Bytestring2Integer RSA Integer2Bytestring Signatur
PKCS #1: Signieren und Verifizieren Parsen prüfen, ob der Bytestring von der Form 00BTPS00D ist, wobei D Bytestring mit |D| ≤ k-11. BT (Blocktyp) ist 00 oder 01 PS (padding string) ist Bytestring mit |PS| = k-3-|D|; ist BT=00, dann sind alle Bytes von PS gleich 00, ist BT=01, dann sind alle Bytes von PS gleich FF. Signatur Bytestring2Integer RSA Integer2Bytestring Parsen zurückweisen akzeptieren
PKCS #1: Signieren und Verifizieren Decodierung BER-decodieren, Hashwert und Hashfunktionsidentifikator auslesen. Falls nicht decodierbar oder sinnlos, Signatur zurückweisen. Signatur Bytestring2Integer RSA Integer2Bytestring Hashing Hashwert mit Hashfunktion gemäß Identifikator berechnen und vergleichen. Gegebenenfalls Signatur zurückweisen. Parsen Decodierung zurückweisen Hashing + Vergleich akzeptieren
DSS Digital Signature Standard DSA (Digital Signature Algorithm) FIPS 186 Variante des ElGamal-Signaturschemata verwendete Hashfunktion ist SHA-1
DSS: Schlüsselerzeugung Wähle q, so dass 2159 < q < 2160. Wähle t, so dass 0 ≤ t < 8. Wähle t=8. Wähle p prim, so dass gilt 2511+64t < p < 2512+64t und q | p-1. Wähle ein Element g der Ordnung q in Zp*. Wähle a zufällig, so dass 1 < a < q-1. Berechne A = ga mod p. Public key ist (p,q,g,A), secret key ist a.
DSS: Signieren und Verifizieren Wähle k zufällig, so dass 1 < k < q. Berechne r = (gk mod p) mod q. Berechne s = k-1(h(m)+ar) mod q. Signatur ist (r,s). Verifizieren: Prüfe 0 < r < q und 0 < s < q. Berechne x = s-1.h(m) mod q und y = r.s-1 mod q. Prüfe r = (gx .Ay mod p) mod q.