Crypter des fichiers tous types en AES
Publié : sam. 07/mai/2011 19:10
Salut à tous. J'ai remarqué quelques sujets récents traitant de l'encodage en AES, mais uniquement sur des chaînes de caractères. Ce qui limite quand même l'utilisation de cette excellente librairie. Voici donc deux procédures pour chiffrer/déchiffrer des fichiers en AES 128, 192 ou 256 bit. Il est ainsi possible de chiffrer n'importe quel fichier. Il faudra l'adapter à votre usage, mais l'essentiel est là.
@+ Jacobus
Code : Tout sélectionner
;--------------------------------------
;ENCODER UN FICHIER (TOUS TYPE)
;--------------------------------------
;128 bit par défaut
;Pour modifier le niveau de chiffrement, il suffit de l'indiquer lors de l'appel de la procédure
;Ainsi:
;AEScrypt(fichier$,192) pour encoder sur 192 bit
;AEScrypt(fichier$,256) pour encoder sur 256 bit
;Faire de même pour décoder.
;--------------------------------------
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
Procedure.s AEScrypt(fichier$,level.l=128)
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)
EndIf
;On attaque le chiffrement des données placées en mémoire...
*CipheredData = AllocateMemory(MemorySize(*MemoryID)+1) ; allocation d'un autre bloc mémoire de la taille du fichier original+1
If AESEncoder(*MemoryID, *CipheredData, MemorySize(*MemoryID), ?Key, level, ?InitializationVector)
FreeMemory(*MemoryID) ; libère la mémoire précédemment allouée dont on a plus besoin
If *CipheredData > 0
; On crée le fichier en ajoutant simplement une nouvelle extension
; cela permet de savoir de quel type de fichier original il s'agit et de facilement le décoder plus tard
CipheredFile = CreateFile(#PB_Any, fichier$+".aes")
If CipheredFile
WriteData(CipheredFile, *CipheredData, length)
CloseFile(CipheredFile)
EndIf
FreeMemory(*CipheredData) ; là aussi on libère la mémoire utilisée car plus nécessaire
ErrorMessage$ = "Fichier chiffré!"
Else
ErrorMessage$ = "Allocate Memory Error! - Impossible d'allouer le bloc mémoire nécessaire au chiffrement."
EndIf
Else
ErrorMessage$ = "AESEncoder() error! - Le processus d'encodage n'a pu aboutir."
EndIf
ProcedureReturn ErrorMessage$
EndProcedure
Procedure.s AESdecrypt(fichier$,level.l=128)
If ReadFile(0, fichier$)
length = Lof(0)
*MemoryID = AllocateMemory(length)
If *MemoryID
bytes = ReadData(0, *MemoryID, length)
EndIf
CloseFile(0)
EndIf
*DecipheredData = AllocateMemory(MemorySize(*MemoryID)+1)
If AESDecoder(*MemoryID, *DecipheredData, MemorySize(*MemoryID), ?Key, level, ?InitializationVector)
FreeMemory(*MemoryID)
;On récupère le nom original du fichier simplement en retirant l'extension .aes
DecFile$ = GetPathPart(fichier$) + Left(GetFilePart(fichier$), Len(GetFilePart(fichier$)) - Len(GetExtensionPart(fichier$)) - 1)
If *DecipheredData > 0
DecipheredFile = CreateFile(#PB_Any,DecFile$)
If DecipheredFile
WriteData(DecipheredFile, *DecipheredData, length)
CloseFile(DecipheredFile)
EndIf
FreeMemory(*DecipheredData)
ErrorMessage$ = "Fichier déchiffré!"
Else
ErrorMessage$ = "Allocate Memory Error! - Impossible d'allouer le bloc mémoire nécessaire au déchiffrement."
EndIf
Else
ErrorMessage$ = "AESDecoder() error! - Le processus de décodage n'a pu aboutir."
EndIf
ProcedureReturn ErrorMessage$
EndProcedure
;Test encrypt/
file$ = OpenFileRequester("Choisissez un fichier à crypter", "c:\*.*", "Tous les fichiers (*.*)|*.*", 0)
If file$
confirm$ = AEScrypt(file$)
If confirm$ <> "Fichier chiffré!"
MessageRequester("Erreur!","Une erreur est survenue lors du chiffrement de "+GetFilePart(file$)+Chr(10)+"Message : "+confirm$,#MB_ICONERROR)
Else
;;suppression de l'original / à vous de voir /
;DeleteFile(file$)
EndIf
EndIf
;Test decrypt/
file$ = OpenFileRequester("Choisissez un fichier à décrypter", "c:\*.aes", "Fichiers AES (*.aes)|*.aes", 0)
If file$
confirm$ = AESdecrypt(file$)
If confirm$ <> "Fichier déchiffré!"
MessageRequester("Erreur!","Une erreur est survenue lors du déchiffrement de "+GetFilePart(file$)+Chr(10)+"Message : "+confirm$,#MB_ICONERROR)
Else
;;suppression du fichier crypté / à vous de voir /
;DeleteFile(file$)
EndIf
EndIf