Xor, bytes et fichiers problème

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
jmg49
Messages : 153
Inscription : mer. 26/févr./2014 8:53

Xor, bytes et fichiers problème

Message 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


Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Xor, bytes et fichiers problème

Message par Ar-S »

Pense à nous dire avec quel version de PB tu codes.
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
jmg49
Messages : 153
Inscription : mer. 26/févr./2014 8:53

Re: Xor, bytes et fichiers problème

Message par jmg49 »

effectivement, PB 5.42 LTS 32b :wink:
Mesa
Messages : 1126
Inscription : mer. 14/sept./2011 16:59

Re: Xor, bytes et fichiers problème

Message 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.
jmg49
Messages : 153
Inscription : mer. 26/févr./2014 8:53

Re: Xor, bytes et fichiers problème

Message 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,
jmg49
Messages : 153
Inscription : mer. 26/févr./2014 8:53

Re: Xor, bytes et fichiers problème

Message 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
Avatar de l’utilisateur
Fig
Messages : 1176
Inscription : jeu. 14/oct./2004 19:48

Re: Xor, bytes et fichiers problème

Message 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
Il y a deux méthodes pour écrire des programmes sans erreurs. Mais il n’y a que la troisième qui marche.
Version de PB : 6.00LTS - 64 bits
jmg49
Messages : 153
Inscription : mer. 26/févr./2014 8:53

Re: Xor, bytes et fichiers problème

Message 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
zaphod_b
Messages : 76
Inscription : mar. 09/déc./2014 20:02

Re: Xor, bytes et fichiers problème

Message 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
jmg49
Messages : 153
Inscription : mer. 26/févr./2014 8:53

Re: Xor, bytes et fichiers problème

Message 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,
Répondre