Seite 2 von 2

Verfasst: 24.03.2006 13:16
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$

Irgendwas ist falsch...

Verfasst: 25.03.2006 01:10
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)

Verfasst: 25.03.2006 12:50
von ABBKlaus
Hi,

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

Klaus