Ist das Sicher ? - Einfache CodierungsProcedure

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Ist das Sicher ? - Einfache CodierungsProcedure

Beitrag 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.
Zuletzt geändert von STARGÅTE am 06.12.2009 20:01, insgesamt 1-mal geändert.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
Kukulkan
Beiträge: 1066
Registriert: 09.09.2004 07:07
Wohnort: Süddeutschland
Kontaktdaten:

Beitrag 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
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

weiterhin beachte:
Random() funktioniert nur für werte von 0 bis 2147483647 ($7FFFFFFF)
also nix mit Quad.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Beitrag 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Å_./'
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
sibru
Beiträge: 265
Registriert: 15.09.2004 18:11
Wohnort: hamburg

Beitrag 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
Bild Bild
Benutzeravatar
Kukulkan
Beiträge: 1066
Registriert: 09.09.2004 07:07
Wohnort: Süddeutschland
Kontaktdaten:

Beitrag 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
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Beitrag 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 ....
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
X360 Andy
Beiträge: 1206
Registriert: 11.05.2008 00:22
Wohnort: Bodensee
Kontaktdaten:

Beitrag von X360 Andy »

Nein funktioniert nicht, muss vorher Entschlüsselt werden.
http://www.purebasic.fr/german/viewtopic.php?t=20313
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag 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.
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Antworten