Excellent Jacobus, j'ai modifié pour intégrer le décryptage dans PureIconManager.
Je stabilise le code au maximum pour éviter les crash mémoire, pointeur etc.
Je teste les adresses mémoire avec la valeur <> de 0 et pas par > 0.
J'ai utilisée des codes d'erreur et une table d'adresse des codes d'erreur.
Voilà la version que j'utiliserais (enfin presque), je vous la laisse, à prendre ou à laisser, peu m'importe
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.
;--------------------------------------
Define i
EnableExplicit
#Return_Error = 0
#Return_No_Error = 1
Enumeration 0 ; les erreurs
#Error_AESEncoder_size_key ; erreur de la taille de la clé encodage, uniquement 128, 192, 256 autorisé
#Error_AESDecoder_size_key ; erreur de la taille de la clé décodage, uniquement 128, 192, 256 autorisé
#Error_ReadFile_Cryp_Failed ; erreur d'ouverture en lecture du fichier à coder
#Error_ReadFile_Decrypt_Failed ; erreur d'ouverture du fichier à décodage en lecture
#Error_CreateFile_Cryp_Failed ; erreur d'ouverture du fichier pour codage
#Error_CreateFile_Decrypt_Failed ; erreur d'ouverture du fichier pour décodage
#Error_Bad_Readata_Length ; Mauvaise longueur lues des données
#Error_length_Null_crypt ; erreur, la taille du fichier est de 0 octet
#Error_length_Null_decrypt ; erreur, la taille du fichier est de 0 octet
#Error_Memory_Allocation ; erreur d'allocation mémoire
#Error_AESEncoder_Failed ; l'encodage a échoué
#Error_AESDecoder_Failed ; le decodage a échoué
#Derniere_Erreur
EndEnumeration
; table des adresses des chaines pour affichage
Dim Table_Erreur.i(#Derniere_Erreur-1)
Table_Erreur(#Error_AESEncoder_size_key) = ?Error_AESEncoder_size_key
Table_Erreur(#Error_AESDecoder_size_key) = ?Error_AESDecoder_size_key
Table_Erreur(#Error_ReadFile_Cryp_Failed) = ?Error_ReadFile_Cryp_Failed
Table_Erreur(#Error_ReadFile_Decrypt_Failed) = ?Error_ReadFile_Decrypt_Failed
Table_Erreur(#Error_CreateFile_Cryp_Failed) = ?Error_CreateFile_Cryp_Failed
Table_Erreur(#Error_CreateFile_Decrypt_Failed) = ?Error_CreateFile_Decrypt_Failed
Table_Erreur(#Error_Bad_Readata_Length) = ?Error_Bad_Readata_Length
Table_Erreur(#Error_length_Null_crypt) = ?Error_length_Null_crypt
Table_Erreur(#Error_length_Null_decrypt) = ?Error_length_Null_decrypt
Table_Erreur(#Error_Memory_Allocation) = ?Error_Memory_Allocation
Table_Erreur(#Error_AESEncoder_Failed) = ?Error_AESEncoder_Failed
Table_Erreur(#Error_AESDecoder_Failed) = ?Error_AESDecoder_Failed
#File_To_convert = 0
#Converted_File = 1
; mémorise l'erreur au cas ou...
Global Erreur
; mémorise le nom du fichier à coder
Global file$
Macro Set_Error_Code(Code_Erreur)
Erreur = Code_Erreur
EndMacro
Macro Get_Error_Code()
(Erreur)
EndMacro
Procedure.i AEScrypt(fichier$, level=128)
; mémorise la longueur du fichier
Protected length
; mémorise la taille des données lues par ReadData()
Protected bytes
; mémorise le retour de CreateFile() pour les données cryptées
Protected CipheredFile
; pointeur mémoire
Protected *MemoryID
; pointeur pour le cryptage
Protected *CipheredData
; teste les valeurs
Select level
Case 128, 192, 256
Default
Set_Error_Code(#Error_AESEncoder_size_key)
ProcedureReturn #Return_Error
EndSelect
; ouverture du fichier en lecture
If ReadFile(#File_To_convert, fichier$) = 0
Set_Error_Code(#Error_ReadFile_Cryp_Failed)
ProcedureReturn #Return_Error
EndIf
; Lit la taille en octets du fichier
length = Lof(#File_To_convert)
If length = 0
; fermeture du fichier
CloseFile(#File_To_convert)
Set_Error_Code(#Error_length_Null_crypt)
ProcedureReturn #Return_Error
EndIf
; alloue un bloc mémoire de la taille du fichier
*MemoryID = AllocateMemory(length)
If *MemoryID = 0
; fermeture du fichier
CloseFile(#File_To_convert)
Set_Error_Code(#Error_Memory_Allocation)
ProcedureReturn #Return_Error
EndIf
; Lit les données du fichier et les place dans le bloc mémoire
bytes = ReadData(#File_To_convert, *MemoryID, length)
; fermeture du fichier
CloseFile(#File_To_convert)
; teste que la lecture s'est bien déroulée
If bytes <> MemorySize(*MemoryID)
; libère la mémoire
FreeMemory(*MemoryID)
Set_Error_Code(#Error_Bad_Readata_Length)
ProcedureReturn #Return_Error
EndIf
;On attaque le chiffrement des données placées en mémoire...
; allocation d'un autre bloc mémoire de la taille du fichier original+1
*CipheredData = AllocateMemory(MemorySize(*MemoryID)+1)
If *CipheredData = 0
; libère la mémoire
FreeMemory(*MemoryID)
Set_Error_Code(#Error_Memory_Allocation)
ProcedureReturn #Return_Error
EndIf
If AESEncoder(*MemoryID, *CipheredData, MemorySize(*MemoryID), ?Key, level, ?InitializationVector) = 0
; libère la mémoire
FreeMemory(*MemoryID)
; libère la mémoire
FreeMemory(*CipheredData)
Set_Error_Code(#Error_AESEncoder_Failed)
ProcedureReturn #Return_Error
EndIf
; libère la mémoire précédante dont on a plus besoin
FreeMemory(*MemoryID)
; 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 = 0
; libère la mémoire
FreeMemory(*CipheredData)
Set_Error_Code(#Error_CreateFile_Cryp_Failed)
ProcedureReturn #Return_Error
EndIf
WriteData(CipheredFile, *CipheredData, length)
CloseFile(CipheredFile)
; libère la mémoire
FreeMemory(*CipheredData)
; tout est OK
ProcedureReturn #Return_No_Error
EndProcedure
Procedure.i AESdecrypt(fichier$,level=128)
; mémorise la longueur du fichier
Protected length
; mémorise la taille des données lues par ReadData()
Protected bytes
; mémorise le retour de CreateFile() pour les données décryptées
Protected DecipheredFile
; pointeur mémoire
Protected *MemoryID
; pointeur pour le décryptage
Protected *DecipheredData
; nom riginal du fichier à décrypter
Protected DecFile$
; teste les valeurs
Select level
Case 128, 192, 256
Default
Set_Error_Code(#Error_AESDecoder_size_key)
ProcedureReturn #Return_Error
EndSelect
; ouverture du fichier en lecture
If ReadFile(#Converted_File, fichier$) = 0
Set_Error_Code(#Error_ReadFile_Decrypt_Failed)
ProcedureReturn #Return_Error
EndIf
length = Lof(#Converted_File)
If length = 0
; fermeture du fichier
CloseFile(#Converted_File)
Set_Error_Code(#Error_length_Null_decrypt)
ProcedureReturn #Return_Error
EndIf
*MemoryID = AllocateMemory(length)
If *MemoryID = 0
; fermeture du fichier
CloseFile(#Converted_File)
Set_Error_Code(#Error_Memory_Allocation)
ProcedureReturn #Return_Error
EndIf
; Lit les données du fichier et les place dans le bloc mémoire
bytes = ReadData(#Converted_File, *MemoryID, length)
; fermeture du fichier
CloseFile(#Converted_File)
; teste que la lecture s'est bien déroulée
If bytes <> MemorySize(*MemoryID)
; libère la mémoire
FreeMemory(*MemoryID)
Set_Error_Code(#Error_Bad_Readata_Length)
ProcedureReturn #Return_Error
EndIf
; allocation d'un autre bloc mémoire de la taille du fichier original+1
*DecipheredData = AllocateMemory(MemorySize(*MemoryID)+1)
If *DecipheredData = 0
; libère la mémoire
FreeMemory(*MemoryID)
Set_Error_Code(#Error_Memory_Allocation)
ProcedureReturn #Return_Error
EndIf
If AESDecoder(*MemoryID, *DecipheredData, MemorySize(*MemoryID), ?Key, level, ?InitializationVector) = 0
; libère la mémoire
FreeMemory(*MemoryID)
; libère la mémoire
FreeMemory(*DecipheredData)
Set_Error_Code(#Error_AESDecoder_Failed)
ProcedureReturn #Return_Error
EndIf
; libère la mémoire
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)
DecipheredFile = CreateFile(#PB_Any,DecFile$)
If DecipheredFile = 0
; libère la mémoire
FreeMemory(*DecipheredData)
Set_Error_Code(#Error_CreateFile_Decrypt_Failed)
ProcedureReturn #Return_Error
EndIf
; écriture des données décodées dans le fichier
WriteData(DecipheredFile, *DecipheredData, length)
; fermeture du fichier
CloseFile(DecipheredFile)
; libère la mémoire
FreeMemory(*DecipheredData)
; tout est OK
ProcedureReturn #Return_No_Error
EndProcedure
;Test encrypt/
file$ = OpenFileRequester("Choisissez un fichier à crypter", "c:\*.*", "Tous les fichiers (*.*)|*.*", 0)
If file$
Select AEScrypt(file$)
Case #Return_Error
; il y a une erreur, on affiche
MessageRequester("Erreur", PeekS(Table_Erreur(Get_Error_Code()))+Chr(10)+"Erreur " + Str(Get_Error_Code()), 16)
End
Default
; ici c'est Ok
MessageRequester("Info", "Fichier chiffré! : " + file$, 16)
EndSelect
Else
; on ne sélectionne pas de fichier, on termine sans rien faire
End
EndIf
;Test decrypt/
file$ = SaveFileRequester("Choisissez un fichier à décrypter", "c:\*.aes", "Fichiers AES (*.aes)|*.aes", 0)
If file$
Select AESdecrypt(file$)
Case #Return_Error
; il y a une erreur, on affiche
MessageRequester("Erreur", PeekS(Table_Erreur(Get_Error_Code()))+Chr(10)+"Erreur " + Str(Get_Error_Code()), 16)
End
Default
; ici c'est Ok
MessageRequester("Info", "Fichier déchiffré! : " + file$, 16)
EndSelect
; on ne sélectionne pas de fichier, on termine sans rien faire
EndIf
End
DataSection
; les messages d'erreur
Error_AESEncoder_size_key:
Data.s "Mauvaise taille de la clé d'encodage (128, 192, 256 uniquement)"
Error_AESDecoder_size_key:
Data.s "Mauvaise taille de la clé de décodage (128, 192, 256 uniquement)"
Error_ReadFile_Cryp_Failed:
Data.s "erreur d'ouverture en lecture du fichier à coder"
Error_ReadFile_Decrypt_Failed:
Data.s "erreur d'ouverture du fichier à décodage en lecture"
Error_CreateFile_Cryp_Failed:
Data.s "erreur d'ouverture du fichier pour codage"
Error_CreateFile_Decrypt_Failed:
Data.s "erreur d'ouverture du fichier pour décodage"
Error_Bad_Readata_Length:
Data.s "Mauvaise longueur lues des données"
Error_length_Null_crypt:
Data.s "Le fichier à coder est vide"
Error_length_Null_decrypt:
Data.s "Le fichier à décoder est vide"
Error_Memory_Allocation:
Data.s "Impossible d'allouer de la mémoire"
Error_AESEncoder_Failed:
Data.s "Le processus d'encodage n'a pu aboutir"
Error_AESDecoder_Failed:
Data.s "Le processus de décodage n'a pu aboutir"
EndDataSection
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