UserLibrary: crypt_lib - CryptMemory()

Anwendungen, Tools, Userlibs und anderes nützliches.
Benutzeravatar
Mischa
Beiträge: 152
Registriert: 29.08.2004 06:52
Wohnort: Hellhorst

Beitrag 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
Benutzeravatar
Mischa
Beiträge: 152
Registriert: 29.08.2004 06:52
Wohnort: Hellhorst

Beitrag 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
Benutzeravatar
bluejoke
Beiträge: 1244
Registriert: 08.09.2004 16:33
Kontaktdaten:

Beitrag 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
Ich bin Ausländer - fast überall
Windows XP Pro SP2 - PB 4.00
Benutzeravatar
Mischa
Beiträge: 152
Registriert: 29.08.2004 06:52
Wohnort: Hellhorst

Beitrag 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
Antworten