Page 1 sur 1

Xor, bytes et fichiers problème

Publié : jeu. 28/juil./2016 14:05
par jmg49
Bonjour,

je voudrais encrypter les bytes d'un fichier1 avec un XOR et une clé , mettre le contenu dans un fichier2, pour après ré-appliquer le même XOR sur le fichier2 et écrire dans le fichier3, logiquement, je devrai me retrouver avec fichier1=fichier3

ben non... je pense fortement à la prise en charge de l'Unicode / Ascii qui pourrait provoquer cela ,malgré mes 'CompilerIf' ; j'ai testé avec une fonction RC4, j'ai le même soucis,

voyez vous ce que j'ai fait de pas bien ? l'ecriture des bytes dans les fichiers peut être, là je vois pas

Code : Tout sélectionner

Enumeration
  #File1
  #File2
  #File3
EndEnumeration

Structure Bytes
  b.b[0]
EndStructure




key.s    = "jmg"
Filename.s = "test.txt"




Procedure XorMemory(*Memory.Bytes, MemoryLength.l, *Key.Bytes, KeyLength.l)
  Protected XorMemory.l, i.l, j.l
 
  If *Memory And *Key And MemoryLength > 0 And KeyLength > 0
   
    While i < MemoryLength
      If j = KeyLength : j = 0 : EndIf
      *Memory\b[i] ! *Key\b[j]
                
      i + 1
      j + 1
    Wend
   
    XorMemory = #True
  EndIf
 
  ProcedureReturn XorMemory
EndProcedure 
  
; ---ouverture du fichier - lecture des bytes et assignement en char hexa dans string$  

    OpenFile(#File1,Filename.s) 
        Repeat
            string.s = string.s+Hex(ReadByte(#File1))
        Until Eof(#File1) 
        CloseFile(#File1) 
   
Debug string.s  ;  affichage des bytes du fichier , ok
        
        
 CompilerIf #PB_Compiler_Unicode
 length =  Len(string.s) * 2
CompilerElse
 length =  Len(string.s)
CompilerEndIf       
     
      
XorMemory(@string, length, @key, Len(key))

Debug string.s     ; affichage des bytes encodés , ok 

CreateFile(#File2 ,"encrypted.dat")
WriteData(#File2, @string, length)
CloseFile(#File2)

; retour aux bytes originaux et écriture dans nouveau fichier

XorMemory(@string, length, @key, Len(key))

Debug string.s  ; afichage des bytes ....pas pareil ....

CreateFile(#File3 ,"decrypted.dat")
WriteData(#File3, @string, length)
CloseFile(#File3)



End



Re: Xor, bytes et fichiers problème

Publié : jeu. 28/juil./2016 14:18
par Ar-S
Pense à nous dire avec quel version de PB tu codes.

Re: Xor, bytes et fichiers problème

Publié : jeu. 28/juil./2016 14:23
par jmg49
effectivement, PB 5.42 LTS 32b :wink:

Re: Xor, bytes et fichiers problème

Publié : ven. 29/juil./2016 9:45
par Mesa
En regardant ici http://forums.purebasic.com/english/vie ... hp?t=37017 j'ai pu faire ça, qui marche avec la version 5.50 de PB qui est seulement unicode.

Code : Tout sélectionner

Procedure XOrCrypt(*Buffer, Len.l, Key$)
  ;just some weird and powerful(?) xor encryption algorithm by JLC
  Protected i, Char.c, KeyChar.c
  Protected KeyLength = Len(Key$), KeyPos
  
  For i = 0 To Len - 1
    Char = PeekC(*Buffer + i * SizeOf(Character))
    KeyChar = PeekC(@Key$ + KeyPos)
    
    Char ! KeyChar ! Len ! i ! KeyLength ;xor 
    PokeC(*Buffer + i * SizeOf(Character), Char)
    KeyPos + SizeOf(Character)
    If KeyPos > KeyLength
      KeyPos = 0
    EndIf
  Next
EndProcedure

Text$ = "the string to be encrypted àà"

;Debug Len(String$)
;Debug Length
;Debug String$

CreateFile(0,"C:\Test.txt",#PB_UTF8)
WriteStringN(0, Text$,#PB_UTF8)
CloseFile(0)

Delay(1000)

ReadFile(0, "C:\Test.txt",#PB_UTF8)
While Eof(0) = 0           ; Boucle tant que la fin du fichier n'est pas atteinte. (Eof = 'End Of File') 
  String$= String$+ReadString(0,#PB_UTF8|#PB_File_IgnoreEOL) 
Wend
CloseFile(0)
Debug "Contenu du fichier non crypté"
Debug String$
Length = StringByteLength(String$, #PB_UTF8)

;encrypt
XOrCrypt(@String$,Length,"key of whatever length éé") 
;Debug String$ ;if it looks cut that's because a null-char. terminates it
Debug "Voir le contenu de la mémoire pour voir le texte crypté"
Debug ""
ShowMemoryViewer(@String$, Length)
CreateFile(0, "C:\Test.dat",#PB_UTF8)
WriteData(0, @String$, Length) 
CloseFile(0)

;decrypt
XOrCrypt(@String$,Length,"key of whatever length éé") 
Debug "Contenu du fichier décrypté"
Debug String$
M.

Re: Xor, bytes et fichiers problème

Publié : ven. 29/juil./2016 16:17
par jmg49
Merci pour l'exemple :wink: il y avait la solution dedans , enfin, pour un certain mieux

donc dans mon code, il faut remplacer

Code : Tout sélectionner

string.s = string.s+Hex(ReadByte(#File1))
par

Code : Tout sélectionner

string.s = string.s+ReadString(#File1,#PB_UTF8|#PB_File_IgnoreEOL) 
et déjà c'est plus pareil, le fichier3 ressemble fortement au fichier1....si je le renomme en .txt il se comporte bien comme un .txt avec ce qu'il faut dedans,

il n'y a qu'à l'éditeur Hexa qu'on voit une différence notable 8O :

Image

Image

il y du 00 intercalé


donc comme je suis fainéant, j'ai changé de fonction XOR, et là j'ai un bon résultat

Code : Tout sélectionner


Enumeration
  #File1
  #File2
  #File3
EndEnumeration


key.s    = "jmg"
Filename.s = "test.txt"

Procedure.s XorCrypt(Key.s,String.s)
 
  For n=1 To Len(String)
    ChrString=Asc(Mid(String,n,1))
    ChrKey=Asc(Mid(Key,Ptr+1,1))
    If ChrString=ChrKey
      ChrCrypt=ChrString
    Else
      ChrCrypt=ChrString ! ChrKey
    EndIf
   
    Retour.s+Chr(ChrCrypt)
    Ptr+1
    If Ptr >Len(Key) : Ptr=0 : EndIf
  Next
  ProcedureReturn Retour
EndProcedure




OpenFile(#File1,Filename.s)
        Repeat
            string.s = string.s+ReadString(#File1,#PB_UTF8|#PB_File_IgnoreEOL)
        Until Eof(#File1)
        CloseFile(#File1)
   
Debug string.s  ;  affichage des bytes du fichier , ok

raoul.s= XorCrypt(key, string.s)

Debug raoul.s

CreateFile(#File2 ,"encrypted.dat")
WriteString(#File2,raoul.s)
CloseFile(#File2)



raoul2.s= XorCrypt(key, raoul.s)

Debug raoul2.s  ; afichage des bytes ....pas pareil ....


CreateFile(#File3 ,"decrypted.dat")

WriteString (#File3, raoul2.s)
CloseFile(#File3)

End

en vous remerciant,

Re: Xor, bytes et fichiers problème

Publié : ven. 29/juil./2016 16:40
par jmg49
suite des évènements, il se trouve que ce code ne fonctionne bien qu'avec des fichiers .txt , évidemment je veux l'appliquer à un .exe

une fois crypté et décrypté le PE Windows voit sa structure bousillé ( entête MZ etc....) donc inutilisable

je suis parti sur une fausse piste je pense, il faut que je revois comment lire les bytes du fichier, et surtout les réécrire en bytes non en string ....

Image

Re: Xor, bytes et fichiers problème

Publié : sam. 30/juil./2016 12:15
par Fig
Tu veux crypter un fichier exécutable... Je suppose que tu veux qu'en le lançant il se décrypte et devienne utilisable, non ?
Explique nous ce que tu veux vraiment faire dans le détail pour qu'on t'aide.... :D

Re: Xor, bytes et fichiers problème

Publié : sam. 30/juil./2016 17:28
par jmg49
Bonjour, je veux simplement que le code crypte le contenu d un fichier,ecrive le fichier, le decrypte et l ecrive donc avec la meme structure que l original. Pour l instant c est pas le cas. Ca semble fonctionner pour du .txt, mais si on prend un module v2m par exemple , fichier bin, il est altere aussi,


Ca pourrait permettre de proteger les ressources incluses dans un exe avec includebinary et les decrypter au moment où on veut les utiliser, music, font logos....

Merci

Re: Xor, bytes et fichiers problème

Publié : sam. 30/juil./2016 19:18
par zaphod_b
Salut,

J'ai probablement pas pigé la question.
Désolé.
Pour coder avec xor sur n'importe quel fichier avec vérification du checksum pour intégrité :

Code : Tout sélectionner

;pb 5.5 x64 - w10 pro 64
;zaph - 2016
;mettre le debogueur
Procedure XOrCrypt(*Buffer, Len.l, Key$)
  Protected i, Char.a, KeyChar.a
  Protected KeyLength = Len(Key$), KeyPos
 
  For i = 0 To Len - 1
    char=PeekA(*buffer+i) 
    keychar=PeekA(@key$+keypos%keylength)
    char!keychar!len!i!keylength
    PokeA(*buffer+i,char)
    keypos+1
  Next
EndProcedure

;
UseCRC32Fingerprint()
;marche avec tout type de fichier
Fichier$ = OpenFileRequester("Sélectionnez un fichier","","Texte (.txt)|*.txt|Tous (*.*)|*.*",0)
  If Fichier$
    Debug FileFingerprint(Fichier$,#PB_Cipher_CRC32)
    If ReadFile(0, Fichier$) 
      length = Lof(0)                            ; Lit la taille en octets du fichier 
      *MemoryID = AllocateMemory(length)         ; alloue un bloc mémoire de la taille du fichier
      If *MemoryID
        bytes = ReadData(0, *MemoryID, length)   ; Lit les données du fichier et les place dans le bloc mémoire
      EndIf
      CloseFile(0)
      ;encode
      xorcrypt(*memoryid,length,"abcdef")
      ;sauve
      OpenFile(0,GetPathPart(Fichier$)+GetFilePart(Fichier$,#PB_FileSystem_NoExtension)+".xorcod")
      WriteData(0,*MemoryID,length)
      CloseFile(0)
      ;
      FreeMemory(*MemoryID)
      ;lit fichier codé
      ReadFile(0, GetPathPart(Fichier$)+GetFilePart(Fichier$,#PB_FileSystem_NoExtension)+".xorcod") 
      length = Lof(0)                            ; Lit la taille en octets du fichier 
      *MemoryID = AllocateMemory(length)         ; alloue un bloc mémoire de la taille du fichier
      If *MemoryID
        bytes = ReadData(0, *MemoryID, length)   ; Lit les données du fichier et les place dans le bloc mémoire
      EndIf
      CloseFile(0)
      ;decode
      XOrCrypt(*MemoryID,length,"abcdef")
      ;sauve décodé
      OpenFile(0,GetPathPart(Fichier$)+GetFilePart(Fichier$,#PB_FileSystem_NoExtension)+".xordecod")
      WriteData(0,*MemoryID,length)
      CloseFile(0)
      ;intégrité
      Debug FileFingerprint(GetPathPart(Fichier$)+GetFilePart(Fichier$,#PB_FileSystem_NoExtension)+".xordecod",#PB_Cipher_CRC32)
      ;
      FreeMemory(*MemoryID)
      ;      
    EndIf
    
  EndIf

Crée un fichier .xorcod et un fichier .xordecode

Re: Xor, bytes et fichiers problème

Publié : sam. 30/juil./2016 21:13
par jmg49
Impec ! C etait bien ça , je lisais le fichiers et stockait dans une variable string, et je cryptais le tout puis réécrire les strings, il fallait passer par un buffer en mémoire et crpyter le buffer, c est super merci beaucoup,