Problème cryptage données dans sqlite

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
totorcalais
Messages : 67
Inscription : mer. 27/sept./2006 12:45

Problème cryptage données dans sqlite

Message par totorcalais »

Bonjour,

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 
  
 
 
totorcalais
Messages : 67
Inscription : mer. 27/sept./2006 12:45

Re: Problème cryptage données dans sqlite

Message par totorcalais »

Je me réponds car en fait, ce n'est pas aléatoire.
J'ai fait deux constructions de bases consécutives et mes problèmes de décryptage surviennent aux mêmes endroits...

1er essai (extrait):
DATE : chaine décodée: date4
-----------------------------------------------------------
-----------------------------------------------------------
ORIGINE : chaine décodée: 鳕㴷퉠�텀킹멳料 ⇟
-----------------------------------------------------------
-----------------------------------------------------------
CODE : chaine décodée: ௬ᜦ㩘ꢄ綢ﶵ遻 ⚈
-----------------------------------------------------------
-----------------------------------------------------------
DATE : chaine décodée: 텖䣸臿ᰦ㳧ʮೃ ⃴
-----------------------------------------------------------
-----------------------------------------------------------
ORIGINE : chaine décodée: 罉먯◳覺ڄ�᭟ ❳
-----------------------------------------------------------
-----------------------------------------------------------
CODE : chaine décodée: 띶儛䌝￝඄⚸ㅋ㍹؞�㞆뫙
-----------------------------------------------------------
-----------------------------------------------------------
DATE : chaine décodée: date6
-----------------------------------------------------------
2eme essai :
DATE : chaine décodée: date4
-----------------------------------------------------------
-----------------------------------------------------------
ORIGINE : chaine décodée: 鳕㴷퉠�텀킹멳料 ⇟
-----------------------------------------------------------
-----------------------------------------------------------
CODE : chaine décodée: ௬ᜦ㩘ꢄ綢ﶵ遻 ⚈
-----------------------------------------------------------
-----------------------------------------------------------
DATE : chaine décodée: 텖䣸臿ᰦ㳧ʮೃ ⃴
-----------------------------------------------------------
-----------------------------------------------------------
ORIGINE : chaine décodée: 罉먯◳覺ڄ�᭟ ❳
-----------------------------------------------------------
-----------------------------------------------------------
CODE : chaine décodée: 띶儛䌝￝඄⚸ㅋ㍹؞�㞆뫙
-----------------------------------------------------------
-----------------------------------------------------------
DATE : chaine décodée: date6
-----------------------------------------------------------
identiques en tous points...
totorcalais
Messages : 67
Inscription : mer. 27/sept./2006 12:45

Re: Problème cryptage données dans sqlite

Message par totorcalais »

J'ai donc modifié le programme pour tester la lecture du string après copie dans la base.

Sur le cas du origine0 défaillant, j'ai en effet un string différent qui ressort de la lecture de la base:
輁阆 掻寨撌ﮞ仓찢킿痈 䓺司ⱙ (ici la sortie de la lecture de la donnée dans la base (des espaces remplacent un code spécifique)

輁阆�掻寨撌ﮞ仓찢킿痈�䓺司ⱙ (ici se trouve la bonne valeur)
On peut imaginer qu'un code spécifique ne peut être écrit dans un string dans sqlite et donc sa perte occasionne une altération du message crypté?

Passer par une table de caractères spécifique?
totorcalais
Messages : 67
Inscription : mer. 27/sept./2006 12:45

Re: Problème cryptage données dans sqlite

Message par totorcalais »

J'ai essayé avec une autre méthode (trouvée sur ce forum) et qui consiste à ne pas être tributaire des problèmes liés à certains caractères (tels que ' " ...).

Lien du code testé (code de marc56) : https://www.purebasic.fr/french/viewtop ... =1&t=17453

Je retrouve les mêmes soucis...

J'ai également été attiré par la solution sqlcipher comme ici (avec la dll): https://www.purebasic.fr/english/viewto ... 12&t=73046

Mais là où cela devrait être simple, la dll n'est pas acceptée (pas de code erreur au lancement mais impossible d'utiliser les fonctions SQL avec une erreur usesqlitedatabase() manquant alors que j'ai bien :

Code : Tout sélectionner

UseSQLiteDatabase("e:\sqlcipher.dll") 
en préambule.

Bref, je tourne en rond.

Il me reste la solution à l'arrache du cryptage de la base (obligeant à réaliser l'opération avant de l'utiliser puis au moment de clore l'activité. Toutefois, durant ce laps de temps, la base de données devient lisible...
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Problème cryptage données dans sqlite

Message par falsam »

j'ai l'impression que c'est le cryptage AES-128 et AES-256 qui pose problème avec le mode de compilation unicode du compilateur.

Un exemple d'une base de données en mémoire.

La variable Bits permet de changer le mode de cryptage 128, 192 ou 256.

Le code fonctionne avec l'AES-192 mais pas avec les deux autres modes.

Code : Tout sélectionner

EnableExplicit 

Enumeration
  #DataBase
EndEnumeration

; Requete SQL
Global ReqSql.s

; 
Global MemorySize = 1024, Bits = 192

Global Name.s, *Name
Global Description.s, *Description

Global *Buffer

Debug "■ Cryptage AES-"+Str(Bits) + #CRLF$

UseSQLiteDatabase()

; Création de la base de données en mémoire 
OpenDatabase(#DataBase, ":memory:", "", "")

; Creation d'une table de test
ReqSql = "CREATE TABLE test ("
ReqSql + "idauto INTEGER PRIMARY KEY,"    ;Identification auto
ReqSql + "name TEXTE,"                    ;Nom
ReqSql + "description TEXTE"              ;Description
ReqSql + ");"
DatabaseUpdate(#DataBase, ReqSql)

; Initialisation des variables
Name = "PureBasic"
Description = "Un langage programmation made in France qui n'a rien de basique"

Debug "■ DEBUG Données avant cryptage"
Debug "Name = " + Name
Debug "Description = " + Description
Debug #CRLF$ 

; Encodage des variables
*Name = AllocateMemory(MemorySize)   
AESEncoder(@Name, *Name, StringByteLength(Name), ?Key, Bits, ?InitializationVector)

*Description = AllocateMemory(MemorySize)   
AESEncoder(@Description, *Description, StringByteLength(Description), ?Key, Bits, ?InitializationVector)

; Débogage des données cryptées
Debug "■ DEBUG cryptage Avant enregistrement dans Database"
Debug "Name = " + PeekS(*Name)
Debug "Description = " + PeekS(*Description)
Debug #CRLF$

; Ajout de data (UTILISATION DE REQUETE PREPAREE)
ReqSql = "insert into test (name, description) values (?,?)"

SetDatabaseString(#Database, 0, PeekS(*Name))
SetDatabaseString(#Database, 1, PeekS(*Description))
DatabaseUpdate(#Database, ReqSql)

; Lecture des données cryptées 
ReqSql = "select name, description from test"
If DatabaseQuery(#Database, ReqSql)
  While NextDatabaseRow(#Database)  
    Name =  GetDatabaseString(#Database, 0)
    Description = GetDatabaseString(#Database, 1)
  Wend
EndIf
CloseDatabase(#DataBase)

; Lecture des données cryptées
Debug "■ DEBUG cryptage Database"
Debug "Name = " + Name
Debug "Description = " + Description
Debug #CRLF$

; Décryptage
*Name = AllocateMemory(MemorySize) 
*Buffer = AllocateMemory(MemorySize)
PokeS(*Buffer, Name)
AESDecoder(*Buffer, *Name, StringByteLength(Name), ?Key, Bits, ?InitializationVector)

*Description = AllocateMemory(MemorySize) 
*Buffer = AllocateMemory(MemorySize)
PokeS(*Buffer, Description)
AESDecoder(*Buffer, *Description, StringByteLength(Description), ?Key, Bits, ?InitializationVector)

Debug "■ DEBUG Resultat aprés décryptage"
Debug "Name =  " + PeekS(*Name)
Debug "Description = " + PeekS(*Description)

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
:arrow: Enregistre tes données en utilisant les requétes préparées
https://www.purebasic.fr/french/viewtop ... 75#p191075
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
totorcalais
Messages : 67
Inscription : mer. 27/sept./2006 12:45

Re: Problème cryptage données dans sqlite

Message par totorcalais »

Bonjour,

Merci pour ton temps et ta réponse.

Je vais scruter le code fourni.
Avatar de l’utilisateur
Naheulf
Messages : 191
Inscription : dim. 10/mars/2013 22:22
Localisation : France

Re: Problème cryptage données dans sqlite

Message par Naheulf »

Je passe juste en coup de vent et j’ai lu en diagonale, mais t’est sûr de vouloir enregistrer des données binaires dans des champs de type texte ?
yves86
Messages : 36
Inscription : sam. 26/juil./2008 17:13
Localisation : Poitou

Re: Problème cryptage données dans sqlite

Message par yves86 »

Comme NaheuIf, j'ai pas creusé ton code, mais moi j'utilise des champs Blob dans la base Sqlite et cela fonctionne très bien.
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Problème cryptage données dans sqlite

Message par falsam »

Naheulf a écrit :mais t’est sûr de vouloir enregistrer des données binaires dans des champs de type texte ?
yves86 a écrit :j'ai pas creusé ton code, mais moi j'utilise des champs Blob dans la base Sqlite et cela fonctionne très bien.
Effectivement tous les deux vous avez lu en diagonale :mrgreen:
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
yves86
Messages : 36
Inscription : sam. 26/juil./2008 17:13
Localisation : Poitou

Re: Problème cryptage données dans sqlite

Message par yves86 »

Essai ceci
Enlève les commentaires de la partie crypté et commente la partie décryptée pour voir les données cryptées

Code : Tout sélectionner

Enumeration
  #DataBase
EndEnumeration

UseSQLiteDatabase()

Global ReqSql.s
NewList Donnees.s()
Global Name.s
Global Description.s

Global Bits = 256

Procedure.b Txt_encrypt_bdd(Bdd.l,List family.s(), T_sql$,Bits.l)
  ForEach family()
    String$ = family()
    StringMemorySize = StringByteLength(String$) + SizeOf(Character) ; Espace pour la chaîne et son caractère 'nul' de terminaison de chaîne
    If StringMemorySize <= 16
      StringMemorySize = 16 + SizeOf(Character)
    EndIf
    *CipheredString = AllocateMemory(StringMemorySize)   
    length = MemorySize(*CipheredString)
    AESEncoder(@String$, *CipheredString, StringMemorySize - SizeOf(Character), ?Key, Bits, ?InitializationVector)
    SetDatabaseBlob(Bdd, ListIndex(Family()), *CipheredString, length)
  Next
  DatabaseUpdate(#DataBase,T_sql$)
  FreeMemory(*CipheredString)
  If *CipheredString
    ProcedureReturn #True
  Else
    ProcedureReturn #False
  EndIf
  
EndProcedure

Procedure.s Txt_decrypt_bdd(Bdd.l,rang.l,Bits.l)
  length = DatabaseColumnSize(Bdd, rang)
  If length > 0
    If length <= 16
      length = 16 + SizeOf(Character)
    EndIf
    *CipheredString = AllocateMemory(length)
    GetDatabaseBlob(Bdd, rang, *CipheredString, length)
    *DecipheredString = AllocateMemory(length) 
    AESDecoder(*CipheredString, *DecipheredString, length - SizeOf(Character), ?Key, Bits, ?InitializationVector)
    FreeMemory(*CipheredString)
    ProcedureReturn PeekS(*DecipheredString)
  Else
    ProcedureReturn ""
  EndIf
  
EndProcedure

; Création de la base de données en mémoire
OpenDatabase(#DataBase, ":memory:", "", "")

; Creation d'une table de test
ReqSql = "CREATE TABLE test ("
ReqSql + "idauto INTEGER PRIMARY KEY,"    ;Identification auto
ReqSql + "name TEXTE,"                    ;Nom
ReqSql + "description TEXTE"              ;Description
ReqSql + ");"
DatabaseUpdate(#DataBase, ReqSql)

Debug "■ Cryptage AES-"+Str(Bits) + #CRLF$
; Initialisation des variables
Name = "PureBasic"
Description = "Un langage programmation made in France qui n'a rien de basique"

Debug "■ DEBUG Données avant cryptage"
Debug "Name = " + Name
Debug "Description = " + Description
Debug #CRLF$

;  Encodage des variables avec insertion dans la base de données
AddElement(Donnees())
Donnees() = Name
AddElement(Donnees())
Donnees() = Description

Txt_encrypt_bdd(#DataBase,Donnees(),"insert into test (name, description) values (?,?)",Bits)

DatabaseQuery(#DataBase,"SELECT name, description FROM Test")
While NextDatabaseRow(#DataBase)
;   ;Crypté
;   Name$         = GetDatabaseString(#DataBase,0)
;   Description$  = GetDatabaseString(#DataBase,1)
;   Debug "■ DEBUG Resultat crypté"
;   Debug "Name =  " + Name$
;   Debug "Description = " + Description$
  
  ; Décryptage
  Name$ = Txt_decrypt_bdd(#DataBase,0,Bits)
  Description$ = Txt_decrypt_bdd(#DataBase,1,Bits)
  Debug "■ DEBUG Resultat aprés décryptage"
  Debug "Name         =  " + Name$
  Debug "Description  = " + Description$
Wend
FinishDatabaseQuery(#DataBase)
CloseDatabase(#DataBase)

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
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Problème cryptage données dans sqlite

Message par falsam »

Bonjour Yves. C'est une autre façon de faire et qui a le mérite de pouvoir crypter en AES-256. Merci.
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
CaptainCrunch
Messages : 52
Inscription : dim. 29/juin/2014 6:32

Re: Problème cryptage données dans sqlite

Message par CaptainCrunch »

Code : Tout sélectionner

EnableExplicit

UseSQLiteDatabase("sqlcipher.dll")

Enumeration
  #ID_DATABASE = 0
EndEnumeration

Procedure.l SqlCipher_ReqExec(Req.s)
  Protected Ret.l
  Ret = DatabaseUpdate(#ID_DATABASE, Req)
  If Ret = 0
    Debug DatabaseError()
  EndIf
  FinishDatabaseQuery(#ID_DATABASE)
  ProcedureReturn Ret
endProcedure

Procedure.l SqlCipher_IsEncrypted_Test(Fichier.s)
  Protected ligne.s
  Protected a.l, Ret.l
    
  Enumeration
    #ID_FICHIER
  EndEnumeration
  
  If ReadFile(#ID_FICHIER, Fichier)
    ligne = "" :  a = 0
    While a <> 100
      a + 1
      ligne + ReadString(#ID_FICHIER)
    Wend
    If FindString(ligne,"SQLite format 3") = 0
      Ret = 1
    Else
      Ret = 0
    EndIf
    CloseFile(#ID_FICHIER)
  Else
    Ret = 0
  EndIf
ProcedureReturn Ret
endProcedure

Procedure.l SqlCipher_IsEncrypted(In.s)
  Protected Repertoire.s
  Protected Dim Fichier.s(1)
  Protected Ret.l
    
  Fichier(1) = GetCurrentDirectory() + In
    
  If SqlCipher_IsEncrypted_Test(Fichier(1)) = 1
    Ret = 1
  Else
    Ret = 0
  EndIf
  
  ProcedureReturn Ret  
         
EndProcedure

Procedure.l SqlCipher_IsPassword()
  
  If SqlCipher_ReqExec("SELECT count(*) FROM sqlite_master")
    ProcedureReturn 1
  Else
    ProcedureReturn 0
  EndIf
  
EndProcedure
 
Procedure.l SqlCipher_ChangePassword(In.s, Old_Key.s, New_Key.s)
  Protected Dim Req.s(2)
  Protected x.l, Ret.l
  
  Req(1) = "PRAGMA key = '"   + Old_Key + "';"
  Req(2) = "PRAGMA rekey = '" + New_Key + "';"
  
  If SqlCipher_IsEncrypted(In)
    SqlCipher_ReqExec(Req(1))
    If SqlCipher_IsPassword()
      SqlCipher_ReqExec(Req(2))
      Ret = 1
    Else
      Ret = 0
    EndIf
  Else
    Ret = -1 ; Base non cryptée
  EndIf
  
  ProcedureReturn Ret
EndProcedure

Procedure.l SqlCipher_Convert_Plain2Crypt(In.s, Out.s, Key.s)
  Protected Dim Req.s(3)
  Protected x.l, Ret.l
  
  Enumeration
    #ID_FILE_CRYPT
  EndEnumeration
  
  If FileSize(Out) > -1 : DeleteFile(Out) : EndIf
  
  If CreateFile(#ID_FILE_CRYPT, Out) : CloseFile(#ID_FILE_CRYPT) : EndIf
    
  Req(1) = "ATTACH DATABASE '" + Out + "' As encrypted KEY '" + Key + "'"
  Req(2) = "Select sqlcipher_export('encrypted');"
  Req(3) = "DETACH DATABASE encrypted;"
  
  For x = 1 To 3
    SqlCipher_ReqExec(Req(x))
  Next x
  
  Ret = 1
  ProcedureReturn Ret
EndProcedure

Procedure.l SqlCipher_Convert_Crypt2Plain(In.s, Out.s, Key.s)
  
   Protected Dim Req.s(4)
  Protected x.l, Ret.l
  
  Enumeration
    #ID_FILE_CRYPT
  EndEnumeration
  
  
  If SqlCipher_IsEncrypted(In) = 0
 
  If FileSize(Out) > -1 : DeleteFile(Out) : EndIf
  
  If CreateFile(#ID_FILE_CRYPT, Out) : CloseFile(#ID_FILE_CRYPT) : EndIf
    
  Req(1) = "PRAGMA key = '" + Key + "';"
  Req(2) = "ATTACH DATABASE '" + Out + "' As plaintext KEY ''"
  Req(3) = "Select sqlcipher_export('plaintext');"
  Req(4) = "DETACH DATABASE plaintext;"
  
  For x = 1 To 4
    Select x
      Case 1
        SqlCipher_ReqExec(Req(x))
        If SqlCipher_IsPassword() = 0
          Ret = -1
          CloseDatabase(#ID_DATABASE)
          ProcedureReturn Ret
        EndIf
      Case 2, 3, 4 : SqlCipher_ReqExec(Req(x))
    EndSelect
  Next x
  Ret = 1
 Else
   Ret = 0
 EndIf
ProcedureReturn Ret
EndProcedure

Define DB.s

DB = "CTS_Tools_Suite.db"

OpenDatabase(#ID_DATABASE, DB, "", "",#PB_Database_SQLite)

Select SqlCipher_IsEncrypted(DB)
  Case #False
    SqlCipher_Convert_Plain2Crypt(DB,"CTS_CRYPT.db","test")
    Debug SqlCipher_IsEncrypted("CTS_CRYPT.db");
EndSelect 

;EndIf

CloseDatabase(#ID_DATABASE)
Répondre