Cryptage/Decryptage des données - optimisation de macro
Hello tous,
Je cherche a mettre en place sur un de mes classeurs excel un cryptage d'une base de donnée.
Cette base de donnée servant dans des calculs ou des recherches sur d'autre feuille du classeur, il est necessaire de pouvoir lever le cryptage en début de calcul/recherche et de la remettre ensuite.
N'étant pas un expert en vba, j'ai cherché un peut sur le net s'il existanti deja qqch et je suis tombé sur cette page.
Ce code permet un cryptage/decryptage manuel avec parametrage en direct via des imputbox. J'ai donc cherché a adapté ce code afin qu'il fasse le crypatage ou le decryptage sans avoir besoin des imputbox. Voila ce que j'obtiens.
Je viens vous consulter car je suis sûr qu'il est possible d'optimiser ce code pour pouvoir l'appliquer a un range au cas par cas selon les besoins et fusionner EncyptionAuto et DecryptionAuto en 1 seul macro et c'est la que je bloque.
Sur la théorie, je pense a deux possible approches :
- Fait une macro type Sub Encryption (ByVal xRet as Variant, ByVal xRg as Range) qui permettrait d'apeller la macro de cryptage en mode cryptage ou decryptage (xRet = 1 ou 2) sur une plage donnée ().
- Passer par un boolean genre Sub Encryption (byVal i as boolean, ByVal xRg as Range) qui permettrait d'apeller la macro de cryptage en mode cryptage ou decryptage (cryptage (i=true) ou decryptage (i=false)) sur une plage donnée (xRg).
La ou je bloque c'est comment reformuler tout ça et c'est la que j'aurais besoin de vos conseils et éventuellement de votre aide pour apprendre a le faire (les booleans, je maitrise pas du tout du tout).
Peut etre que je fais fausse route et qu'il y a plus facile ou mieux et dans ce cas n'hésitez pas a me le dire.
Je vous remercie par avance
Bastien
ps : comme je vous l'ai dit, je suis pas un expert en excel (j'apprends et je me perfectionne mais il ya encore du chemin) et je me suis basé sur un code deja existant. Pour être honnete, je ne comprends pas les deux Private Function. Comme j'aime apprendre et progresser, si quelqu'un veut bien me les expliquer et ce qu'elles font, ça serait super sympas. Pour ne pas trop encombrer ce post, cela peut se faire en MP si vous le préférez.
Option Explicit
Sub EncryptionAuto()
Dim xRg As Range
Dim xPsd As String
Dim xTxt As String
Dim xEnc As Boolean
Dim xRet As Variant
Dim xCell As Range
On Error Resume Next
'plage de cellule à encrypter
Set xRg = Sheets("Database").Range("Tableau1[#All]")
'Password de cryptage
xPsd = "test"
'definition du mode cryptage
xRet = 1
If TypeName(xRet) = "Boolean" Then Exit Sub
If xRet > 0 Then
xEnc = (xRet Mod 2 = 1)
For Each xCell In xRg
If xCell.Value <> "" Then
xCell.Value = Encryption(xPsd, xCell.Value, xEnc)
End If
Next
End If
End Sub
Sub DecryptionAuto()
Dim xRg As Range
Dim xPsd As String
Dim xTxt As String
Dim xEnc As Boolean
Dim xRet As Variant
Dim xCell As Range
On Error Resume Next
'plage de cellule a decrypter
Set xRg = Sheets("Database").Range("Tableau1[#All]")
'Password de cryptage
xPsd = "test"
'definition du mode decryptage
xRet = 2
If TypeName(xRet) = "Boolean" Then Exit Sub
If xRet > 0 Then
xEnc = (xRet Mod 2 = 1)
For Each xCell In xRg
If xCell.Value <> "" Then
xCell.Value = Encryption(xPsd, xCell.Value, xEnc)
End If
Next
End If
End Sub
Private Function StrToPsd(ByVal Txt As String) As Long
'UpdatebyKutoolsforExcel20151225
Dim xVal As Long
Dim xCh As Long
Dim xSft1 As Long
Dim xSft2 As Long
Dim i As Integer
Dim xLen As Integer
xLen = Len(Txt)
For i = 1 To xLen
xCh = Asc(Mid$(Txt, i, 1))
xVal = xVal Xor (xCh * 2 ^ xSft1)
xVal = xVal Xor (xCh * 2 ^ xSft2)
xSft1 = (xSft1 + 7) Mod 19
xSft2 = (xSft2 + 13) Mod 23
Next i
StrToPsd = xVal
End Function
Private Function Encryption(ByVal Psd As String, ByVal InTxt As String, Optional ByVal Enc As Boolean = True) As String
Dim xOffset As Long
Dim xLen As Integer
Dim i As Integer
Dim xCh As Integer
Dim xOutTxt As String
xOffset = StrToPsd(Psd)
Rnd -1
Randomize xOffset
xLen = Len(InTxt)
For i = 1 To xLen
xCh = Asc(Mid$(InTxt, i, 1))
If xCh >= 32 And xCh <= 126 Then
xCh = xCh - 32
xOffset = Int((96) * Rnd)
If Enc Then
xCh = ((xCh + xOffset) Mod 95)
Else
xCh = ((xCh - xOffset) Mod 95)
If xCh < 0 Then xCh = xCh + 95
End If
xCh = xCh + 32
xOutTxt = xOutTxt & Chr$(xCh)
End If
Next i
Encryption = xOutTxt
End FunctionBonjour,
je n e connais pas ce code (et heureusement, ceci voudrait dire que je connais tout !).
Par contre j'en ai trouvé un qui utilise une fonction personnalisée et il est basé sur le cryptage César et Freissner (je crois).
Le résultat ? Pour une même donnée, un codage différent !
Il y a un moment je m'en étais servi pour crypter les question d'un QCM, comme cela si un petit malin réussissez à afficher la feuille des questions il se retrouvait devant des cellules ne voulant rien dire !
Par contre le USF qui afficher les questions réponse, décrypter les données avant de les afficher (fort heureusement !
Le fichier :
@ bientôt
LouReeD
Hello LooReeD,
Jevais regardé ton code, merci
Bastien
Hello tous,
J'ai continuer a travailler dessus
J'ai deux méthode au final
Methode 1 : ce que j'ai developpé (même si le code est optimisable, il est fonctionnel) ci-dessus qui a le mértite d'etre rapide d'execution mais en effet, le text initiallement identique, est crypter de la même façon
Methode 2 : celle de LooReeD que j'ai customiser pour l'adapter a mon besoin (en esperant que je l'ai fait correctement) qui a le mérite de crypter de façon différente le texte initiallement identique mais qui est plus lente d'execution et qui risque de ralentir mon system.
Je vous met en pj un fichier excel de comparaisona vec les deux méthodes.
ctrl+alt+A declenche la méthode 1
ctrl+alt+B déclenche la méthode 2
Pensez vous que la méthode 2 est optimisable pour diminuer son temps d'execution?
Pensez vous que la méthode 1 est optimisable pour permettre un cryptage différent des texte identique initialement?
Je vous remercie tous par avance pour votre aide
Bastien
Première chose, rendons à César ce qui est à César !
Ce n'est pas mon code, n'y celui de César (je ne pense pas que le VBA existait à l'époque !), mais cela vient de son époque et de son entourage.
Pour ce qui est du code je ne me rappelle plus où je l'ai trouvé, sur le NET, mais où ?
Deuxième chose : Le code fourni est fait sur une "boucle" avec un nombre d'itération "prédéfini" ici :
Const Itérations As Variant = 223 'Nombre maximum d'itérations majorB-1
puis plus loin :
'Boucler en fonction du nombre de rotations attendues
For Itération = 1 To Itérations
Pour accélérer le processus alors peut-être suffit-il de diminuer cette valeur.
@ bientôt
LouReeD
Après quelques tests je me trouve aux alentours de 1.5 seconde pour le César avec des codes "différents" et une valeur d'itération de 50, et 0.49 pour l'autre code où visuellement on se doute de la répétition des données...
Je sais que c'est une base test, mais tout dépend du niveau de sécurité voulu, bien qu'en VBA il n'y en ait pas beaucoup !
Moi je reste sur César jumelé avec Vigenère.
@ bientôt
LouReeD
Hello
Ma base de donnée réel ressemble à celle ci sauf que j’ai anonymisé les data.
Je vais continuer les test. C’est vrai que ton approche est sympas d’un point de vue brouillage :-)
Dans ton approche, tu appliques deux codages successif si j’ai bien compris. Est ce le vigere ou le cesar qui fais que le codage est différent avec le même mot de départ?
En fait j’ai des opérations d’extraction pour alimenter des listes déroulantes. Cela permet d’identifier une ligne de la base de donnée et d’en extraire les data correspondant pour consultation.
J’ai peur que si je lève le criptage et remet le criptage à chaque alimentation de liste déroulante et à l’extraction, cela alourdisse grandement le processus de recherche...
Si qqn a une autre idée, ça peut être intéressant à tester.
Merci par avance à tous pour votre aide
Bastien
Bonjour,
Les crypter sur la feuille pour une lecture "impossible" ok, mais travailler sous VBA avec...
Pourquoi ne pas creer un tableau VBA contenant votre base décryptée , travailler avec en mémoire, et à l'issue, tout recrypter pour un copier/coller dans la base ?
@ bientôt
LouReeD
Hello
Merci pour tes réponse
sEn fait, je pensais crypter la base de données puis obfusquer tout ou partie du code pour rendre sa compréhension (notamment des parties critiques) quasi impossible et ainsi éviter que des petits malins aillent décoder la base de données en analysant le code :-). ça me semble être une sécurisation assez bonne même si ce n’est jamais impossible à décoder :-)
Une option envisageable et intermédiaire serait de ne crypter la base de données qu'a l'ouverture et a la fermeture du fichier. A l'ouverture, j'ai mis quelques "sécurité" (en plus de la protection du classeur, des feuilles et du code VBA mais tout ça c'est crackage en 2 secondes). Les feuilles interfaces utilisateurs sont masqué (very hidden) et il faut accepté les macros pour y accéder. Si les macros son acceptée, le code vérifie le nom de domaine du pc et s'il n'est pas le bon, il ferme le fichier. Si a cela j'ajoute un cryptage de la base de données qui se lève a l'ouverture du fichier, après avoir validé le nom de domaine du pc et que j'obfusque mon code vba tout ou partie, je pense que c'est déjà bien sécurisé et qu'il faut vraiment en vouloir pour aller fouiller. SI je fais ça, je recrypterais la base de données automatiquement à la fermeture.
Je vais tester si ça ne ralentit pas trop l'usage du fichier.
Après quelques tests je me trouve aux alentours de 1.5 seconde pour le César avec des codes "différents" et une valeur d'itération de 50, et 0.49 pour l'autre code où visuellement on se doute de la répétition des données...
Je sais que c'est une base test, mais tout dépend du niveau de sécurité voulu, bien qu'en VBA il n'y en ait pas beaucoup !
Moi je reste sur César jumelé avec Vigenère.
@ bientôt
LouReeD
Hello
comment fais tu pour mesurer le temps d'execution du code?
Re
bon désolé, la réponse était très facilement accessible sur le net, hj'arais même pas du demander ...
Bonsoir,
je n'ai pas pris le temps de faire ce genre de test...
Le peu que j'ai fait fonctionnait... Maintenant si le code n'est pas assez consolidé, alors mieux vaut l'éviter. Moi je m'en servais dans un jeu de questions réponses sans avoir de problème mais surtout sans obligation "de perfection".
Prenez votre code qui semble plus "costaud".
@ bientôt
LouReeD
Hello LouReed
Après quelques réflexions, je repars sur ce message.
Bonjour,
Les crypter sur la feuille pour une lecture "impossible" ok, mais travailler sous VBA avec...
Pourquoi ne pas creer un tableau VBA contenant votre base décryptée , travailler avec en mémoire, et à l'issue, tout recrypter pour un copier/coller dans la base ?
@ bientôt
LouReeD
Qu'entendez vous par tableau VBA?
