![]() |
|||
| 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))