![]()  | 
			|||
| HSG | 
		    
  | 
		
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?
Ü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?
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'
md5 sollte nicht weiter verwendet werden, wie Jürgen Schmidt in seinem Artikel ausführt.
Recherchiere, welches Hash-Verfahren zur Zeit als sicher gilt und wiederhole damit obige Experimente mit Python.
Denke dir eine einfache Hash-Funktion aus. Die Funktion braucht keine besonderen Ansprüche zu erfüllen.
Wo benutzt man Hash-Funktionen in der Kryptologie? Was ist ein ' salt' ?
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==
Der bei wikipedia erläuterte Algorithmus soll zu Studienzwecken in reinem Python implementiert werden.
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))