Hallo Allerseits.
Ich möchte Euch nochmals meine letzte Arbeit vorstellen
und bitte um Eure Kritik.
Zunächst:
Es hat mich gestört, das der AESIni gespeichert werden soll.
Nun ermittel ich auch den per Zufall aus der Quersumme des Passwort.
Weiter hat es mich gestört, im Kontrollstring das Salt mit zu verschlüsseln.
Das mache ich nicht, weil im Kontrollstring nichts bekanntes stecken soll.
Den Salt muß ich speichern. Das hat mich gestört.
Darum wird nun auch der Salt mit der Quersumme verbunden.
Und dann noch eine weiter Frage:
Ich lese immer wieder, ein Fingerprint sei einmalig
und es sei nicht möglich, den Fingerprint zurück zu entwickeln.
Nun lese ich aber, das einige den Fingerprint sogar über 100tausend mal mit sich selber erzeugen.
Ist der Fingerprint also doch nicht so sicher?
So: Hier nun mein Prg.
Danke & Gruß: Bernd
Code: Alles auswählen
UseSHA3Fingerprint()
Procedure.s HexToStr(hex$, w = 2)
; w gibt die Länge/Weite des Hex an. Bsp: $FF , $FFFF , $FFFFFF
Protected str$, i
For i = 0 To Len(hex$) / w - 1
str$ + Chr(Val("$" + Mid(hex$, 1+i*w, w)))
Next
ProcedureReturn str$
EndProcedure
Procedure.s StrToHex(str$, w = 2)
; w gibt die Länge/Weite des Hex an. Bsp: $FF , $FFFF , $FFFFFF
Protected hex$, i
For i = 1 To Len(str$)
hex$ + RSet(Hex(Asc(Mid(str$, i, 1))), w, "0")
Next
ProcedureReturn hex$
EndProcedure
Procedure.s Create_RndStr(w, bis, von)
For i = 1 To w
s$ + Chr(Random(bis, von))
Next
ProcedureReturn s$
EndProcedure
;-
Procedure.s EnAES(String$, Key$, ini$)
If key$ = "" : ProcedureReturn String$ : EndIf
Protected *CipheredString
While Len(String$) < 16
String$+Chr(10)
Wend
*CipheredString = AllocateMemory(StringByteLength(String$))
Key$ = HexToStr(Key$);LSet(Key$, 32, Chr(32))
ini$ = HexToStr(ini$);LSet(ini$, 16, Chr(32))
If AESEncoder(@String$, *CipheredString, StringByteLength(String$), @Key$, 256, @ini$);?Init)
For n = 0 To Len(String$)-1
Output$ + Str(PeekC(*CipheredString+n*SizeOf(Character))) + " "
Next
EndIf
FreeMemory(*CipheredString)
ProcedureReturn Output$
EndProcedure
Procedure.s DeAES(String$, Key$, ini$)
If key$ = "" : ProcedureReturn String$ : EndIf
Protected *Buffer = AllocateMemory(CountString(String$," ")*SizeOf(Character))
Protected *DecipheredString = AllocateMemory(CountString(String$," ")*SizeOf(Character))
For n = 0 To CountString(String$," ")-1
PokeC(*Buffer+n*SizeOf(Character), Val(StringField(String$, n+1, " ")))
Next
Key$ = HexToStr(Key$);LSet(Key$, 32, Chr(32))
ini$ = HexToStr(ini$);LSet(ini$, 16, Chr(32))
If AESDecoder(*Buffer, *DecipheredString, MemorySize(*Buffer), @Key$, 256, @ini$);?Init)
Output$ = RTrim(PeekS(*DecipheredString, CountString(String$," ")), Chr(10))
EndIf
FreeMemory(*DecipheredString)
FreeMemory(*Buffer)
ProcedureReturn Output$
EndProcedure
;-
Procedure.s Passwort_Eingeben()
pw$ = "Passwort"
ProcedureReturn pw$
EndProcedure
Procedure Schluessel_pruefen(passwort$, kontrollstr$, salz$, lauf)
w = 5
; Quersumme ermitteln. Nachkommastellen werden frech ignoriert.
qs = 0 : For i = 1 To Len(passwort$) : qs + Asc(Mid(passwort$, i, 1)) : Next
qs = qs / Len(passwort$)
AESKey$ = Left(salz$, qs) + passwort$ + Mid(salz$, qs)
AESIni$ = ""
For i = 1 To lauf * (qs * w)
AESKey$ = StringFingerprint(AESKey$, #PB_Cipher_SHA3, 256)
If i = qs * w : AESIni$ = AESKey$ + salz$ : EndIf
If AESIni$ <> ""
AESIni$ = StringFingerprint(AESIni$, #PB_Cipher_SHA3, 256)
EndIf
Next
klartext$ = DeAES(kontrollstr$, AESKey$, AESIni$)
a$ = StringField(klartext$, 1, "|")
b$ = StringField(klartext$, 2, "|")
If StringFingerprint(a$, #PB_Cipher_SHA3, 512) = b$
ProcedureReturn 1
Else
ProcedureReturn 0
EndIf
EndProcedure
Procedure.s Erzeuge_Schluessel(passwort$, salz$)
Protected schluessel$
w = 5 ; Wem das zu kurz ist, kann das ja vergrössern.
; Aber die Procedure Schluessel_pruefen nicht vergessen !
lauf = Random(200, 100)
; Quersumme ermitteln. Nachkommastellen werden frech ignoriert.
qs = 0 : For i = 1 To Len(passwort$) : qs + Asc(Mid(passwort$, i, 1)) : Next
qs = qs / Len(passwort$)
AESKey$ = Left(salz$, qs) + passwort$ + Mid(salz$, qs)
AESIni$ = ""
For i = 1 To lauf * (qs * w)
AESKey$ = StringFingerprint(AESKey$, #PB_Cipher_SHA3, 256)
If i = qs * w : AESIni$ = AESKey$ + salz$ : EndIf
If AESIni$ <> ""
AESIni$ = StringFingerprint(AESIni$, #PB_Cipher_SHA3, 256)
EndIf
Next
a$ = StrToHex(Create_RndStr(128, 255, 1), 2)
kontrollstring$ = a$ + "|" + StringFingerprint(a$, #PB_Cipher_SHA3, 512)
kontrollstring$ = EnAES(kontrollstring$, AESKey$, AESIni$)
schluessel$ = Str(lauf) + ":" + AESKey$ + ":" + AESIni$ + ":" + kontrollstring$
ProcedureReturn schluessel$
EndProcedure
; -------------------------------------------------------------------------------------------------
salz$ = Create_RndStr(256, 255, 1) ; 1, damit NullStrings ausgeschossen sind
passwort$ = Passwort_Eingeben()
schluessel$ = Erzeuge_Schluessel(passwort$, salz$)
Debug schluessel$
lauf = Val(StringField(schluessel$, 1, ":"))
AESKey$ = StringField(schluessel$, 2, ":")
AESIni$ = StringField(schluessel$, 3, ":")
kontrollstr$ = StringField(schluessel$, 4, ":")
Debug " w = " + lauf
Debug "Key = " + AESKey$
Debug "Ini = " + AESIni$
Debug "Kon = " + kontrollstr$
; --- Nun "lauf, Salz" & "Kontrollstr" speichern
salz$ = StrToHex(salz$)
; speichern()
; ---
; --- Bei Start des Prgs.
; laden()
salz$ = HexToStr(salz$)
passwort$ = InputRequester("", "", passwort$)
If Schluessel_pruefen(passwort$, kontrollstr$, salz$, lauf)
Debug "Ok"
Else
Debug "Falsch"
EndIf