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

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

il y avait la solution dedans , enfin, pour un certain mieux
donc dans mon code, il faut remplacer
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

:
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 ....

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....

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,