Seite 2 von 2

Verfasst: 03.02.2005 13:43
von Mischa
Volker Schmid hat geschrieben: Ein Crypto-Algorithmus ist nur dann brauchbar, wenn er auch nach Offenlegung des Algorithmus noch Angriffen standhält (zB BlowFish, TwoFish, CAST256, Skipjack, RSA etc...).
Ja, das habe ich gestern im Netz auch gelesen. Und das ist ja auch
logisch. An den Algo kann man ja (zumindest ASM-seitig) problemlos
auch von hintenherum drankommen, nur mit dem Nachteil nicht zu
wissen ob seine Effizienz ausreichend ist.
Ruckzuck hat da ein Profi einen Algo entwickelt, der auf Knopfdruck
alle Daten entschlüsselt. :shock:

Diesem Risiko möchte ich hier keinen aussetzen und ich halte es für
sinnvoller es hier prüfen zu lassen, wie weit es mit der Sicherheit her
ist. Mit gutem Beispiel voran:

Code: Alles auswählen

ProcedureDLL CryptMemory(*source,ssize,*phrase,spsize,mode)
  If spsize<12
    ProcedureReturn -1
  EndIf
  If ssize % 4:size = ssize/4 * 4 + 4:Else:size = ssize:EndIf
  If spsize % 4:psize = spsize/4 * 4 + 4:Else:psize = spsize:EndIf
  If mode:m = 1:Else:m = -1:EndIf : orglen = psize/4
  
  Dim target.l(size/4-1)
  CopyMemory(*source,@target(),ssize)
  Dim key.l(orglen)
  Dim klength.l(psize-1)
  CopyMemory(*phrase,@key(),spsize)
  
  For i=0 To orglen-1
    sum + key(i)
  Next i
  key(orglen) = sum/(orglen-1)
  
  For i=0 To psize-1 Step 4
    For x=0 To 3
      klength(i+x) = PeekB(@key()+i+x) & 255
      If klength(i+x) > max
        max =klength(i+x)
      EndIf
    Next x
  Next i
  
  norm=1 : ncp = 1
  For i=0 To psize-1
    kl.f = klength(i)* psize / max
    klength(i) = (kl-1)/4
    If last
      If klength(i)=lastval
        klength(i)=norm
        norm + ncp
        If norm=orglen-1 Or norm=1
          ncp * -1
        EndIf
      EndIf
    EndIf
    If klength(i)=0
      klength(i)+1
    EndIf
    lastval=klength(i)
    last=1
  Next i
  
  stop = orglen-1 : mutate = 1
  For x=0 To stop
    p=mutate:If p=x:p=x+1:EndIf
    key(x) + key(p)
    mutate+1
    If mutate=orglen
      mutate = 0
    EndIf
  Next x
  
  stop = psize/2
  mutate = 1
  
  For i=0 To size/4-1
    target(i) - key(k) * m
    k+1
    If k>=klength(stop)
      k=0:stop-1
      If stop=0
        stop=psize-1
      Else
        For x=0 To klength(stop)
          p=mutate:If p=x:p=x+1:EndIf
          key(x) + key(p)
          mutate+1
          If mutate=orglen
            mutate = 0
          EndIf
        Next x
      EndIf
    EndIf
  Next i
  
  CopyMemory(@target(),*source,ssize)
  Dim target.l(0)
  Dim key.l(0)
  Dim klength(0)
  ProcedureReturn *source
EndProcedure
Nun, überprüft es und deckt meine Fehler auf.
Ich lerne ja noch auf diesem Gebiet.

Gruß,
Mischa

Verfasst: 16.02.2005 13:38
von Mischa
Update

Hat sich wohl keiner wirklich mit beschäftigt, hm.
Allerdings hatte ich mir selber den einen oder anderen Rat bei
den Experten (Kryptologen) geholt und ein paar Sachen geändert.
Jetzt ist beispielsweise ein Lawineneffekt eingebaut.

Evtl. schaut ja doch noch einer mal drüber...

UserLib + Beispiel + Source

oder..

Befehlszeilen Encoder/Decoder + Source der Funktion

Gruß,
Mischa

Verfasst: 16.02.2005 15:00
von bluejoke
Ich finds ja wirklich Klasse, das du sowas für die Allgemeinheit zugänglich machst.

Wie oder ob - lässt sich der Verschlüsselte String wieder entschlüsseln?
Weil ich bräuchte einen Algo zur sicheren Passwortübertragung an ein PHP-Skript im Internet

Verfasst: 16.02.2005 22:17
von Mischa
1.
CryptMemory() ist nicht speziell für Strings ausgelegt, wie der Name
schon vermuten läßt.
Die Funktion verschlüsselt Binär-Daten. Das schließt zwar Text-Dateien
mit ein, aber der Umgang direkt mit StringPointern (@), oder PeekS
ist gefährlich, da bei der Verschlüsselung auch Null-Bytes in den
Speicher-Block geschrieben werden. Und ein Null-Byte signalisiert dem
System ein String-Ende, wie ja allgemein bekannt sein sollte.
Also wenn Strings verschlüsseln, dann nur in einem allokierten
Speicherblock und das Ergbnis keinesfalls mit PeekS auslesen, da
sonst Daten verloren gehen würden und eine Entschlüsselung unmöglich
wird. Nach der Entschlüsselung kann man den String natürlich problemlos
via PeekS auslesen.

2.
Entschlüsseln funktioniert übrigens genauso wie verschlüsseln.
Der einzige Unterschied ist der letzte Parameter.
1 für verschlüsseln, 0 für entschlüsseln.
Achja, der verschlüsselte 'neue' Speicherblock ist 4 Byte größer
als der Quellspeicher.
Steht aber alles in der Info-Datei, oder?

Gruß,
Mischa