MD5-Hashs aus Strings und Files berechnen

Übersicht BlitzBasic Codearchiv

Neue Antwort erstellen

Chester

Betreff: MD5-Hashs aus Strings und Files berechnen

BeitragSo, Okt 18, 2009 19:39
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi,

als Vorbereitung für eine Facharbeit in Mathe hatte ich mir mal den MD5-Algorithmus näher angeschaut und zum besseren Verständnis in BB nachprogrammiert. Falls es jemand braucht, nur zu...

Was ist MD5?
Message Digest 5 ist eine Hashfunktion, die es ermöglicht aus Strings und Dateien einmalige und nichtumkehrbare Codes zu erstellen. Dies kann für alles mögliche nützlich sein, z.B. ob eine Spieldatei verändert wurde. Bzw. MD5 ist ja auch immer noch der Standard für Passwortspeicherung.

Funktionsweise:
Siehe hier.


BlitzBasic: [AUSKLAPPEN]
Print MD5("Blitz3D!")
WaitKey()

Function MD5_File$(file$)
Local s$,f
f=OpenFile(file)
Repeat
s = s + Chr(ReadByte(f))
Until Eof(f)

CloseFile f

Return MD5$(s)
End Function

Function MD5$(my_string$)
Local output$

;Länge des Strings in Bit
Local bit_lenght = (Len(my_string)*8)

;Bankgröße in Bit, es gilt: (Stringlänge - 64) MOD 512 = 0
Local bank_size = Ceil((bit_lenght+65) / 512.0) * 512

;Speicherbank erstellen
Local md5_bank = CreateBank(Ceil(bank_size / 8.0))

;Laufvariablen
Local l,j,i

;Anzahl der 512-Bit Blocks
Local blocks = bank_size/512

;String in Bank speichern
For l=1 To Len(my_string)
PokeByte(md5_bank,l-1,Asc(Mid(my_string,l,1)))
Next

; Konstanten
Local h0% = $67452301
Local h1% = $EFCDAB89
Local h2% = $98BADCFE
Local h3% = $10325476

Local A% = h0
Local B% = h1
Local C% = h2
Local D% = h3

;-----------------------------------
; Konstanten zuweisen
;-----------------------------------
Local R[63],k[63]

R[0] = 7:R[1] = 12:R[2] = 17:R[3] = 22:R[4] = 7:R[5] = 12:R[6] = 17:R[7] = 22
R[8] = 7:R[9] = 12:R[10] = 17:R[11] = 22:R[12] = 7:R[13] = 12:R[14] = 17:R[15] = 22
R[16] = 5:R[17] = 9:R[18] = 14:R[19] = 20:R[20] = 5:R[21] = 9:R[22] = 14:R[23] = 20
R[24] = 5:R[25] = 9:R[26] = 14:R[27] = 20:R[28] = 5:R[29] = 9:R[30] = 14:R[31] = 20
R[32]= 4:R[33]= 11:R[34]= 16:R[35]= 23:R[36]= 4:R[37]= 11:R[38]= 16:R[39]= 23
R[40]= 4:R[41]= 11:R[42]= 16:R[43]= 23:R[44]= 4:R[45]= 11:R[46]= 16:R[47]= 23
R[48] = 6:R[49] = 10:R[50] = 15:R[51] = 21:R[52] = 6:R[53] = 10:R[54] = 15:R[55] = 21
R[56] = 6:R[57] = 10:R[58] = 15:R[59] = 21:R[60] = 6:R[61] = 10:R[62] = 15:R[63] = 21

k[0] = $d76aa478:k[1] = $e8c7b756:k[2] = $242070db:k[3] = $c1bdceee:k[4] = $f57c0faf:k[5] = $4787c62a
k[6] = $a8304613:k[7] = $fd469501:k[8] = $698098d8:k[9] = $8b44f7af:k[10] = $ffff5bb1:k[11] = $895cd7be
k[12] = $6b901122:k[13] = $fd987193:k[14] = $a679438e:k[15] = $49b40821:k[16] = $f61e2562:k[17] = $c040b340
k[18] = $265e5a51:k[19] = $e9b6c7aa:k[20] = $d62f105d:k[21] = $2441453:k[22] = $d8a1e681:k[23] = $e7d3fbc8
k[24] = $21e1cde6:k[25] = $c33707d6:k[26] = $f4d50d87:k[27] = $455a14ed:k[28] = $a9e3e905:k[29] = $fcefa3f8
k[30] = $676f02d9:k[31] = $8d2a4c8a:k[32] = $fffa3942:k[33] = $8771f681:k[34] = $6d9d6122:k[35] = $fde5380c
k[36] = $a4beea44:k[37] = $4bdecfa9:k[38] = $f6bb4b60:k[39] = $bebfbc70:k[40] = $289b7ec6:k[41] = $eaa127fa
k[42] = $d4ef3085:k[43] = $4881d05:k[44] = $d9d4d039:k[45] = $e6db99e5:k[46] = $1fa27cf8:k[47] = $c4ac5665
k[48] = $f4292244:k[49] = $432aff97:k[50] = $ab9423a7:k[51] = $fc93a039:k[52] = $655b59c3:k[53] = $8f0ccc92
k[54] = $ffeff47d:k[55] = $85845dd1:k[56] = $6fa87e4f:k[57] = $fe2ce6e0:k[58] = $a3014314:k[59] = $4e0811a1
k[60] = $f7537e82:k[61] = $bd3af235:k[62] = $2ad7d2bb:k[63] = $eb86d391

;-----------------------------------


;ein gesetztes Bit an String anhängen
SetBit(md5_bank, Len(my_string)*8)


;-----------------------------------
;Länge des Strings anhängen:
;-----------------------------------

Local strlenght[64]
Local num,bit64[63]

num=Len(my_string)*8

;Zahl in Bits speichern
For i=63 To 0 Step -1
If num - Int(2^i) >= 0 Then bit64[63-i] = 1 : num = num - Int(2^i)
Next

;Zahl in 64-Bit Little Endian konvertieren
l=0
For i=63 To 0 Step -8
For j=0 To 7
If bit64[i-7+j]=1 Then strlenght[l] = 1
l =l + 1
Next
Next

;Zahl anhängen
For l=0 To 63
If strlenght[l] Then
SetBit(md5_bank,bank_size-64+l)
EndIf
Next

;-----------------------------------
; MD5
;-----------------------------------

;alle Blocks durchgehen
For i=1 To blocks

;Blocks in 16x 32-Bit Teile unterteilen
Local parts[15]
For j=0 To 15
parts[j] = PeekInt(md5_bank,(i-1)*64+j*4)
Next




; Anfangsbelegung
A% = h0
B% = h1
C% = h2
D% = h3

Local f,g
For l=0 To 63
If l >= 0 And l <=15 Then
;Runde 1
f = (B And C) Or ((~B) And D)
g = l
ElseIf l >= 16 And l <=31 Then
;Runde 2
f = (D And B) Or ((~D) And C)
g = (l*5 + 1) Mod 16
ElseIf l >= 32 And l <=47 Then
;Runde 3
f = B Xor C Xor D
g = (l*3 + 5) Mod 16
ElseIf l >= 48 And l <=63 Then
;Runde 4
f = C Xor (B Or (~D))
g = (l*7) Mod 16
EndIf

;Verschiebung/Linksrotation
Local temp = D
D = C
C = B
B=(((A + f + k[l] + parts[g]) Shl R[l]) Or ((A + f + k[l] + parts[g]) Shr (32 - R[l]))) + B
A = temp
Next

; Werte aller Blocks werden addiert
h0 = h0 + A
h1 = h1 + B
h2 = h2 + C
h3 = h3 + D
Next



;-----------------------------------
;16-Bit Word in 128-Bit Hexcode
;-----------------------------------
Local tmp

For i=0 To 3
Select i
Case 0 : tmp = h0
Case 1 : tmp = h1
Case 2 : tmp = h2
Case 3 : tmp = h3
End Select

output = output + Right(Hex((tmp And $FF)),2)
output = output + Right(Hex((tmp And $FF00)/$100),2)
output = output + Right(Hex((tmp And $FF0000)/$10000),2)
output = output + Right(Hex((tmp And $FF000000)/$1000000),2)
Next

;Rückgabe
Return Lower(output)
End Function


; Hilfsfunktion
Function SetBit(bank,offset)
Local pos = Floor(offset / 8.0)
Local old_byte = PeekByte(bank,pos)
Local local_pos = offset Mod 8
Local i

Local new_byte
Local bit[7]

For i=7 To 0 Step -1
If old_byte - (2^i) >= 0 Then bit[7-i] = 1 : old_byte = old_byte - (2^i)
Next

bit[local_pos] = 1

For i = 7 To 0 Step -1
If bit[7-i] = 1 Then new_byte = new_byte + (2^i)
Next

PokeByte(bank,pos,new_byte)
End Function


Mfg
Chester
  • Zuletzt bearbeitet von Chester am So, Nov 15, 2009 17:03, insgesamt 7-mal bearbeitet

TimBo

BeitragSo, Okt 18, 2009 19:54
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi,

genau das, was man braucht um einen Highscore save zu machen !
Danke für deine Funktion , echt nützlich !

Grüße
TimBo
mfg Tim Borowski // CPU: Ryzen 2700x GPU: Nvidia RTX 2070 OC (Gigabyte) Ram: 16GB DDR4 @ 3000MHz OS: Windows 10
Stolzer Gewinner des BCC 25 & BCC 31
hat einen ersten Preis in der 1. Runde beim BWInf 2010/2011 & 2011/12 mit BlitzBasic erreicht.

hectic

Sieger des IS Talentwettbewerb 2006

BeitragSo, Okt 18, 2009 20:28
Antworten mit Zitat
Benutzer-Profile anzeigen
Aber MD5 ist doch eine one-way-Verschlüsselung. Wie soll man damit denn den Highscore speichern?

Bei einem Passwort bekommt das ganze ja auch einen Sinn. Der Auftraggeber kennt das Passwort und der Server hat den Hashwert gespeichert. Der Auftraggeber meldet sich nun mit seinem Passwort an, welches nach MD5 umgewandelt wird und mit dem Hashwert verglichen wird. Wenn es übereinstimmt, kann er sich einloggen.

Bei einem Highscore muß aber auch die Summe auf dem Server/Rechner lesbar bleiben. Natürlich könnte man parallel dazu auch einen Hashwert speichern, aber sehr sicher wäre das ja dann auch nicht, weil jeder den MD5-Algo ja auch mit PHP nachgenerieren kann.

Also ich frage nur aus eigener Interesse. Wie geht es?
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D

hamZta

Administrator

BeitragSo, Okt 18, 2009 20:30
Antworten mit Zitat
Benutzer-Profile anzeigen
Du speicherst dir den Hash der Highscore-Datei. Wenn jetzt jemand was darin verändert kannst du einen neuen Hash erzeugen und überprüfen ob sich dieser vom alten unterscheidet und somit Änderungen feststellen.
Blog.

TimBo

BeitragSo, Okt 18, 2009 21:27
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi

ich meinte mit saven eigentlich sicher machen ^^
Ich lasse von Blitz die md5 generieren, speicher diese dann i-wo hin und kann dann mit dieser md5 schauen, ob zwischen den Highscorezugriffen die Datei verändert wurde. Wink

Grüße
TimBo
mfg Tim Borowski // CPU: Ryzen 2700x GPU: Nvidia RTX 2070 OC (Gigabyte) Ram: 16GB DDR4 @ 3000MHz OS: Windows 10
Stolzer Gewinner des BCC 25 & BCC 31
hat einen ersten Preis in der 1. Runde beim BWInf 2010/2011 & 2011/12 mit BlitzBasic erreicht.

Der Eisvogel

BeitragMo, Okt 19, 2009 12:28
Antworten mit Zitat
Benutzer-Profile anzeigen
Bei mir gibt es in Zeile 78 ein "Blitz array out of bounds".
Ungarische Notation kann nützlich sein.
BlitzMax ; Blitz3D
Win 7 Pro 64 Bit ; Intel Core i7-860 ; 8 GB Ram ; ATI HD 5750 1 GB
Projekte: Window-Crasher
Ich liebe es mit der WinAPI zu spielen.

ToeB

BeitragMo, Okt 19, 2009 15:04
Antworten mit Zitat
Benutzer-Profile anzeigen
Bei mir auch !
Religiöse Kriege sind Streitigkeiten erwachsener Männer darum, wer den besten imaginären Freund hat.
Race-Project - Das Rennspiel der etwas anderen Art
SimpleUDP3.0 - Neuste Version der Netzwerk-Bibliothek
Vielen Dank an dieser Stelle nochmal an Pummelie, welcher mir einen Teil seines VServers für das Betreiben meines Masterservers zur verfügung stellt!

Chester

BeitragMo, Okt 19, 2009 16:47
Antworten mit Zitat
Benutzer-Profile anzeigen
Habs gefixt. Ohne Debuger hätte es aber vorher auch schon funktioniert. (habs aber vergessen zu testen)

Mfg
Chester

Edit: Habs nochmal geändert. Werte werden jetzt nicht mehr berechnet, sondern konkret angegeben. Hatte ich mir aus Faulheitsgründen vorher gespart Embarassed

Der Eisvogel

BeitragDi, Okt 20, 2009 14:25
Antworten mit Zitat
Benutzer-Profile anzeigen
Was genau bringt der Teil "Tabelle erstellen/berechnen"?
Da wird doch garnix zugewiesen. Oder Irre ich mich?
Ungarische Notation kann nützlich sein.
BlitzMax ; Blitz3D
Win 7 Pro 64 Bit ; Intel Core i7-860 ; 8 GB Ram ; ATI HD 5750 1 GB
Projekte: Window-Crasher
Ich liebe es mit der WinAPI zu spielen.

Chester

BeitragDi, Okt 20, 2009 14:36
Antworten mit Zitat
Benutzer-Profile anzeigen
Streich einfach das Berechnen.
Zugewiesen werden hier die Tabellenwerte, die durch das RFC 1321 fest vorgegeben sind.
In der alten Version ließ ich diese automatisch berechnen, da ich zu faul war, den jetztigen Zuweisungsblock auszuschreiben. Aber natürlich nimmt sowas dann mehr Rechenzeit und auch mehr Zeilen in Anspruch, weshalb ich dann doch alles ausgeschrieben habe.
  • Zuletzt bearbeitet von Chester am Di, Okt 20, 2009 18:38, insgesamt einmal bearbeitet

Der Eisvogel

BeitragDi, Okt 20, 2009 15:09
Antworten mit Zitat
Benutzer-Profile anzeigen
Quak...

EDIT: Mist ich war in der falschen Sprache. Sorry hat sich alles erledigt.
Ungarische Notation kann nützlich sein.
BlitzMax ; Blitz3D
Win 7 Pro 64 Bit ; Intel Core i7-860 ; 8 GB Ram ; ATI HD 5750 1 GB
Projekte: Window-Crasher
Ich liebe es mit der WinAPI zu spielen.

Firstdeathmaker

BeitragDi, Okt 20, 2009 19:48
Antworten mit Zitat
Benutzer-Profile anzeigen
MD5 benutze ich schon seit langem für Highscores. Besser wäre natürlich nen SHA-2 oder so, gibt da auch ne Implementierung für BMax aber die benutzt open SSH oder so.
www.illusion-games.de
Space War 3 | Space Race | Galaxy on Fire | Razoon
Gewinner des BCC #57 User posted image
 

FWeinb

ehemals "ich"

BeitragDi, Okt 20, 2009 20:06
Antworten mit Zitat
Benutzer-Profile anzeigen
Es gibt für BlitzMax eine Implementierung (Welche keine Libs braucht) von SHA-1 und SHA-256.

Hier der Link: Klick

MfG

ich
"Wenn die Menschen nur über das sprächen, was sie begreifen, dann würde es sehr still auf der Welt sein." Albert Einstein (1879-1955)
"If you live each day as if it was your last, someday you'll most certainly be right." Steve Jobs

Firstdeathmaker

BeitragDi, Okt 20, 2009 21:24
Antworten mit Zitat
Benutzer-Profile anzeigen
Oha, cool, danke. Hatte bisher immer die crypto.mod von bah benutzt.
www.illusion-games.de
Space War 3 | Space Race | Galaxy on Fire | Razoon
Gewinner des BCC #57 User posted image

ozzi789

BeitragDo, Okt 22, 2009 10:04
Antworten mit Zitat
Benutzer-Profile anzeigen
Tolle Funktion, wollte mir schon selber sowas coden, kann das gut gebrauchen Very Happy
thnx
0x2B || ! 0x2B
C# | C++13 | Java 7 | PHP 5

Neue Antwort erstellen


Übersicht BlitzBasic Codearchiv

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group