Seite 1 von 2

Ist das Sicher ? - Einfache CodierungsProcedure

Verfasst: 03.09.2009 00:50
von STARGÅTE
Tachchen,

ich habe mal zwei kleine proceduren geschrieben zum ver- und entschlüsseln von Strings in Hexadecimalstrings.
Damit möchte ich passwörter verschlüsseln und diese dann Abspeichern.

Der "Key" ist dabei der Schlüssel welcher den richtigen RandomSeed() setzt.

Code: Alles auswählen

Structure CharacterArray
  c.c[0]
EndStructure

Procedure.s Encrypt(String$, Key.q)
  Protected Character = Pow(256,SizeOf(Character))
  Protected StringLen = Len(String$)-1
  Protected EncryptString$ = ""
  Protected Dim Shift(StringLen)
  RandomSeed(Key)
  For n = 0 To StringLen
    Shift(n) = Random(Character-1)
  Next
  *StringCharacter.CharacterArray = @String$
  For n = 0 To StringLen
    *StringCharacter\c[n] = ( *StringCharacter\c[n] + Shift(n) ) % Character
    EncryptString$ + RSet(Hex(*StringCharacter\c[n]), SizeOf(Character)*2, "0")
  Next
  ProcedureReturn EncryptString$
EndProcedure

Procedure.s Decrypt(String$, Key.q)
  Protected Character = Pow(256,SizeOf(Character))
  Protected StringLen = Len(String$)/SizeOf(Character)/2-1
  Protected DecryptString$ = Space(StringLen+1)
  *DecryptStringCharacter.CharacterArray = @DecryptString$
  Protected Dim Shift(StringLen)
  RandomSeed(Key)
  For n = 0 To StringLen
    Shift(n) = Random(Character-1)
  Next
  For n = 0 To StringLen
    *DecryptStringCharacter\c[n] = Val("$"+Mid(String$,n*SizeOf(Character)*2+1,SizeOf(Character)*2))
    *DecryptStringCharacter\c[n] = ( *DecryptStringCharacter\c[n] - Shift(n) ) % Character
  Next
  ProcedureReturn DecryptString$
EndProcedure


Text$ = "Ich bin ein Satz"
Debug Text$
Encode$ = Encrypt(Text$, 2506198800)
Debug Encode$
Decode$ = Decrypt(Encode$, 2506198800)
Debug Decode$
Decode$ = Decrypt(Encode$, 2506198801)
Debug "Müll ^^ : "+Decode$

Nun wollte ich Fragen wie sicher der ist, da er ja zimlich einfach aufgebaut ist.

Jedes Zeichen wird verschoben, die Weite wird von Random bestimmt welches nur dann "richtig" ist wenn man vorher den Richtigen Key angibt.
Die neu entstandenen Zeichen werden dann in Hex umgewandeln.
Damit wird der String immer doppel so groß sein wie vorher, dafür kann man ihn auch in URLs usw. nutzen.

Da es für den 18.446.744.073.709.551.616 Möglichkeiten gibt (Double) denke ich mir jetzt das es doch sicher sein müsste oder ?

PS: Es sollte auch Unicode unterstützen (hoffe ich) wenn ich alles beachtet habe.

Wäre nett wenn ihr das mal Testet und mir auch sagt ob es "Sicher" ist.

Verfasst: 03.09.2009 10:16
von Kukulkan
Hi Stargate,

Ich finde deine Idee gut, aber sehr Sicher ist es vermutlich nicht. Weiterhin gehst Du einige Risiken ein:

- Was, wenn der Zufallszahlgenerator von PB mal eine andere (zB bessere) Formel bekommt?
- Der Schlüssel ist rein numerisch zu kodieren, was die Länge eines halbwegs sicheren Schlüssels vervielfacht (pro stelle nur 10 Möglichkeiten. Bei Alphanumerisch sind das 256 je Stelle).

Warum nimmst Du nicht einfach die vom neuen PB angebotenen Routinen oder machst eine gute alte XOR Verschlüsselung? Bei XOR mit einem guten Key ist das auch schwer zu knacken (Stichwort OneTimePad). Oder sowas wie Vigenere?

Weiterhin wurde im deutschen und englischen Board schon über die ein oder andere Verschlüsselung diskutiert. Da gab es auch gute Sourcecodes. Mein Tipp: Boardsuche...

Volker

Verfasst: 03.09.2009 10:24
von Kaeru Gaman
weiterhin beachte:
Random() funktioniert nur für werte von 0 bis 2147483647 ($7FFFFFFF)
also nix mit Quad.

Verfasst: 03.09.2009 11:55
von STARGÅTE
Volker Schmid hat geschrieben:Der Schlüssel ist rein numerisch zu kodieren, was die Länge eines halbwegs sicheren Schlüssels vervielfacht (pro stelle nur 10 Möglichkeiten. Bei Alphanumerisch sind das 256 je Stelle).
Man muss ja nicht direkt eine Zahl angeben, sonden kann ja auch die Hochkomma-Funktion nutzen:
Encrypt("Ich bin ein Satz", 'Cool') :wink:

@Kaeru Gaman
Random verwendet auch keine Quad, sonden nur maximal eine Word.
RandomSeed bekommt die Quad, ich weis nur dort nicht ob RandomSeed wirklich Quads bekommen darf, aber nach diesem Test zu urteilen:

Code: Alles auswählen

For n = 0 To 20
 Quad.q = 1<<(n*4)
 Debug Quad
 RandomSeed(Quad)
 Debug "Zufall:"+Str(Random(255))
Next
Will RandeomSeed wohl auch nur Longs ...

Dann könnte ich aber zwei verschiebungen machen lassen und die Quad in zwei LONgs zerlegen die jeweils ein RandeomSeed bearbeiten.

Dann könnte man auch als Key einen 8-Stelligen ZeichenText nehmen also zB:
Debug 'Ä?23Å_./'

Verfasst: 03.09.2009 13:12
von Kaeru Gaman
> Dann könnte ich aber zwei verschiebungen machen lassen und die Quad in zwei LONgs zerlegen die jeweils ein RandeomSeed bearbeiten.
unsinnig, dann kannst du den ersten auch weglassen, weil er vom zweiten außer kraft gesetzt wird.

Verfasst: 03.09.2009 17:10
von sibru
Es geht auch einfacher: nicht das Passwort speichern und vergleichen,
sondern dessen MD5-FingerPrint. String --> Md5FingerPrint ist einfach
(siehe unten), zurück ist extrem schwierig und damit ist das Ganze auch
extrem sicher...

Code: Alles auswählen

#PB_Vers  = "4.20"

;- Passwort initieren
Pass$ = InputRequester("Passwort eintragen", "Passwort", "")
PassKenn$ = MD5Fingerprint(@Pass$, StringByteLength(Pass$))
;Passkenn$ enthält nun einen 16stelligen HexString (z.Bsp. "598d4c200461b81522a3328565c25f7c"),
;der mit dem eingegebenem Passwort korrespondiert. Details siehe MD5FingerPrint-Hilfe...


;- Passwort abfragen
Repeat
  Pass$ = InputRequester("Passwort-Abfrage", "Passwort", "")
Until PassKenn$ = MD5Fingerprint(@Pass$, StringByteLength(Pass$))
Gruss SiBru

Verfasst: 03.09.2009 17:22
von Kukulkan
Es geht auch einfacher: nicht das Passwort speichern und vergleichen, sondern dessen MD5-FingerPrint. String --> Md5FingerPrint ist einfach (siehe unten), zurück ist extrem schwierig und damit ist das Ganze auch extrem sicher...
Hach Gott, das hab ich ganz überlesen. :freak:

Ja klar: das beste ist es, nur den Hashcode zu speichern und diesen dann mit der Nutzereingabe vergleichen wie in sibru's Beispiel.

Volker

Verfasst: 03.09.2009 18:46
von STARGÅTE
Wenn ich das für mein Zeug bräuchte würde das gehen, aber ich muss ja das Password für FTp in Klartext übergeben ... oder kann man das auch in andere Form senden ?

ich meine jetzt bei der Funktion OpenFTP ....

Verfasst: 03.09.2009 18:57
von X360 Andy
Nein funktioniert nicht, muss vorher Entschlüsselt werden.
http://www.purebasic.fr/german/viewtopic.php?t=20313

Verfasst: 03.09.2009 20:35
von AND51
STARGÅTE hat geschrieben:Man muss ja nicht direkt eine Zahl angeben, sonden kann ja auch die Hochkomma-Funktion nutzen:
Encrypt("Ich bin ein Satz", 'Cool')
Ja das probier doch mal und du wirst enttäuscht feststellen, dass die Hochkomma-Funktion, die übrigens nirgendwo dokumentiert ist (Sauerei!) maximal 8 Zeichen akzeptiert. Zumindest war das bis 4.30 so.