Menu principal:
Correction de l'examen du 09/12/2009 (Programmation système: Niveau Supérieur)
2. CRYPTAGE ET DECRYPTAGE
Nous avons déjà étudié le fonctionnement général du cryptage et du décryptage, on a dit que le principe repose sur deux conditions fondamentales: le type et le modèle. Si le type et/ou le modèle est mal défini, le résultat n'aboutira pas à l'objectif assigné. C'est pourquoi il est fortement recommandé de bien définir ces 2 éléments essentiels avant d'entamer la programmation.
a) Définir le type.
Je rappelle que le type de cryptage concerne l'objet à crypter. Nous devons donc identifier l'objet à crypter de la manière suivante:
Nom de l'objet=ObjectName()
Type de données=DataType()
Mode d'accès en lecture=AccessReadMode()
Mode d'accès en écriture=AccessWriteMode()
EXEMPLE: Supposons que l'objet à crypter est une base de données access nommée MaBase
Le type à définir est comme suit:
ObjectName() = "MaBase"
DataType()="MDB"
AccessReadMode()="SQL"
AccessWriteMode()="SQL"
J'ai choisi le mode d'accès (lecture/écriture) l'outil SQL mais vous pouvez choisir n'importe quel autre outil capable de lire ce type de base de données (mdb).
ATTENTION, si cette base de données nécessite un mot de passe, vous devez le connaître sinon vous avez la possiblité de le détecter grâce à la fonction suivante:
MotDePasse=GetPassWord(MaBase.mdb,false,0,PFF$,1)
Là aussi il est nécessaire de préciser un point très important. La fonction GetPassWord() n'existe nulle part car elle a été créée par Mekkisoft dans le seul but de permettre aux utilisateurs de pouvoir récupérer leur mot de passe en cas d'oubli de celui-ci. Donc, cette fonction ne sera pas disponible dans vos cours pour l'instant mais je vous dirais plus tard comment procéder pour récupérer un mot de passe sans pour autant passer par cette fonction privée. Pour l'instant, contentons-nous de comprendre le fonctionnement du cryptage-décryptage en supposant que la base de données ne nécessite pas de mot de passe. Le type étant défini, nous allons maintenant définir le modèle:
b) Définir le modèle.
Rappelons que le modèle est le processus logique de la manipulation de l'objet. Il est défini directement par le type de l'objet qui est, dans notre exemple, une base de données access, le modèle sera tout simplement composé par les actions suivantes:
Localiser le chemin de l'objet = GetObjectFolder()
Déverrouiller l'objet = UnLockObject()
Ouverture de l'objet = OpenObjectName()
Crypter l'objet= SetCryptedObject()
Verrouiller l'objet = LockObject()
Voilà, c'est terminé, nous allons maintenant appliquer ce code à notre exemple:
GetObjectFolder("MaBase.mdb")
UnLockObject("MaBase.mdb")
Result=OpenObjectName("MaBase.mdb",False,0,0,FF$)
if Result=0
SetCryptedObject(CurrentObject,1,0,0,chr(13),0,FF$,True)
else
MessageBox("Impossible d'accéder à l'objet" + OpenErrorNumber()+ "," + OpenErrorDescription())
Exit()
endif
LockObject(CurrentObject)
end;
Vous devez remarquer que, parfois j'utilise le nom de l'objet, parfois (CurrentObject), eh bien c'est pratiquement la même chose, vous avez le choix à condition que, quand vous utilisez CurrentObject, il faut être sûr que l'objet que vous avez ouvert est bien celui que vous voulez réellement manipuler. Le fait de déverrouiller un objet signifie que son nom n'est plus utile à répéter dans les instructions suivantes car il sera automatiquement transféré dans CurrentObject(), mais pour l'instant, il est préférable d'utiliser le nom de l'objet pour éviter les perturbations car il arrive parfois de travailler sur deux objets différents en même temps, donc, soyez vigilants.
En conclusion, nous avons maintenant deux objets présents sur notre PC:
- Une base de données nommée MaBase.mdb qui est une base de données access ordinaire (rien n'a été changé dans son contenu)
- Une base de données Cryptée nommée ... nommée comment déjà?? Ah oui j'ai oublié, il faut nommer votre objet crypté ! C'est très important! Avant l'instruction end (juste après LockObject), il faut ajouter cette instruction:
SetCryptedObjectName="MaBaseCryptée"
Eh voilà ! nous avons terminé ! Rappelons que nous avons crypté un objet qui est une base de données access, nous l'avons appelée "MaBaseCryptée", elle se trouve dans le même répertoire que la base à crypter car on n'a pas donné d'instruction de chemin de sauvegarde, jusqu'à présent (dans notre exemple), tous les résultats de notre travail se trouvent dans le même chemin que l'objet à crypter (par défaut). Mais nous pouvons choisir notre propre chemin dans lequel nous placerons notre objet crypté. Il suffira simplement d'ajouter cette instruction juste avant l'instruction (end)
SetObjectFolder ("c:\Cryptage\MaBaseCryptée")
Ce qui signifie que MaBaseCryptée se trouve maintenant dans le répertoire c:\Cryptage\
Mais que se passe t-il si ce répertoire n'existe pas? Eh oui, il faut tout prévoir dans la vie, surtout dans ce domaine car notre PC fait exactement ce qu'on lui demande de faire, c'est pourquoi, dans notre exemple, si ce répertoire n'existe pas, rien ne se passera, même pas l'affichage d'un message d'erreur, il s'en fout éperdument ! Il va chercher ce répertorie (c:\cryptage\), s'il n'existe pas, il passe à l'instruction qui suit, ce qui veut dire qu'il peut très bien NE PAS ENREGISTRER notre base cryptée là où on veut. Pour éviter ce genre de tracasserie, gérons nous même ces possibilités (pourquoi pas? puisque c'est possible..)
Avant de définir le répertoire de sauvegarde (c:\cryptage), nous devons savoir si ce répertoire existe, sinon il faut le créer d'abord. Voici comment procéder:
if getDirectoryName("c:\cryptage")
SetObjectFolder ("c:\Cryptage\MaBaseCryptée")
else
CreateDirectoryName("c:\cryptage")
SetObjectFolder ("c:\Cryptage\MaBaseCryptée")
endif
Ne me dites surtout pas que vous ne savez pas où placer ces instructions, car c'est tellement évident que je n'ai pas envie de vous le montrer, faites travailler un peu plus vos méninges, ne prenez pas l'habitude de vous apprendre tout absolument tout... Un programmeur doit savoir se débrouiller tout seul... bon..
OK, passons maintenant au décryptage. Nous allons travailler sur le même exemple utilisé pour le cryptage et nous allons essayer de décrypter cette base de données cryptée. Il me semble qu'il n'est pas nécessaire de répéter des étapes communes que nous avons étudiées jusqu'ici. Nous allons seulement ajouter le code qui permet de décrypter comme ceci:
1.On localise notre objet crypté
GetCryptedObjectName="MaBaseCryptée"
2.On déverrouille l'objet
UnLockObject(CurrentObject)
3.On ouvre l'objet crypté pour le décrypter
Result=OpenObjectName(CurrentObject,False,0,0,FF$)
if Result=0
SetDecryptedObject(CurrentObject,1,0,0,chr(13),0,FF$,True)
else
MessageBox("Impossible d'accéder à l'objet" + OpenErrorNumber()+ "," + OpenErrorDescription())
Exit()
endif
4.On verrouille l'objet décrypté
LockObject(CurrentObject)
5.On donne un nom à l'objet décrypté
SetDecryptedObjectName="MaBase.mdb"
6.On choisit le chemin de sauvegarde
if getDirectoryName("c:\MaBaseDecryptée")
SetObjectFolder ("c:\MaBaseDecryptée\MaBase.mdb")
else
CreateDirectoryName("c:\MaBaseDecryptée\")
SetObjectFolder ("c:\Cryptage\MaBase.mdb")
endif
end;
Je crois que c'est clair. On vient de faire seulement l'opération inverse. Notre base de données a été cryptée sous le nom MaBaseCryptée puis on l'a décryptée pour la rendre MaBase.mdb, il convient de signaler que les objets racines ne changent pas, c'est à dire que la base de données cryptée existe toujours, présente dans son répertoire d'origine, de même pour les objets décryptés.
Prochaine correction: décryptage des chaînes de télévision (La méthode DES)