hmac selber bauen

Code-Stücke können hier veröffentlicht werden.
Antworten
Wasserglas
User
Beiträge: 12
Registriert: Donnerstag 30. November 2017, 11:48

Moin moin,
wie der Titel schon sagt, versuche ich den hmac selbst zu basteln, ist ne Praxisaufgabe der uni, leider stelle ich mich gerade selten dämlich an, ich bin in python noch nicht sehr geübt und stehe daher "gelegentlich" fröhlich im Wald und weiß nicht was fehlt auch wenn es selbst für Anfänger offensichtlich sein sollte...

das große Problem ist das ich eigentlich nur die Erinnerung an die erklärung des Profs habe und eine Mathematische Formel MAC(text)t = HMAC(K, text)t = H((K0 ¯ opad )|| H((K0 ¯ ipad) || text))t wunderschönes Teil^^
Ich hab einfach versucht das Ding nach zu bauen stellte aber schnell fest das das natürlich nicht so einfach wird wie ich gehofft hatte.

Eigentlich scheint das ganze Konstrukt ja ganz einfach zu sein, nur der erste Teil mit dem k0 XOR opad, gibt mir in meinem versuch , ich verstehe auch wieso, einen bool wert aus. Da sollte er aber eigentlich was vergleichen... lange rede garkein Sinn, hat jemand ne Ahnung wie man das lösen kann?

Code: Alles auswählen

import hashlib

m = b"1"
k = b"a28d1be25564a48db89d3b2a708f65d8efb33650"
#b = 64 
opad = 64*0x5c
ipad = 64*0x36


k0_ipad = k != ipad
k0 = k0_ipad + m
 
k0_sha1 = k0.encode('utf-8')
sha_1 = hashlib.sha1()
sha_1.update(k0_sha1)
k0_sha1 = sha_1.hexdigest()

k0_opad = (k != opad)
myhash = k0_sha1 + k0_opad

myhash_sha1 = myhash.encode('utf-8')
sha_1 = hashlib.sha1()
sha_1.update(myhash_sha1)
myhash_sha1 = sha_1.hexdigest()

MAC = myhash_sha1[0:6]
print (MAC)

__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ich bin mir ziemlich sicher, dass du nicht irgendwas vergleichen, sondern mit den entsprechenden Bit-Operationen verarbeiten sollst. Aus deiner Formel wird mir nicht ganz klar *welche* das sind, aber ich sehe zB Veroderung und dieser hochgestellte Strich bedeutet bestimmt was tolles anderes.

Das musst du rausfinden, und die entsprechende Funktion bzw den Operator in Python benutzen. == und != werden *IMMER* nur True/False liefern, das hilft dir nix.
Wasserglas
User
Beiträge: 12
Registriert: Donnerstag 30. November 2017, 11:48

mh naja doch, vergleichen muss ich den schlüssel k mit dem ipad bzw später dem opad. allerdings muss ich die noch mit bytes "auffüllen". also k auf die selbe länge bringen wie ipad und das dann vergleichen... joar,..
hast du oder auch jemand anderes der das hier liest vllt ne Idee wo man den hmac algorithmus programmiert sehen kann? ich hab gefühlt schon halb google umgegraben finde aber nur programme wo die hmac bib genutzt wurde, logischerweise, wer programmiert sowas schon selbst wenns ne bib gibt :P
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

Kann ja sein dass du auch irgendwann mal was vergleichen musst. Aber in deiner Formel steht an der Stelle was anders.

Und du BENUTZT die hashlib. Von Python. Das Open Source ist. Und auf github lebt. Und HMAC implementiert. Da kann man reinschauen ;)
Wasserglas
User
Beiträge: 12
Registriert: Donnerstag 30. November 2017, 11:48

joar, danke, das hat tatsächlich geholfen :D
ab und an is da einfach n Brett am Kopf^^
Wasserglas
User
Beiträge: 12
Registriert: Donnerstag 30. November 2017, 11:48

so. nun hab ich fast alles wie ich es eigentlich gern hätte, nur der letzte Schritt, der will mich einfach nicht in Ruhe lassen.
Nach dem erstellen des hmac´s soll ich daraus per HOTP ein einmal Kennwort generieren.
Es ist auch alles soweit klar, nur der letzte Algorithmus will einfach nicht funktionieren, ich habe inzwischen 3 oder 4 verschiedene Versionen gefunden, die bei den Themenerstellern angeblich immer super funktionieren, nur bei mir feuern sie fröhlich Fehlermeldungen in die Landschaft...

Code: Alles auswählen

import hashlib

vorwort = "ahfd00023142"

m = "1".encode('utf-8')
key = "a28d1be25564a48db89d3b2a708f65d8efb33650"

opad = "".join ([chr (x ^ 0x5C) for x in range(256)])
ipad = "".join ([chr (x ^ 0x36) for x in range(256)])

outer = hashlib.sha1()
inner = hashlib.sha1()

key = key + chr(0) * (inner.block_size - len(key))

outer.update(key.translate(opad).encode('utf-8'))
inner.update(key.translate(ipad).encode('utf-8'))
inner.update(m)
outer.update(inner.digest())

result = outer.hexdigest()



i = int(result[-1], 16)
#binary = int(result[(i * 2):((i * 2) + 8)], 16) & 0x7fffffff
#binary = int(result[i] & result[i + 1] & result[i + 2] & result[i + 3]) & 0x7fffffff
sbits = int(result[i * 2: i * 2 + 8], 16) & 0x7fffffff
print (sbits % 1000000)
#binary = (result[i] & 0x7f) << 24 | (result[i+1] & 0xff) << 16 | (result[i+2] & 0xff) << 8 | (result[i+3] & 0xff)


binaryEnde = binary % 100000  #soll die lezten 6 Zahlen abschneiden 
print (vorwort + binaryEnde)
#print (binary)

so sieht das ganze jetzt aus und wie man wohl recht schnell sieht, das "binary" ist das Problemkind...
Hat irgendjemand ne Idee was da der richtige Algorithmus is und wenn ja was ich ändern muss damit der Mistpudel funktioniert?
Ich verliere gerade echt den Mut :/

Mfg das Glas
Benutzeravatar
sls
User
Beiträge: 480
Registriert: Mittwoch 13. Mai 2015, 23:52
Wohnort: Country country = new Zealand();

Man sieht jetzt erstmal, dass binary auskommentiert ist und daher spätestens bei binaryEnde = binary % 100000 auf die Nase fallen wird. Oder gibt es auch eine Fehlermeldung, wenn binary nicht auskommentiert wird, wenn ja, welche? Bitte kompletten Traceback hier posten.
When we say computer, we mean the electronic computer.
Wasserglas
User
Beiträge: 12
Registriert: Donnerstag 30. November 2017, 11:48

ja, es ist auskommentiert, ca. 5 mal weil die Algorithmen leider alle das falsche Ergebnis liefern.
Es gibt keine Fehlermeldung, da der Code an sich Funktioniert, ich brauche quasie nur jemanden der sich mit der Materie Auskennt und mir sagt was an dem Algorithmus Käse ist.

Code: Alles auswählen

import hashlib



vorwort = "ahfd00023142"

m = "1".encode('utf-8')
key = "a28d1be25564a48db89d3b2a708f65d8efb33650"

opad = "".join ([chr (x ^ 0x5C) for x in range(256)])
ipad = "".join ([chr (x ^ 0x36) for x in range(256)])

outer = hashlib.sha1()
inner = hashlib.sha1()

key = key + chr(0) * (inner.block_size - len(key))

outer.update(key.translate(opad).encode('utf-8'))
inner.update(key.translate(ipad).encode('utf-8'))
inner.update(m)
outer.update(inner.digest())

result = outer.hexdigest()

print (result) # mit Tool getesteter Hmac ist 5dd9efa90eb25d84d5c20e53d493bad4f6e93425 


i = int(result[19], 16)



#binary = int(result[(i * 2):((i * 2) + 8)], 16) & 0x7fffffff
#sbits = int(result[i * 2: i * 2 + 8], 16) & 0x7fffffff
#print (sbits % 1000000)
#print (sbits)

#binary = (result[i] & 0x7f) << 24 | (result[i+1] & 0xff) << 16 | (result[i+2] & 0xff) << 8 | (result[i+3] & 0xff)

#int binary = ((hash[i] & 0x7f) << 24) | ((hash[i + 1] & 0xff) << 16) |((hash[i + 2] & 0xff) << 8) |(hash[i + 3] & 0xff);

#i = ord(result[19]) & 0xf
#binary = int(result[i] + result[i + 1] + result[i + 2] + result[i + 3]) & 0x7fffffff



code = ((ord(result[i])& int("7f",16) ) << 24 | (ord(result[i + 1])& int("ff",16) ) << 16 | (ord(result[i + 2])& int("ff",16) ) << 8 | (ord(result[i + 3])& int("ff",16) ))

binaryEnde = code % 1000000 #soll die lezten 6 Zahlen abschneiden 
hotp = str(binaryEnde)
print (binaryEnde)


print (vorwort + hotp)

so sieht es atm aus. es gibt auch ne tolle Zahl aus, nur leider eben nicht die, die ich brauche
mein ergebnis ist - ahfd00023142483110
gewünschtes Ergebnis ist - ahfd00023142738781
Antworten