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

Anfängerfragen zum Programmieren mit PureBasic.
sleepyhead
Beiträge: 13
Registriert: 31.01.2006 01:03
Wohnort: Mettendorf TG (Schweiz)

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

Beitrag 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
Benutzeravatar
ABBKlaus
Beiträge: 61
Registriert: 15.03.2006 22:09
Wohnort: Ratingen
Kontaktdaten:

Beitrag von ABBKlaus »

Hi,

versuchs mal mit
SendNetworkData
:allright:
Strings sind in PB immer null terminiert.
PureBasicPower TailBite Printer_Lib / PDFBarcode / PrintBarcode / ExcelWriter
sleepyhead
Beiträge: 13
Registriert: 31.01.2006 01:03
Wohnort: Mettendorf TG (Schweiz)

Beispiel

Beitrag 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...
Benutzeravatar
MVXA
Beiträge: 3823
Registriert: 11.09.2004 00:45
Wohnort: Bremen, Deutschland
Kontaktdaten:

Beitrag von MVXA »

Er rechnet die Daten in das Hex format um, schaut zumindest so aus...
Bild
Benutzeravatar
ABBKlaus
Beiträge: 61
Registriert: 15.03.2006 22:09
Wohnort: Ratingen
Kontaktdaten:

Beitrag 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
PureBasicPower TailBite Printer_Lib / PDFBarcode / PrintBarcode / ExcelWriter
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag 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
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
sleepyhead
Beiträge: 13
Registriert: 31.01.2006 01:03
Wohnort: Mettendorf TG (Schweiz)

Vielen Dank

Beitrag 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? :)
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag 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!
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
sleepyhead
Beiträge: 13
Registriert: 31.01.2006 01:03
Wohnort: Mettendorf TG (Schweiz)

Hex zu String oder was auch immer...

Beitrag 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... :|
Benutzeravatar
freedimension
Admin
Beiträge: 1987
Registriert: 08.09.2004 13:19
Wohnort: Ludwigsburg
Kontaktdaten:

Beitrag von freedimension »

Beginne jeden Tag als ob es Absicht wäre!
Bild
BILDblog
Antworten