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...

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
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"...

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
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...

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