[Source] Cryptage des données
La commande Options Sécurité Coder/Décoder une base de données ne protège pas les données. Elle permet simplement d'éviter la lecture de la bdd à partir d'un éditeur de textes. Toutes les données du fichier .MDB crypté de cette manière restent accessibles via le Jet Engine. D'autre part, il est très rare que toutes les données soient confidentielles. Il est par conséquent trop onéreux de protéger toutes les données en implémentant la sécurité au niveau du groupe de travail. Il faut donc appliquer une technique de cryptage personnalisée simple, permettant de protéger suffisamment bien les données confidentielles quelles soient numériques ou alphabétiques. Le niveau de protection assuré doit en somme donner beaucoup de difficultés à un pirate pour casser le code. La technique présentée ci-après ne nécessite pas une clé externe, susceptible d'être perdue, ce qui rendrait les données indéchiffrables.
Pour obtenir un code, qui ne peut pas être cassé par une analyse de fréquence d'apparition des caractères, il faut recourir à un algorithme qui autorise les substitutions multiples d'un caractère. A cet effet, on peut utiliser la rotation variable dont le principe est expliqué ci-après.
Dans ce cas, la valeur du 1er signe est augmentée d'une valeur N, celle du 2ème est augmentée de N-1, celle du 3ème de N-2 et ainsi de suite jusqu'à zéro. Puis on recommence à ajouter 1, 2, ……, N-2, N-1 et N.
Dans notre code N = 7.
Exemples: fonction pour crypter et son corollaire pour décrypter
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96
|
Option Compare Database
Option Explicit
Public Const CYCLE = 7
Public Function Coder(chaine As String) As String
Dim strTemp As String '*** contiendra la résultat du cryptage caractère par caractère.
Dim i As Long '*** compteur de caractères du texte à protéger
Dim q As Integer '*** stockage de la valeur ASCII
Dim pt As String * 1 '*** texte normal à protéger
Dim ct As String * 1 '*** texte chiffré
Dim z As Integer '*** valeur du cycle de rotation
Dim Step As Integer '*** pas d'incrémentation négatif ou positif
z = CYCLE
Step = -1
For i = 1 To Len(chaine)
pt = Mid(chaine, i, 1)
q = Asc(pt)
Select Case q
Case Asc("A") To Asc("Z") '***Majuscules
q = q + z
If q > Asc("Z") Then
q = 64 + (q - Asc("Z"))
End If
ct = Chr(q)
Case Asc("a") To Asc("z") '***Minuscules
q = q + z
If q > Asc("z") Then
q = 96 + (q - Asc("z"))
End If
ct = Chr(q)
Case Else
'***Ponctuation et chiffres:
ct = Chr(q + z)
End Select
z = z + Step
If z < 0 Then '***Démarre l'incrémentation positive
z = 1
Step = 1
End If
If z > CYCLE Then '***Démarre l'incrémentation négative
z = CYCLE - 1
Step = -1
End If
strTemp = strTemp & ct
Next i
Coder = strTemp
End Function
Public Function DeCoder(chaine As String) As String
Dim strTemp As String
Dim i As Long
Dim ct As String * 1 '*** texte chiffré
Dim pt As String * 1 '*** texte normal
Dim q As Integer
Dim z As Integer
Dim Step As Integer
z = CYCLE
Step = -1
For i = 1 To Len(chaine)
ct = Mid(chaine, i, 1)
q = Asc(ct)
Select Case q
Case Asc("A") To Asc("Z")
'***Majuscules
q = q - z
If q < Asc("A") Then
q = Asc("Z") - (64 - q)
End If
strTemp = strTemp & Chr(q)
Case Asc("a") To Asc("z")
'***Minuscules
q = q - z
If q < Asc("a") Then
q = Asc("z") - (96 - q)
End If
strTemp = strTemp & Chr(q)
Case Else
'***Ponctuation et chiffres:
strTemp = strTemp & Chr(q - z)
End Select
z = z + Step
If z < 0 Then
z = 1
Step = 1
End If
If z > CYCLE Then
z = CYCLE - 1
Step = -1
End If
Next i
DeCoder = strTemp
End Function |
Bien entendu on peut aussi changer le pas d'incrément. On pourrait aussi renoncer à crypter tous les caractères, mais seulement 4 sur 5 par exemple..