Me remettant un peu à la programmation, je souhaite crypter certaines données en Aes avant insertion dans une base de données.
J'ai testé ce bout de code mais voilà, si cela marche très bien en cryptage/décryptage, il se passe un phénomène que j'ai du mal à m'expliquer lorsque je mets une donnée cryptée dans ma base et que je la décrypte.
Cela ne serait pas grand chose si c'était une erreur récurrente mais, sur un nombre important de données, quelques résultats sont altérés (ce qui rend la chose assez aléatoire).
Auriez vous une idée d'où ceci pourrait bien provenir?
Code : Tout sélectionner
UseSQLiteDatabase()
Procedure.s CryptageAES256(chaine$)
String$ = chaine$
StringMemorySize = StringByteLength(String$) + SizeOf(Character) ; Espace pour la chaîne et son caractère 'nul' de terminaison de chaîne
*CipheredString = AllocateMemory(StringMemorySize)
*DecipheredString = AllocateMemory(StringMemorySize)
If AESEncoder(@String$, *CipheredString, StringByteLength(String$), ?Key, 256, ?InitializationVector)
Debug "Codé : "+PeekS(*CipheredString) ; Attention, ça s'arrêtera sur le premier octet nul, uniquement à des fins de démonstration
string$=PeekS(*CipheredString)
ProcedureReturn string$
EndIf
DataSection
Key:
Data.b $00, $a1, $22, $43, $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
EndProcedure
Procedure.s decryptageAES256(chaine$)
String$ = chaine$
UseMD5Fingerprint()
StringMemorySize = StringByteLength(String$) + SizeOf(Character) ; Espace pour la chaîne et son caractère 'nul' de terminaison de chaîne
*CipheredString = AllocateMemory(StringMemorySize)
*DecipheredString = AllocateMemory(StringMemorySize)
AESDecoder(@String$, *DecipheredString, StringByteLength(String$), ?Key, 256, ?InitializationVector)
decodage.s=PeekS(*DecipheredString)
string$=PeekS(*DecipheredString)
ProcedureReturn string$
DataSection
Key:
Data.b $00, $a1, $22, $43, $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
EndProcedure
Procedure CheckDatabaseUpdate(Database, Query$)
Result = DatabaseUpdate(Database, Query$)
If Result = 0
Debug DatabaseError()
EndIf
ProcedureReturn Result
EndProcedure
Procedure creationSGBD()
; On teste si le fichier de sgbd existe déjà
SGBD$="basetest"
path$="A:\"
If ReadFile(0, path$+"\"+SGBD$+"\"+SGBD$+".dat")
MessageRequester("Information","Ce nom ("+SGBD$+") existe déjà",#PB_MessageRequester_Ok)
CloseFile(0)
Goto suite
Else
If CreateDirectory(path$+"\"+SGBD$)
EndIf
If CreateFile(0,path$+"\"+SGBD$+"\"+SGBD$+".dat") ; si non, on crée le dit fichier
CloseFile(0)
Goto creation
EndIf
EndIf
creation:
Debug (path$+"\"+SGBD$+"\"+SGBD$+".dat")
If OpenDatabase(0, path$+"\"+SGBD$+"\"+SGBD$+".dat", "", "")
CheckDatabaseUpdate(0, "CREATE TABLE entree (codeentree CHAR(50),date CHAR(50), origine CHAR(255), test CHAR(255))")
Debug "table basetest créée"
EndIf
suite:
EndProcedure
path$= "A:"
SGBD$="basetest"
creationSGBD()
If OpenDatabase(0, path$+"\"+SGBD$+"\"+SGBD$+".dat", "", "")
Debug "on démarre le remplissage test"
;- test
For i =0 To 9
a$="code"+Str(i)
If Len(a$)<16
a$=a$+Space(16 - Len(a$))
EndIf
b$="date"+Str(i)
If Len(b$)<16
b$=b$+Space(16 - Len(b$))
EndIf
c$="origine"+Str(i)
If Len(c$)<16
c$=c$+Space(16 - Len(c$))
EndIf
; je teste le bon fonctionnement du cryptage décryptage avant insertion
chaine$= a$
a$=CryptageAES256(chaine$)
chaine2$=decryptageAES256(a$)
Debug "Cryptage du "+chaine$+ " : "+a$
Debug "Décryptage du "+chaine$+ " : "+chaine2$
chaine$= b$
b$=CryptageAES256(chaine$)
chaine2$=decryptageAES256(b$)
Debug "Cryptage du "+chaine$+ " : "+b$
Debug "Décryptage du "+chaine$+ " : "+chaine2$
chaine$= c$
c$=CryptageAES256(chaine$)
chaine2$=decryptageAES256(c$)
Debug "Cryptage du "+chaine$+ " : "+c$
Debug "Décryptage du "+chaine$+ " : "+chaine2$
; on entre les données cryptées
CheckDatabaseUpdate(0, "INSERT INTO entree (codeentree,date,origine) VALUES ('"+a$+"','"+b$+"','"+c$+"')")
Next
; on teste le décryptage
If DatabaseQuery(0, "SELECT * FROM entree")
Debug "on lit le remplissage"
While NextDatabaseRow(0)
chaine1$=GetDatabaseString(0, 0)
chaine2$=decryptageAES256(chaine1$)
a$=chaine2$
Debug "-----------------------------------------------------------"
Debug "CODE : chaine décodée: "+chaine2$
Debug "-----------------------------------------------------------"
chaine1$=GetDatabaseString(0, 1)
chaine2$=decryptageAES256(chaine1$)
Debug "-----------------------------------------------------------"
Debug "DATE : chaine décodée: "+chaine2$
Debug "-----------------------------------------------------------"
chaine1$=GetDatabaseString(0, 2)
chaine2$=decryptageAES256(chaine1$)
Debug "-----------------------------------------------------------"
Debug "ORIGINE : chaine décodée: "+chaine2$
Debug "-----------------------------------------------------------"
Wend
FinishDatabaseQuery(0)
EndIf
CloseDatabase(0)
EndIf