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 Function

Bonjour,

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 ! ) Après j'ai abandonné l'idée car je fourni les applications avec le code VBA ouvert...

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

120test-encrypt.xlsm (56.17 Ko)

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

s

En 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 ...

Re Re

Après plusieur essais, j'ai quelques erreurs qui se glisse au décodage (ici en E45) :-(

ça te fait ça aussi LouReeD?

image

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?

Rechercher des sujets similaires à "cryptage decryptage donnees optimisation macro"