CRYPTAGE ET DÉCRYPTAGE DE CHAÎNES ET DE FICHIERS [MODULE DE CLASSE]

cs_asimengo Messages postés 280 Date d'inscription jeudi 24 mars 2005 Statut Membre Dernière intervention 18 mars 2009 - 27 oct. 2008 à 11:13
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 - 10 janv. 2010 à 22:05
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/48299-cryptage-et-decryptage-de-chaines-et-de-fichiers-module-de-classe

PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
10 janv. 2010 à 22:05
maj, 3 fois rien, un CRYPTING était relevé lors du DECRYPTING d'un tableau de byte

j'utilise cette classe pour un autre projet, le résultat est satisfaisant ^^

je mettrai à jour si vous avez d'autres idées

++
cs_asimengo Messages postés 280 Date d'inscription jeudi 24 mars 2005 Statut Membre Dernière intervention 18 mars 2009
28 oct. 2008 à 15:26
@PCPT : Merci une fois de plus de la peine que tu t'es donné pour ma demande.

En définitive je pense que ta méthode "(dé)cryptage de tableau de byte" me suffirait largement, après le reste je manage suivant mes besoins.

En effet, il me suffit de passer à ta méthode "tableau" légèrement modifiée, le RS.getrow. En effet il me faudra les enregs en ligne et les champs en colonne. Pour avoir la structure des champs, il faudra passer aux 4 premières lignes respectivement les proprités champs Name, Type, DefinedSize, Attributes. J'aime bien toujours que mes composants soient autonomes.

Au décrytage, une lecture séquentielle permet de reconstituer aisément le RS, ou dans mon cas ma Classe de gestion dynamique des items.

Pour le clone du recordset, ci-dessous le code que j'utilise
'Copie les enregistrements de poRstSource dans poRstDestination
Public Function MakeCloneRecordset(ByVal poRstSource As ADODB.Recordset, ByRef poRstDestination As ADODB.Recordset, Optional ByVal pbIgnoreData As Boolean = False, Optional ByRef paMaxLenghtFields As Variant) As Boolean
On Error GoTo Err_MakeCloneRecordset
Dim oFld As ADODB.Field, vBookmark As Variant, bEvaluateMaxLenght As Boolean, lCpt As Long

Set poRstDestination = New ADODB.Recordset
With poRstDestination
.CursorLocation = adUseClient
.CursorType = adOpenDynamic
.LockType = adLockPessimistic
'Initialisation de la liste des champs
For Each oFld In poRstSource.Fields
.Fields.Append oFld.Name, oFld.Type, oFld.DefinedSize, oFld.Attributes
Next oFld
'Préparation du tableau pour la recupération de la taille max des champs
If Not IsMissing(paMaxLenghtFields) Then
bEvaluateMaxLenght = True
ReDim paMaxLenghtFields(1 To .Fields.Count) As Long
End If

'Ouverture du recordset pour remplissage
.Open
End With

If Not pbIgnoreData Then
'Remplissage du recordset
With poRstSource
'On peut aussi faire With poRstSource.Clone(adLockReadOnly), ainsi on ne s'embetera plus avec la gestion des bookmarks.
'Mais je me suis demandé si ce n'était pas du temps perdu cette méthode, temps de Clone.
'je ne me suis pas penché dessus pour voir les différences de vitesse.
If .RecordCount <> 0 Then
vBookmark = .Bookmark
.MoveFirst
Do While Not .EOF
poRstDestination.AddNew
For Each oFld In .Fields
lCpt = lCpt + 1
poRstDestination.Fields(oFld.Name).Value = oFld.Value
If bEvaluateMaxLenght And Not IsNull(oFld.Value) Then paMaxLenghtFields(lCpt) = MaxValues(paMaxLenghtFields(lCpt), Len(Str(oFld.Value)))
Next oFld
poRstDestination.Update
.MoveNext
Loop
.Bookmark = vBookmark
poRstDestination.MoveFirst
End If
End With
End If

MakeCloneRecordset = True

Exit_MakeCloneRecordset:
Exit Function

Err_MakeCloneRecordset:
MsgBox Err.Description
Resume Exit_MakeCloneRecordset
End Function

Merci encore.
A+
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
27 oct. 2008 à 20:03
après pas mal de tentatives, je n'arrive pas à faire un clone du RecordSet SANS qu'il ne soit lié à celui d'origine

j'ai mis à jour le projet (LA CLASSE RESTE LA MÊME), avec 2 routines qui peuvent plus ou moins correspondre à ta demande

mode dev => ta base est faite, tu lances ta routine et chaque RS (de ton choix, lié à une vue de table très logiquement) est alors crypté

mod utilisateur => chargement de la table portant le nom de la form, chargement (conversion donc) du RS en Collection, puis affichage dans les différents controls pour l'exemple

ce n'est pas tout à fait ta demande, mais vue ta question "dynamique" et le titre de ta dernière source, çà doit pas être si loin ;)

++
cs_asimengo Messages postés 280 Date d'inscription jeudi 24 mars 2005 Statut Membre Dernière intervention 18 mars 2009
27 oct. 2008 à 16:30
Oui en fait c'est bien d'un RS que je parle, peu importe que ce soit une table ou résultat de requête.

Ce n'est nullement pas dans le but de me faire une BD propriétaire.

En fait j'ai crée pour mon exploitation perso des composants permettant de piloter une appli entière depuis une base de données personnalisée. Cette base de données contient la structure de toutes les tables de la BD, les menus, les paramètres, la structure de tous les combos, la structure des formualaires, .... Ces composants creent dynamiquement les contrôles des formulaires en fonction des commandes. Aucun souci vitesse, on n'a même pas l'impression.

C'est cette base de données perso que je veux crypter question de protéger ma technique. En effet il suffit d'avoir ses composants et connaitre la structure de cette base de données perso pour me copier le Copyright.

Ta source m'intéresse effectivement pour crypter chaque table de ma bd perso (bd non relationnelle, je n'en ai pas besoin puisque c'est moi qui la fournit) et de pouvoir la mettre en mémoire, ce que je fais déjà en ce moment à la différence que la source n'est pas crypter et la technique non protégée.
Dans tous les cas je dois passer par là, mais s'il y'a déjà une source ready to use, c'est plutot mieux de démarrer sur des references qui marchent.

NB: Je suis uniquement intéressé par la méthode de Fichier crypter à mémoire. Donc d'une classe ayant les caractéristiques similaires d'un RS, mais avec juste en plus la propriété pour indiquer le chemin du fichier source et la code de cryptage.
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
27 oct. 2008 à 13:46
salut asimengo,

c'est faisable oui, mais je t'avoue ne pas voir le but réel...

si c'est pour crypter le contenu de certains champs ou tables, pour avoir au fanal une base cryptée, je comprends ok, mais ce n'est pas à la classe de le faire, c'est le dev qui applique la méthode là où il le veut

mais comme tu parles de fichiers, tu penses plus à exporter complètement un RS apparemment, et c'est là où je ne te suis plus...
un RS peut très bien être le résultat d'une requête, pas juste une table.
l'intérêt est déjà alors beaucoup plus limité.

mis à part les nombreux tests à effectuer (valeur vide, type BOOL, OLE, MEMO, etc...), çà me semble plus rapide et (dans ce cas) logique de simplement exporter le RS en txt (par sa méthode) et de crypter le résultat, non?

peux-tu apporter quelques précisions sur ton idée?
merci
cs_asimengo Messages postés 280 Date d'inscription jeudi 24 mars 2005 Statut Membre Dernière intervention 18 mars 2009
27 oct. 2008 à 11:13
super intéressant.

Je te fais une proposition si tu peux la trouver intéressante.
l'ajout de la méthode (dé)cryptage de recordset.
Pour le cryptage envoie en paramètres le ADODB.Recordset et pour le décryptage pareil retour d'un recordset (bien évidemment le résultat sera dans un paramètre Byref).

En fait tu traites déjà, disons 80% de ce cas avec les méthodes "(dé)cryptage de tableau de byte" vu que tu tiens compte de la dimension du tableau.
La seule différence pour le recordset sera dans le fichier de cryptage de sauvegarder à l'entête la définition des champs et pour le décryptage la reconstitution du recordset. Cette méthode sera d'autant plus intéressante que le décryptage se fait en mémoire.

Si tu faisais cette mise jour je suis preneur, je pense qu'il y'aurait pas mal d'application.
Rejoignez-nous