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))