Seite 2 von 2

Re: Kompressionsalgorithmus (x86 = x64)

Verfasst: 28.04.2010 14:51
von ts-soft
Wie wäre es mit AES? http://www.purebasic.com/german/documen ... ipher.html
Ansonsten findeste im CodeArchiv und hier im Forum auch noch mehrfach RC4 oder RC4Mem.

// edit
Hier eine überarbeitete RC4 Funktion:

Code: Alles auswählen

EnableExplicit

Procedure RC4Mem(*Mem, memLen, key.s)
  ; based on source from Pille (German-Forum)
  Protected I, t, x, j = 1, y, l, *Sp.Integer, *KeyP.BYTE, *Memm.BYTE
  If key
    Dim S(255)
    Dim K(255)
    l        = Len(key)
    *Sp      = @S()
    *KeyP    = @key
    For I = 0 To 255
      *Sp\I = I
      *Sp + SizeOf(Integer)
      If *KeyP\b = 0
        *KeyP = @key
      EndIf
      K(I) = *KeyP\b
      *KeyP + SizeOf(Byte)
    Next I
    j = 0
    For I = 0 To 255
      j = (j + S(I) + K(I)) & 255
      Swap S(I), S(j)
    Next I
    I = 0
    j = 0
    *Memm = *Mem
    For x = 0 To memLen - 1
      I = (I + 1) & 255
      j = (j + S(I)) & 255
      Swap S(I), S(j)
      t = (S(I) + (S(j) & 255)) & 255
      y = S(t)
      *Memm\b ! y
      *Memm + SizeOf(Byte)
    Next
  EndIf
  ProcedureReturn *Mem
EndProcedure

Re: Kompressionsalgorithmus (x86 = x64)

Verfasst: 28.04.2010 16:13
von Mok
Ich hab mich etwas mit dem AES gespielt. Das Verschlüsseln funktioniert ganz gut, aber das Entschlüsseln kapier ich einfach nicht.

Code: Alles auswählen

;Text der Eingabedatei:
;Das ist ein Test...
;Text der verschlüsselten Datei:
;Æ8ðÐǾ،UØ–~Àj$ö`
;Text der entschlüsselten Datei:
;.NgLU¦•UOp	Ÿ„´WçÇ

;Code:
#CIPHER = 0
File = OpenFile(#PB_Any,"C:\Test.txt")
File2= OpenFile(#PB_Any,"C:\TestVer.txt")
File3= OpenFile(#PB_Any,"C:\TestEnt.txt")
Size = FileSize("C:\Test.txt")

*Buf1 = AllocateMemory(Size)
ReadData(File,*Buf1,Size)
*Buf2 = AllocateMemory(Size)

StartAESCipher(#CIPHER,?Key,128,?InitializationVector,#PB_Cipher_Encode|#PB_Cipher_CBC)
AddCipherBuffer(#Cipher, *Buf1, *Buf2, Size)

FinishCipher(#CIPHER)

WriteData(File2,*Buf2,Size) ;verschlüsselte ausgabe

FreeMemory(*Buf1):FreeMemory(*Buf2)


;Entschlüsseln

*Buf1 = AllocateMemory(Size)
ReadData(File2,*Buf1,Size)
*Buf2 = AllocateMemory(Size)

StartAESCipher(#CIPHER,?Key,128,?InitializationVector,#PB_Cipher_Decode|#PB_Cipher_CBC)
AddCipherBuffer(#Cipher, *Buf1, *Buf2, Size)

FinishCipher(#CIPHER)

WriteData(File3,*Buf2,Size) ;entschlüsselte ausgabe
CloseFile(File)
CloseFile(File2)
CloseFile(File3)



DataSection ;Aus der Hilfe kopiert
  Key:
    Data.b $06, $a9, $21, $40, $36, $b8, $a1, $5b, $51, $2e, $03, $d5, $34, $12, $00, $06

  InitializationVector:
    Data.b $3d, $af, $ba, $42, $9d, $9e, $b4, $30, $b4, $22, $da, $80, $2c, $9f, $ac, $41
EndDataSection

Re: Kompressionsalgorithmus (x86 = x64)

Verfasst: 28.04.2010 16:46
von ts-soft
In Deinem Code ohne EnableExplicit fange ich nicht an Fehler zu suchen! (Prinzip)
Hier ein funktionierendes Beispiel:

Code: Alles auswählen

EnableExplicit

DataSection
  Key:
  Data.b $06, $a9, $21, $40, $36, $b8, $a1, $5b, $51, $2e, $03, $d5, $34, $12, $00, $06
  
  InitializationVector:
  Data.b $3d, $af, $ba, $42, $9d, $9e, $b4, $30, $b4, $22, $da, $80, $2c, $9f, $ac, $41
EndDataSection

Define.i FF, length
Define   *smem, *dmem
FF = ReadFile(#PB_Any, #PB_Compiler_Home + "SDK\Readme.txt")
If FF
  length = Lof(FF)
  *smem = AllocateMemory(length)
  If *smem
    ReadData(FF, *smem, length)
  EndIf
  CloseFile(FF)
EndIf

If MemorySize(*smem)
  *dmem = AllocateMemory(length)
  If *dmem
    If AESEncoder(*smem, *dmem, length, ?Key, 128, ?InitializationVector)
      FF = CreateFile(#PB_Any, GetTemporaryDirectory() + "AES Encodes Readme.txt")
      If FF
        WriteData(FF, *dmem, length)
        CloseFile(FF)
      EndIf
    EndIf
  EndIf
EndIf

If MemorySize(*smem) : FreeMemory(*smem) : EndIf
If MemorySize(*dmem) : FreeMemory(*dmem) : EndIf

OpenWindow(0, #PB_Ignore, #PB_Ignore, 800, 600, "AES Test", #PB_Window_SystemMenu)
EditorGadget(0, 10, 10, 780, 580, #PB_Editor_ReadOnly)

FF = ReadFile(#PB_Any, GetTemporaryDirectory() + "AES Encodes Readme.txt")
If FF
  length = Lof(FF)
  *smem = AllocateMemory(length)
  If *smem
    ReadData(FF, *smem, length)
  EndIf
  CloseFile(FF)
EndIf

If MemorySize(*smem)
  *dmem = AllocateMemory(length)
  If *dmem
    If AESDecoder(*smem, *dmem, length, ?Key, 128, ?InitializationVector)
      SetGadgetText(0, PeekS(*dmem))
    EndIf
  EndIf
EndIf

If MemorySize(*smem) : FreeMemory(*smem) : EndIf
If MemorySize(*dmem) : FreeMemory(*dmem) : EndIf

While WaitWindowEvent() <> #PB_Event_CloseWindow : Wend


Wichtig: Du musst erst packen und dann verschlüsseln, weil die verschlüsselte Datei wird sich kaum noch packen lassen!

Gruß
Thomas