Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

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


Information sur la source

Catégorie :Optimisation du code Classé sous : cryptage, décryptage, 128bits, alexandre pukall, afck Niveau : Débutant Date de création : 25/10/2008 Date de mise à jour : 27/10/2008 19:57:41 Vu / téléchargé: 2 628 / 370

Note :
Aucune note

Commentaire sur cette source (5)
Ajouter un commentaire et/ou une note


Description

Cliquez pour voir la capture en taille normale
Cette classe (VB6, importable pour VBA) vous donne un accès facile pour crypter et décrypter des données.


j'avais besoin assez rapidement d'un code fiable, aussi après recherches (pas la peine de ré-inventer la roue...) je suis tombé sur le code d'Alexandre PUKALL, à cette adresse : http://membres.lycos.fr/pc1/
Merci à lui pour ce partage

après tests, le résultat me convenait, mais pas les performances

j'ai donc remanié son code "libre" :
=> le codage d'un fichier est 2 fois plus rapide
=> le codage d'une chaîne est 21 fois plus rapide :p


la classe offre :
=> les évènements d'état de traitement
=> les méthodes pour :
   -> (dé)cryptage de string
   -> (dé)cryptage de tableau de byte
   -> (dé)cryptage de fichier (en mémoire)
   -> (dé)cryptage de fichiers volumineux (écriture en direct)
=> état de travail en cours et de succès de l'opération
 

Source

  • Sub Test()
  • Dim AfCipher As New AfCls_Cipher
  • With AfCipher
  • .Key = "blabla"
  • .DecryptString "pdfjijdolknhnmpeapnneeipoboockco"
  • If .Success Then MsgBox .Value
  • .CryptSmallFile App.Path & "\PrivateFile.zip", App.Path & "\CryptedFile.dat"
  • If .Success Then MsgBox .Value, , "Fichier crypté avec succès"
  • End With
  • Set AfCipher = Nothing
  • End Sub
Sub Test()
    Dim AfCipher As New AfCls_Cipher

    With AfCipher
        .Key = "blabla"
        .DecryptString "pdfjijdolknhnmpeapnneeipoboockco"
        If .Success Then MsgBox .Value
        
        .CryptSmallFile App.Path & "\PrivateFile.zip", App.Path & "\CryptedFile.dat"
        If .Success Then MsgBox .Value, , "Fichier crypté avec succès"
    End With
    
    Set AfCipher = Nothing
End Sub

Conclusion

** j'ai commenté également "au mieux" le fonctionnement du cryptage, les crédits reviennent à l'auteur de l'algo : Alexandre PUKALL


** si certains d'entre vous ont des repères de comparaison, tant en rapidité qu'en qualité, n'hésitez pas à en faire part ;)
 

Fichier Zip

Pour les "Membres Club", vous pouvez télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip

Historique

25 octobre 2008 06:42:38 :
.
27 octobre 2008 19:57:41 :
ajout d'un exemple ADO access à la demande d'Asimengo

Commentaires et avis

signaler à un administrateur
Commentaire de asimengo le 27/10/2008 11:13:09

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.

signaler à un administrateur
Commentaire de PCPT le 27/10/2008 13:46:44 administrateur CS

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

signaler à un administrateur
Commentaire de asimengo le 27/10/2008 16:30:48

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.

signaler à un administrateur
Commentaire de PCPT le 27/10/2008 20:03:35 administrateur CS

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 ;)

++

signaler à un administrateur
Commentaire de asimengo le 28/10/2008 15:26:48

@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+

Ajouter un commentaire

Discussions en rapport avec ce code source dans le forum

Aider-moi (cryptage-décryptage de texte) [ par Quiske ] Salut tlm j'ai un bleme je fais un programme pour crypter et decrypter du texte:j'ai une textbox et 2 bouton je voudrais que en entrant un truc zarb c CRYPTAGE [ par FREDM ] Je crypte actuellement des fichiers en applicant à chaque octet une clef XOR l'octet lu. Mon problème est qu'en C en prenant un bufer de 1024 le crypt Mot de passe et Cryptage [ par Gilou ] Bonjour, Soit une base Acces avec des users et mot de passe.Soit un formulaire d'envoi du user et mot de passe. Comment crypter le mot de passe à l'en Cryptage de fichiers executables [ par Clovis ] Salut! Voila mon pb, j'ai fait un logiciel de cyptage, il code bien les fichiers texte, mais quand on passe aux fichiers executables ou meme aux image décryptage d'un exe [ par gypsy ] bon alors ya pas trop de rapport avec VB, mais je voulais savoir si quelqu'un savait s'il existait des softs capable de décrypter les exe (quand t'as cryptage spécial ... [ par schouly ] Quelqu'un aurrait un code pour crypter une chaine de chiffre en lettre ...... et de manière très sure ...MerciSchouly Cryptage [ par Shimiar ] Salut, j'ai trouvé plusieur sources sur le cryptage et je comprend tout sauf une chose: quesque ça veut dire:Mid$(Form1.Text2.Text, Char, 1)(char c'es cryptage des pwls [ par NV ] J'aimerais avoir l'algorithme des pwls, si possible en C ou C++ mais si c'est en VB je me débrouillerais Merci d'avance.NV cryptage [ par horko ] a vrai dire j ai pas un enorme pb mais j aimerais bien pouvoir crypter un fichier et comme je suis un gros feneant, j aimerais savoir si certains d en protéger un email avec password ou cryptage ???????? [ par julian ] Je m'explique.....J'envoi un text RTF d'un PC en email et je le reçoit sur MAC.Je voudrai que l'email soit, ou protéger par un password pour pouvoir l


Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :

Comparez les prix Nouvelle version

Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,437 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.