Kryptologie Material Steganographie Monoalphabetisch Polyalphabetisch One-Time-Pad Kerckhoffs-Prinzip Public-Key RSA Feistel-Chiffren IDEA AES Langzahlarithmetik Gpg4win GnuPG Keysigning-Party Einweg-Funktion Schlüsseltausch Hash digitale Signatur Authentifizierung Zertifikate Chipkarten
Pfad: Startseite / Fächer / Informatik / Kryptologie / Hash
Autor: mk
25.05.2011 16:18
2264
Hash

Aufgabe 1

Informiere dich bei wikipedia über den Begriff 'Hash-Funktion'. Wie funktioniert eine sichere Überprüfung der Passwörter beim Einloggen? Welche Kriterien erfüllt eine gute Hash-Funktion?

Aufgabe 2

Überprüfe mit Hilfe von CrypTool, ob der md5-Hash von

Franz jagt im komplett verwahrlosten Taxi quer durch Bayern

wirklich gleich

a3cca2b2aa1e3b5b3b5aad99a8529074

ist, wie es wikipedia in seinem MD5-Artikel behauptet. Verändere den Satz an einer Stelle, was passiert mit dem Hash?

Aufgabe 3

Verwende eine kryptologischen Hashfunktion in Python.

Hilfe:

>>> import hashlib
>>> m = hashlib.md5(bytes('Franz jagt im komplett verwahrlosten Taxi quer durch Bayern','utf8'))
>>> m.hexdigest()
'a3cca2b2aa1e3b5b3b5aad99a8529074'

Experimente

md5 ist unsicher!

md5 sollte nicht weiter verwendet werden, wie Jürgen Schmidt in seinem Artikel ausführt.

Aufgabe 4

Recherchiere, welches Hash-Verfahren zur Zeit als sicher gilt und wiederhole damit obige Experimente mit Python.

Aufgabe 5

Denke dir eine einfache Hash-Funktion aus. Die Funktion braucht keine besonderen Ansprüche zu erfüllen.

Aufgabe 6

Wo benutzt man Hash-Funktionen in der Kryptologie? Was ist ein ' salt' (siehe auch msdn-Beitrag) ?

Sicheres Speichern von Passwörtern

Welche Benutzer mit welchen Passwörtern sind in folgender Datei gespeichert? Gibt es Mehrfacheinträge? Haben zwei Benutzer das gleiche Passwort?

YXJtaW4=;vJsvsgdrAPKfdb/fQr6Q+HnoP5k=;5VX6Gw==
YXJtaW4=;8APq0isFhtlm11701kXRCsax4mM=;E1FWkw==
c3RhdWZpbmU=;yxwlrILytx0K3VmX71dYX3B9uhs=;WQn7tA==
YXJtaW4=;m+Q8XbGYdoA2WJEkr5Cr4RMWqck=;Zll9Pg==
c3RhdWZpbmU=;YZckp00o43tWCx752BNTIgSpwGY=;q/rwNw==
aHNn;+cYw05MJYhI2U+LwKyB+bXZscmM=;8Lp2Xg==
YWRhbQ==;rAkR2Oh1rXoCGrn0Frmx0b+7VeY=;QBYvFw==

passwort.py

Projekt: sha1 in Python

Der auf FIPS PUB 180-1 und bei wikipedia erläuterte Algorithmus soll zu Studienzwecken in reinem Python implementiert werden.

SHA-1 SHA-1.svg (Quelle: wikipedia)

def sha1(m):
    """
    berechnet zu der Bytefolge m den sha1-Hash als Bytefolge
    """
    # Hilfsfunktion
    def leftrotate(i,n):
        """
        rotiert die Bits der 32-Bit-int-Zahl i um n Stellen nach links
        """
        binstring = bin(i)[2:].zfill(32)
        return int(binstring[n:]+binstring[:n],2)
    # Konstanten
    h0 = 0x67452301
    h1 = 0xEFCDAB89
    h2 = 0x98BADCFE
    h3 = 0x10325476
    h4 = 0xC3D2E1F0
    # padding
    mbits = ''
    for b in m:
        mbits = mbits + bin(b)[2:].zfill(8)
    mlaenge = len(mbits)
    # print(m,mlaenge,mbits) # DEBUG
    mbits = mbits+'1'
    diff448 = 448 - (mlaenge+1)%512
    # print(diff448) # DEBUG
    if diff448 < 0:
        anzahl0 = 512 + diff448
    else:
        anzahl0 = diff448
    # print(anzahl0) # DEBUG
    mbits = mbits + anzahl0*'0' + bin(mlaenge)[2:].zfill(64)
    # print(mbits,len(mbits)) # DEBUG
    # Unterteilung in 512-Bit-Bloecke M
    M = []
    while len(mbits) > 0:
        M.append(mbits[0:512])
        mbits = mbits[512:]
    # print(len(M)) # DEBUG
    for block in M:
        # print(block) # DEBUG
        w = []
        for i in range(16):
            w.append(int(block[i*32:(i+1)*32],2))
        # print(w) # DEBUG
        for i in range(16,80):
            w.append(leftrotate(w[i-3] ^ w[i-8] ^ w[i-14] ^ w[i-16],1))
        a = h0
        b = h1
        c = h2
        d = h3
        e = h4
        for i in range(80):
            if 0 <= i <= 19:
                f = (b & c) | ((~b) & d)
                k = 0x5A827999
            elif 20 <= i <= 39:
                f = b ^ c ^ d
                k = 0x6ED9EBA1
            elif 40 <= i <= 59:
                f = (b & c) | (b & d) | (c & d)
                k = 0x8F1BBCDC
            elif 60 <= i <= 79:
                f = b ^ c ^ d
                k = 0xCA62C1D6
            temp = (leftrotate(a,5) + f + e + k + w[i])%4294967296
            e = d
            d = c
            c = leftrotate(b,30)
            b = a
            a = temp
        h0 = (h0 + a)%4294967296 # 2**32 = 4294967296
        h1 = (h1 + b)%4294967296
        h2 = (h2 + c)%4294967296
        h3 = (h3 + d)%4294967296
        h4 = (h4 + e)%4294967296
    return bytes(ntob(h0)+ntob(h1)+ntob(h2)+ntob(h3)+ntob(h4))

sha1.py

Links

Kleines Delphi-Demo-Programm

MD5-Demo md5.zip