Seite 1 von 2

RC4Api von Droopy's Lib und PHP mit class.rc4crypt.php

Verfasst: 23.03.2006 12:58
von sleepyhead
Hallo zusammen

Habe ein riesengrosses Problem beim übergeben von verschlüssleten Daten. Wenn ich Daten in PB mit der RC4Api von Droopy's Lib (fand ich auf purearea.net) verschlüssle und mit SendNetworkString sende, in PHP mit socket_read auslese und dann durch die decode-funktion vom class.rc4crypt.php (http://sourceforge.net/projects/rc4crypt) jage, bekomme ich irgendwas, aber überhaupt nicht mehr den gleichen String... :cry:
Kennt irgendjemand eine Verschlüsslungsmethode, die Strings verarbeitet und auch Strings ausgibt und ein wenig sicher ist oder weiss, wie man das Problem mit der RC4Api löst?

Gruss
Sleepyhead

Verfasst: 23.03.2006 13:02
von ABBKlaus
Hi,

versuchs mal mit
SendNetworkData
:allright:
Strings sind in PB immer null terminiert.

Beispiel

Verfasst: 23.03.2006 22:24
von sleepyhead
Danke für die schnelle Antwort... Das Problem ist, dass PHP einen String erstellt. Wenn ich in PHP das Wort "Test" mit dem Passwort "Test" verschlüssle, bekomme ich "2e0b3e3c". Wenn ich das in PB mache, bekomme ich "$d³4"... :cry: Ich weiss auch nicht, irgend was muss PHP noch machen, URLEncoden oder sowas...

Verfasst: 23.03.2006 22:48
von MVXA
Er rechnet die Daten in das Hex format um, schaut zumindest so aus...

Verfasst: 23.03.2006 23:48
von ABBKlaus
php hat anscheinend dieselben Probleme mit Strings :o

Code: Alles auswählen

Procedure.l Mod(a,b) 
   ProcedureReturn a-(a/b)*b 
EndProcedure 

Procedure.l RC4Mem(Mem.l, memLen.l, Key.s) 
  ;RC4Mem(*MemoryBuffer.l, MomeryLength.l, Key.s) 
  Dim S.w(255) 
  Dim K.w(255) 
  i.l=0: j.l=0: t.l=0: x.l=0 
  temp.w=0: Y.w=0 
  Outp.s="" 
  For i = 0 To 255 
    S(i) = i 
  Next 
  j = 1 
  For i = 0 To 255 
    If j > Len(key) 
      j = 1 
    EndIf 
    K(i) = Asc(Mid(key, j, 1)) 
    j = j + 1 
  Next i 
  j = 0 
  For i = 0 To 255 
    j = Mod(j + S(i) + K(i), 256) 
    temp = S(i) 
    S(i) = S(j) 
    S(j) = temp 
  Next i 
  i = 0 
  j = 0 
  For x = 0 To memLen-1 
    i = Mod(i + 1, 256) 
    j = Mod(j + S(i),256) 
    temp = S(i) 
    S(i) = S(j) 
    S(j) = temp 
    t = Mod(S(i) + Mod(S(j), 256) , 256) 
    Y = S(t) 
    PokeB(Mem+x, PeekB(Mem+x)!Y) 
  Next 
  ProcedureReturn Mem 
EndProcedure

string$="Test"
key$="Test"

buflen=Len(string$)
*buffer=AllocateMemory(buflen)
PokeS(*buffer,string$,buflen)

RC4Mem(*buffer,buflen,key$)

For i=0 To buflen-1
  Debug RSet(Hex(PeekB(*buffer+i)),2,"0")
Next

FreeMemory(*buffer)
und das sollte rauskommem :
2E
0B
3E
3C

Verfasst: 24.03.2006 00:04
von ts-soft
Hier mal der RC4 Code ohne Mod

Code: Alles auswählen

Procedure RC4Mem(Mem.l, memLen.l, key.s)
  ; based on source from Pille (German-Forum)
  ; some extension by ts-soft
Protected I.l, t.l, x.l, j.l, temp.l, y.l, l.l, *Sp.LONG, *KeyP.BYTE, *Memm.BYTE
  If key
    Dim S.l(255)
    Dim K.l(255)
    I=0: j=0: t=0: x=0
    temp=0: y=0
    j = 1
    l.l          =Len(key)
    *Sp      = @S()
    *KeyP    = @key
    For I = 0 To 255
      *Sp\l = I
      *Sp + 4
      If *KeyP\b = 0
        *KeyP = @key
      EndIf
      K(I) = *KeyP\b
      *KeyP+1
    Next I
    j = 0
    For I = 0 To 255
      j = (j + S(I) + K(I)) & 255
      temp = S(I)
      S(I) = S(j)
      S(j) = temp
    Next I
    I = 0
    j = 0
    *Memm = Mem
    For x = 0 To memLen-1
      I = (I+1) & 255
      j = (j + S(I)) & 255
      temp = S(I)
      S(I) = S(j)
      S(j) = temp
      t = (S(I) + (S(j) & 255)) & 255
      y = S(t)
      *Memm\b ! y
      *Memm + 1
    Next
  EndIf
  ProcedureReturn Mem
EndProcedure
Sollte etwas schneller sein

Vielen Dank

Verfasst: 24.03.2006 07:29
von sleepyhead
Vielen Dank :) PHP und PB verstehen sich ja doch... Habe den Code so angepasst, dass ich nur Strings angeben muss und auch nur ein String zurückkommt, da ich die Prozedur sehr oft aufrufe...

Code: Alles auswählen

Procedure.s RC4Hex(string.s, key.s)
Protected memLen.l, I.l, t.l, x.l, j.l, temp.l, y.l, l.l, *Sp.LONG, *KeyP.BYTE, *Mem.BYTE

memLen=Len(string)
*Memm = AllocateMemory(memLen)
PokeS(*Memm,string,memLen)

If key
    Dim S.l(255)
    Dim K.l(255)
    I=0: j=0: t=0: x=0: temp=0: y=0
    j = 1
    l = Len(key)
    *Sp = @S()
    *KeyP = @key
    For I = 0 To 255
      *Sp\l = I
      *Sp + 4
      If *KeyP\b = 0
        *KeyP = @key
      EndIf
      K(I) = *KeyP\b
      *KeyP+1
    Next I
    j = 0
    For I = 0 To 255
      j = (j + S(I) + K(I)) & 255
      temp = S(I)
      S(I) = S(j)
      S(j) = temp
    Next I
    I = 0
    j = 0
    *Mem = *Memm
    For x = 0 To memLen-1
      I = (I+1) & 255
      j = (j + S(I)) & 255
      temp = S(I)
      S(I) = S(j)
      S(j) = temp
      t = (S(I) + (S(j) & 255)) & 255
      y = S(t)
      *Mem\b ! y
      *Mem + 1
    Next
  EndIf

result$ = ""
For i=0 To memLen-1
  result$+RSet(Hex(PeekB(*Memm+i)),2,"0")
Next

FreeMemory(*Memm)

ProcedureReturn result$
EndProcedure

Debug RC4Hex("Test", "Test")
Ach ja, wie entschlüssle ich das wieder? :)

Verfasst: 24.03.2006 07:48
von ts-soft
Deine Version scheint Fehlerhaft zu sein. Mit meiner geht es:

Code: Alles auswählen

String.s = "Test"
len.l = Len(String)
Key.s = "Test"
RC4Mem(@String, len, Key)
Debug String ; verschlüsselt
RC4Mem(@String, len, Key)
Debug String ; entschlüsselt
Die Hexumwandlung muß auf jedenfall ausserhalb der RC4-Procedure
stattfinden!

Hex zu String oder was auch immer...

Verfasst: 24.03.2006 09:23
von sleepyhead
Ich gebe ja zu, dass ich nicht darauf geachtet habe, dass ich es wieder mit der gleichen Prozedur dekodieren kann... :oops: Aber das grössere Problem ist wohl eher, dass ich mir nicht vorstellen kann was hex ist und wie ich das wieder dekodiergerecht für diese Funktion hinbekomme... Irgendwie ist der String verschlüsselt ja nicht wirklich mehr ein String sondern eher Bytes... Habe mal alle Funktionen von Bin bis weisnichtwas durchprobiert, aber hatte leider kein Glück... :|

Verfasst: 24.03.2006 13:02
von freedimension