Sha1 - Crypt-Algorithmus

Übersicht BlitzBasic Codearchiv

Neue Antwort erstellen

ZEVS

Betreff: Sha1 - Crypt-Algorithmus

BeitragDo, Jul 28, 2011 16:58
Antworten mit Zitat
Benutzer-Profile anzeigen
Dies ist eine kleine Funktion zum Ermitteln des Sha1-Hashs.
Ein Hash ist eine Zeichenkette fester Länge, die aus einer bestehenden Nachricht gebildet wird, ohne dass auf die Nachricht rückgeschlossen werden kann. Deswegen gibt es prinzipiell zwei Anwendungsgebiete für Hashes:

    Passwort-Verschlüsselung: Beim Einstellen eines Passwortes wird normalerweise nur ein Hash desselben gespeichert. Wird dann die Passwortdatenbank gestohlen, ist ein Rückschluss auf die Passwörter unmöglich. Bei jedem Loginversuch wird der Hash aus dem übergeben Passwort gebildet und dieser mit dem gespeicherten Hash verglichen. Sind die Hashes gleich, ist der Login erfolgreich.

    Datei-Überprüfung: Mit einem Hash können auch längere Texte (Dateien) identifiziert werden, ohne dass alles übertragen werden muss. Damit können Übertragungsfehler, Änderungen oder Fälschungen gefunden werden.


Neugierig auf den Code? Hier ist er:
BlitzBasic: [AUSKLAPPEN]
;<TEST>
Local message$ = Input("text to hash: ")

Print sha1(message)

Local timer = CreateTimer(1) ;warte 3 sek. (B+ hat in der Konsole kein WaitKey)

For i=1 To 3
WaitTimer timer
Next
;</TEST>



Function strToBank(s$) ;wandelt einen String in eine entsprechende Bank um
Local result = CreateBank(Len(s))
For i=1 To Len(s)
PokeByte result, i-1, Asc(Mid(s, i, 1))
Next
Return result
End Function

Function leftrotate(x, n)
Return (x Shl n) Or (x Shr (32-n))
End Function

Function pokeBigEndian(bank, offset, littleEndian) ;Schreibt eine Zahl in umgekehrter Bytereihenfolge in eine Bank
Local bytes[3]
bytes[0] = (littleEndian And $000000FF)
bytes[1] = (littleEndian And $0000FF00) Shr 8
bytes[2] = (littleEndian And $00FF0000) Shr 16
bytes[3] = (littleEndian And $FF000000) Shr 14
For i=0 To 3
PokeByte bank, offset+i, bytes[3-i]
Next
End Function

Function bigEndian(littleEndian) ;kehrt die Bytereihenfolge um
Local bytes[3]
bytes[0] = (littleEndian And $000000FF)
bytes[1] = (littleEndian And $0000FF00) Shr 8
bytes[2] = (littleEndian And $00FF0000) Shr 16
bytes[3] = (littleEndian And $FF000000) Shr 24
Return (bytes[0] Shl 24)+(bytes[1] Shl 16)+(bytes[2] Shl 8)+bytes[3]
End Function

Function bitwiseNot(num) ;Bitweises not
Return num Xor $FFFFFFFF
End Function

Function sha1$(message$) ;die Hash-Funktion
Local h0 = $67452301
Local h1 = $EFCDAB89
Local h2 = $98BADCFE
Local h3 = $10325476
Local h4 = $C3D2E1F0 ;Intalisierung der Hashes

message = message+Chr(128) ;Fügt ein 1-Bit und 7 0-Bits an

Local msg = strToBank(message) ;lädt die Nachricht in eine Bank

Local size = Len(message) ;Die Bankgröße soll erhöht werden, um die fehlenden 0-Bits anzufügen
While size Mod 64 <> 56
size = size+1
Wend


ResizeBank msg, size+8 ;+64 Bits für einen 64-Bit Big Endian

PokeBigEndian msg, size+4, (Len(message)-1)*8 ;der als 32-Bit geschrieben wird (Bitzahl der Nachricht)

Local w[80] ;speichert 80 words

For i=0 To BankSize(msg)/64-1 ;für alle 512-Bit-Blöcke...
For j=0 To 15 ;die 16 words (Ints) einlesen
w[j] = bigEndian(PeekInt(msg, i*4+j*4))
Next
For j=16 To 79 ;die verbleibenden errechnen
w[j] = leftrotate(w[j-3] Xor w[j-8] Xor w[j-14] Xor w[j-16], 1)
Next

Local a=h0 ;die Arbeitsvariablen intalisieren
Local b=h1
Local c=h2
Local d=h3
Local e=h4
Local f, k
For j=0 To 79 ;"Mainloop"
If j < 20 Then ;ermitteln von f & k
f = (b And c) Or (bitwiseNot(b) And d)
k = $5A827999
ElseIf j < 40 Then
f = b Xor c Xor d
k = $6ED9EBA1
ElseIf j < 60 Then
f = (b And c) Or (b And d) Or (c And d)
k = $8F1BBCDC
Else
f = b Xor c Xor d
k = $CA62C1D6
EndIf
Local temp = (leftrotate(a, 5) + f + e + k + w[j])
e = d
d = c
c = leftrotate(b, 30)
b = a
a = temp
Next
h0 = h0 + a
h1 = h1 + b
h2 = h2 + c
h3 = h3 + d
h4 = h4 + e
Next
FreeBank msg
Return Hex(h0)+Hex(h1)+Hex(h2)+Hex(h3)+Hex(h4) ;als Hex zurückgeben
End Function
  • Zuletzt bearbeitet von ZEVS am Sa, Nov 26, 2011 13:41, insgesamt 4-mal bearbeitet

Xeres

Moderator

BeitragDo, Jul 28, 2011 17:33
Antworten mit Zitat
Benutzer-Profile anzeigen
Das ist kein SHA-1:
BlitzBasic: [AUSKLAPPEN]
If Lower(sha1(""))="da39a3ee5e6b4b0d3255bfef95601890afd80709" Then 
Print("Jo")
Else
Print("Fail")
EndIf

Print(Lower(sha1("")))
Print("da39a3ee5e6b4b0d3255bfef95601890afd80709")

WaitKey()


...und bei jedem Programmstart ergibt sich für den leeren String immer ein anderer Hash Question
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

ZEVS

Betreff: B+ (?)

BeitragDo, Jul 28, 2011 17:59
Antworten mit Zitat
Benutzer-Profile anzeigen
bei mir klappt das wunderbar, allerdings habe ich B+.
Eventuell ist das Itegrer-Format von B+ anders, aber das erscheint mir unplausibel.
Wie du auf unterschiedliche Ergebnisse kommst, ist mir schleierhaft.

Probiere doch bitte mal den folgenden Code:
BlitzBasic: [AUSKLAPPEN]
Print Bin(1)
Print Bin(-1)
Print Bin(2^25)


Local timer = CreateTimer(1)
For i=1 To 3
WaitTimer timer
Next


Meine Ausgabe ist mit B+
Code: [AUSKLAPPEN]
00000000000000000000000000000001
11111111111111111111111111111111
00000010000000000000000000000000


Aber an sich müsste doch auch das Speicherformat bei jedem Programmstart gleich bleiben...
Question Question Question Question Question Question Question Question Question Question Question Question Question Question Question Question Question Question Question Question Question

Xeres

Moderator

BeitragDo, Jul 28, 2011 18:07
Antworten mit Zitat
Benutzer-Profile anzeigen
Der Testcode ergibt, was er soll.
Ich könnte mir nur vorstellen, das der Fehler irgendwo in der Bank liegt, z.B. dass zufällige Speicherbereiche verarbeitet werden.
(Aber auch da sollten sich B+ und B3D eigentlich gleich verhalten)
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

FireballFlame

BeitragDo, Jul 28, 2011 18:23
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich hab es mal testweise nach BMax portiert, und es funktioniert prima.

Worauf man dabei allerdings aufpassen muss, ist dass man die logischen Operatoren in bitweise konvertiert, also And in & und Or in |.
PC: Intel Core i7 @ 4x2.93GHz | 6 GB RAM | Nvidia GeForce GT 440 | Desktop 2x1280x1024px | Windows 7 Professional 64bit
Laptop: Intel Core i7 @ 4x2.00GHz | 8 GB RAM | Nvidia GeForce GT 540M | Desktop 1366x768px | Windows 7 Home Premium 64bit

ZEVS

Betreff: bank?

BeitragDo, Jul 28, 2011 18:25
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich will hoffen, dass B3D die Banks bei Erweiterungen mit Nullen auffüllt.

B+ tut das jedenfalls. Der folgende Code auch:
BlitzBasic: [AUSKLAPPEN]

...
Function sha1$(message$) ;die Hash-Funktion
Local h0 = $67452301
Local h1 = $EFCDAB89
Local h2 = $98BADCFE
Local h3 = $10325476
Local h4 = $C3D2E1F0 ;Intalisierung der Hashes

message = message+Chr(128) ;Fügt ein 1-Bit und 7 0-Bits an

Local msg = strToBank(message) ;lädt die Nachricht in eine Bank

Local size = Len(message) ;Die Bankgröße soll erhöht werden, um die fehlenden 0-Bits anzufügen
While size Mod 64 <> 56
size = size+1
Wend


ResizeBank msg, size+8 ;+64 Bits für einen 64-Bit Big Endian

For i=Len(message) To size+3
PokeByte msg, i, 0 ; Bank mit Nullen auffüllen (für B3D)
Next
...


Code editiert! (Fehler bei größeren Nachrichten)
  • Zuletzt bearbeitet von ZEVS am Do, Jul 28, 2011 21:28, insgesamt einmal bearbeitet

Xeres

Moderator

BeitragDo, Jul 28, 2011 18:46
Antworten mit Zitat
Benutzer-Profile anzeigen
Und siehe da, es funktioniert Exclamation
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)
 

onnie

Betreff: hashlänge über 56 Zeichen

BeitragSo, Nov 04, 2012 18:22
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich hab noch einen Fehler erkannt aber nicht gefunden:
Ab einer Länge von 56 Zeichen funktioniert das Programm nicht mehr richtig. Alles darunter ist jedoch in Ordnung. Hier ein paar Seiten, die sich alle einig sind:

http://www.functions-online.com/sha1.html
http://www.sha1.cz/
http://www.sha1generator.de/
http://www.sha1-online.com/
http://sha1-hash-online.waraxe.us/
http://www.online-convert.com/...0d507567dc
http://www.tools4noobs.com/onl...1/sha1.php

und der Hashgenerator hier in Blitzbasic bringt andere Ergebnisse.
Ich finde, diesem Fehler sollte man nachgehen.

ZEVS

BeitragSo, Nov 04, 2012 18:25
Antworten mit Zitat
Benutzer-Profile anzeigen
Richtig, es muss wohl BlitzBasic: [AUSKLAPPEN]
      w[j] = bigEndian(PeekInt(msg, i*16+j*4))

heißen. Werde der Sache auf den Grund gehen...
edit: Mit i*64 etc. klappt es.
BlitzBasic: [AUSKLAPPEN]
Local message$ = Input("text to hash: ")

Print sha1(message)

Local timer = CreateTimer(1) ;warte 3 sek. (B+ hat in der Konsole kein WaitKey)

For i=1 To 3
WaitTimer timer
Next
;</TEST>



Function strToBank(s$) ;wandelt einen String in eine entsprechende Bank um
Local result = CreateBank(Len(s))
For i=1 To Len(s)
PokeByte result, i-1, Asc(Mid(s, i, 1))
Next
Return result
End Function

Function leftrotate(x, n)
Return (x Shl n) Or (x Shr (32-n))
End Function

Function pokeBigEndian(bank, offset, littleEndian) ;Schreibt eine Zahl in umgekehrter Bytereihenfolge in eine Bank
Local bytes[3]
bytes[0] = (littleEndian And $000000FF)
bytes[1] = (littleEndian And $0000FF00) Shr 8
bytes[2] = (littleEndian And $00FF0000) Shr 16
bytes[3] = (littleEndian And $FF000000) Shr 14
For i=0 To 3
PokeByte bank, offset+i, bytes[3-i]
Next
End Function

Function bigEndian(littleEndian) ;kehrt die Bytereihenfolge um
Local bytes[3]
bytes[0] = (littleEndian And $000000FF)
bytes[1] = (littleEndian And $0000FF00) Shr 8
bytes[2] = (littleEndian And $00FF0000) Shr 16
bytes[3] = (littleEndian And $FF000000) Shr 24
Return (bytes[0] Shl 24)+(bytes[1] Shl 16)+(bytes[2] Shl 8)+bytes[3]
End Function

Function bitwiseNot(num) ;Bitweises Not
Return num Xor $FFFFFFFF
End Function
Function sha1$(message$) ;die Hash-Funktion
Local h0 = $67452301
Local h1 = $EFCDAB89
Local h2 = $98BADCFE
Local h3 = $10325476
Local h4 = $C3D2E1F0 ;Intalisierung der Hashes

message = message+Chr(128) ;Fügt ein 1-Bit und 7 0-Bits an

Local msg = strToBank(message) ;lädt die Nachricht in eine Bank

Local size = Len(message) ;Die Bankgröße soll erhöht werden, um die fehlenden 0-Bits anzufügen
While size Mod 64 <> 56
size = size+1
Wend


ResizeBank msg, size+8 ;+64 Bits für einen 64-Bit Big Endian

For i=Len(message) To size+3
PokeByte msg, i, 0 ; Bank mit Nullen auffüllen (für B3D)
Next

PokeBigEndian msg, size+4, (Len(message)-1)*8 ;der als 32-Bit geschrieben wird (Bitzahl der Nachricht)

Local w[80] ;speichert 80 words

For i=0 To BankSize(msg)/64-1 ;für alle 512-Bit-Blöcke...
For j=0 To 15 ;die 16 words (Ints) einlesen
w[j] = bigEndian(PeekInt(msg, i*64+j*4))
Next
For j=16 To 79 ;die verbleibenden errechnen
w[j] = leftrotate(w[j-3] Xor w[j-8] Xor w[j-14] Xor w[j-16], 1)
Next

Local a=h0 ;die Arbeitsvariablen intalisieren
Local b=h1
Local c=h2
Local d=h3
Local e=h4
Local f, k
For j=0 To 79 ;"Mainloop"
If j < 20 Then ;ermitteln von f & k
f = (b And c) Or (bitwiseNot(b) And d)
k = $5A827999
ElseIf j < 40 Then
f = b Xor c Xor d
k = $6ED9EBA1
ElseIf j < 60 Then
f = (b And c) Or (b And d) Or (c And d)
k = $8F1BBCDC
Else
f = b Xor c Xor d
k = $CA62C1D6
EndIf
Local temp = (leftrotate(a, 5) + f + e + k + w[j])
e = d
d = c
c = leftrotate(b, 30)
b = a
a = temp
Next
h0 = h0 + a
h1 = h1 + b
h2 = h2 + c
h3 = h3 + d
h4 = h4 + e
Next
FreeBank msg
Return Hex(h0)+Hex(h1)+Hex(h2)+Hex(h3)+Hex(h4) ;als Hex zurückgeben
End Function


ZEVS
 

onnie

BeitragSo, Nov 04, 2012 18:40
Antworten mit Zitat
Benutzer-Profile anzeigen
ZEVS hat Folgendes geschrieben:
edit: Mit i*64 etc. klappt es.
-> von mir bestätigt.

Danke, dass du dich drum gekümmert hast. Jetzt kann ich ihn benutzen.

onnie
 

PhillipK

BeitragSo, Nov 04, 2012 23:01
Antworten mit Zitat
Benutzer-Profile anzeigen
@FireballFlame:
magst vielleicht so freundlich sein, dein BMax port zu teilen? Würde mich auch mal intressieren Smile

Ich weiß, ich weiß, kann ich sicher auch selbst, aber warum das rad neu erfinden... Razz

FireballFlame

BeitragMo, Nov 05, 2012 9:45
Antworten mit Zitat
Benutzer-Profile anzeigen
Tut mir leid, aber ich bezweifle, dass ich den damals überhaupt gespeichert hab Wink
Zumal das Herraussuchen wahrscheinlich länger dauern würde, als es einfach nochmal zu machen. Musst vermutlich nur das beachten, was ich damals schrieb.
PC: Intel Core i7 @ 4x2.93GHz | 6 GB RAM | Nvidia GeForce GT 440 | Desktop 2x1280x1024px | Windows 7 Professional 64bit
Laptop: Intel Core i7 @ 4x2.00GHz | 8 GB RAM | Nvidia GeForce GT 540M | Desktop 1366x768px | Windows 7 Home Premium 64bit
 

PhillipK

BeitragMo, Nov 05, 2012 10:51
Antworten mit Zitat
Benutzer-Profile anzeigen
Oho oho..
Das ist nun.. chrm..

Ja, ich verstehe dein problem, nein, kein akt *grins* Irgendwie hat mein kopf das datum der posts einfach mal vollkommen ignoriert =)
Najut, werd ich das mal machen *gnhihi* tut mir leid, war wohl ein wenig verpeilt gestern oô

Neue Antwort erstellen


Übersicht BlitzBasic Codearchiv

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group