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

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
ABBKlaus
Beiträge: 61
Registriert: 15.03.2006 22:09
Wohnort: Ratingen
Kontaktdaten:

Beitrag von ABBKlaus »

hexenwerk : :mrgreen:

Code: Alles auswählen

Procedure.l Hex2Dec(h$)
  h$=UCase(h$)
  For r=1 To Len(h$)
    d<<4 : a$=Mid(h$,r,1)
    If Asc(a$)>60
      d+Asc(a$)-55
    Else
      d+Asc(a$)-48
    EndIf
  Next
  ProcedureReturn d
EndProcedure

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

Procedure.s PHP_RC4_Encode(String$,Key$)
  memLen=Len(String$) 
  *Mem=AllocateMemory(memLen) 
  PokeS(*Mem,String$,memLen) 
  
  RC4Mem(*Mem, memLen, key$)
  
  result$="" 
  For i=0 To memLen-1
    result$+RSet(Hex(PeekB(*Mem+i)&$FF),2,"0")
  Next
  
  FreeMemory(*Mem)
  
  ProcedureReturn result$
EndProcedure

Procedure.s PHP_RC4_Decode(String$,Key$)
  l=Len(String$)/2
  If l=0
    ProcedureReturn
  EndIf
  
  *Mem=AllocateMemory(l)
  If *Mem=0
    ProcedureReturn
  EndIf
  
  For i=0 To l-1
    a$=Mid(String$,i*2+1,2)
    b=Hex2Dec(a$)
    PokeB(*Mem+i,b)
  Next
  
  RC4Mem(*Mem,l,Key$)
  
  String$=PeekS(*Mem,l)
  
  FreeMemory(*Mem)
  
  ProcedureReturn String$
EndProcedure

Key$="Test123"
String$="abcdefg"

a$=PHP_RC4_Encode(String$,Key$)
Debug a$ 
a$=PHP_RC4_Decode(a$,Key$)
Debug a$
Zuletzt geändert von ABBKlaus am 25.03.2006 12:48, insgesamt 1-mal geändert.
PureBasicPower TailBite Printer_Lib / PDFBarcode / PrintBarcode / ExcelWriter
sleepyhead
Beiträge: 13
Registriert: 31.01.2006 01:03
Wohnort: Mettendorf TG (Schweiz)

Irgendwas ist falsch...

Beitrag von sleepyhead »

Jo do gibts ja eine zweite Seite :), ist mein geschriebener Beitrag gerade überflüssig... Danke für das Hexenwerk, leider funktioniert das bei mir nur mit dem Wort Test, sobald ich es mit etwas anderem versuche geht es nicht mehr... :D Hab es ja auch versucht, bin aber gescheitert und weiss glaub jetzt auch warum... Ein Byte ist bei dem wohl eher eine Zahl bis 255 und nicht 10001010 :) Hatte das folgende gebastelt zum String zu Hex und wieder zurück zu konvertieren...

Code: Alles auswählen

string.s = "Test"
Debug "String: "+string
memLen=Len(string)
Debug "Len: "+Str(memLen)
*Memm = AllocateMemory(memLen)
PokeS(*Memm,string,memLen)


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


r$ = ""
For i=0 To memLen*2-1
  hex$ = ""
  hex$ = Mid(result$, i+1, 1)
  Debug "Hexzahl "+Str(i)+": "+hex$
  Select hex$
    Case "0"
      r$ + "0000"
    Case "1" 
      r$ + "0001" 
    Case "2" 
      r$ + "0010"
    Case "3" 
      r$ + "0011"
    Case "4" 
      r$ + "0100"
    Case "5" 
      r$ + "0101"
    Case "6" 
      r$ + "0110"
    Case "7" 
      r$ + "0111"
    Case "8" 
      r$ + "1000"
    Case "9" 
      r$ + "1001"
    Case "a" 
      r$ + "1010"
    Case "b" 
      r$ + "1011"
    Case "c" 
      r$ + "1100"
    Case "d" 
      r$ + "1101"
    Case "e" 
      r$ + "1110"
    Case "f" 
      r$ + "1111"
  EndSelect
  Debug "4/8 Bits "+Str(i)+": "+r$
  If Len(r$) = 8
    If i = 2
      x = 0
    Else
      x = i/2
    EndIf
    Debug "Neue Position:"+Str(x)
    PokeB(*Memm+x, Val(r$))
    r$ = ""
  EndIf
Next

Debug "Resultat: "+PeekS(*Memm, memLen)
FreeMemory(*Memm)
Benutzeravatar
ABBKlaus
Beiträge: 61
Registriert: 15.03.2006 22:09
Wohnort: Ratingen
Kontaktdaten:

Beitrag von ABBKlaus »

Hi,

tja :oops: hatte wohl etwas stress gestern :cry:
Obiger code ist jetzt fehlerbereinigt und sollte funktionieren :roll:

Klaus
PureBasicPower TailBite Printer_Lib / PDFBarcode / PrintBarcode / ExcelWriter
Antworten