Forum des développeurs  

Le forum de référence en programmation et développement. Articles, cours et tutoriels du débutant au chef de projet et DBA confirmé.
Précédent   Forum des développeurs > Hardware, Systèmes et Logiciels > Microsoft Office > Défis

Défis Ce forum est celui des défis et challenges Office. Prêts à relever le gant ? C'est parti !

Réponse
 
Outils de la discussion
Vieux 19/09/2008, 15h50   #1 (permalink)
Rédacteur/Modérateur
 
Avatar de Arkham46
 
Date d'inscription: septembre 2003
Localisation: Orléans
Messages: 2 675
Par défaut [OFFICE VBA] Ecrire une fonction de décryptage

Bonjour à tous,

Je vous propose aujourd'hui un petit défi : écrire une fonction de décryptage connaissant la fonction de cryptage.

Maxence HUBICHE nous livre une fonction de cryptage dans cet article :
Une petite fonction de cryptage en VBA

Le défi est d'écrire une fonction Decrypter inverse de la fonction Crypter.

Pour tester la fonction écrite, il suffit d'enchaîner les deux fonctions.
On doit retrouver la chaîne de caractères d'origine.
Par exemple, dans la fenêtre d'exécution :

Code :
? Decrypter(Crypter("Developpez.com défi décryptage 01234567890"))
Doit renvoyer le texte : Developpez.com défi décryptage 01234567890

Ceci est un "défi éclair", poster votre fonction dans cette discussion dès que vous avez la solution.
Je dévoilerai alors ma fonction à la suite.

A vos méninges!
__________________
-------------------------------------------------------------------------------------------------------------------------------------------
[ACCESS][EXCEL] Utilisez la librairie graphique gdiplus.dll (GDI+) avec le module de classe VBA clGdiPlus
[OFFICE] Utilisez la librairie graphique gdi32.dll (GDI) avec le module de classe VBA clGdi32

Le Blog de la rubrique Office (RSS 2.0, Atom 1.0)
Arkham46 est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 21/09/2008, 16h28   #2 (permalink)
Responsable MSOffice

 
Avatar de Maxence HUBICHE
 
Date d'inscription: juin 2002
Localisation: Argenteuil (95)
Messages: 3 586
Par défaut

J'ai le droit de jouer ? Dis ... J'ai le droit ?

__________________
MVP Office Systems - Access
Je ne réponds pas aux questions techniques par MP

surtout ne cliquez pas >>là<< je vous aurai prévenu !
Profil LinkedIn <=> Viadeo
Pour une formation de qualité : 1formaxion
Maxence HUBICHE est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 22/09/2008, 08h02   #3 (permalink)
Rédacteur/Modérateur
 
Avatar de Arkham46
 
Date d'inscription: septembre 2003
Localisation: Orléans
Messages: 2 675
Par défaut

Citation:
Envoyé par Maxence HUBICHE Voir le message
J'ai le droit de jouer ? Dis ... J'ai le droit ?

si personne d'autre ne trouve
__________________
-------------------------------------------------------------------------------------------------------------------------------------------
[ACCESS][EXCEL] Utilisez la librairie graphique gdiplus.dll (GDI+) avec le module de classe VBA clGdiPlus
[OFFICE] Utilisez la librairie graphique gdi32.dll (GDI) avec le module de classe VBA clGdi32

Le Blog de la rubrique Office (RSS 2.0, Atom 1.0)
Arkham46 est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 22/09/2008, 18h05   #4 (permalink)
Modérateur
 
Avatar de Cl@udius
 
Date d'inscription: février 2006
Localisation: Hautes-Pyrénées
Âge: 46
Messages: 3 303
Par défaut

Et moi le delphiste que je suis, y peux ?

Ça ce résume à 1 ligne de code dans les 2 boucles imbriquées.
__________________
Pour voir qu'il fait noir, on n'a pas besoin d'être une lumière (P. Geluck).
A la question technique que par MP tu m'enverras, la réponse aux oubliettes finira.
Cl@udius est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 23/09/2008, 10h11   #5 (permalink)
Rédacteur/Modérateur
 
Avatar de Arkham46
 
Date d'inscription: septembre 2003
Localisation: Orléans
Messages: 2 675
Par défaut

Citation:
Envoyé par Cl@udius Voir le message
Et moi le delphiste que je suis, y peux ?

Ça ce résume à 1 ligne de code dans les 2 boucles imbriquées.
Je ne vais pas faire mon rabat-joie et vous empêcher tous de jouer
__________________
-------------------------------------------------------------------------------------------------------------------------------------------
[ACCESS][EXCEL] Utilisez la librairie graphique gdiplus.dll (GDI+) avec le module de classe VBA clGdiPlus
[OFFICE] Utilisez la librairie graphique gdi32.dll (GDI) avec le module de classe VBA clGdi32

Le Blog de la rubrique Office (RSS 2.0, Atom 1.0)
Arkham46 est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 23/09/2008, 11h10   #6 (permalink)
Responsable MSOffice

 
Avatar de Maxence HUBICHE
 
Date d'inscription: juin 2002
Localisation: Argenteuil (95)
Messages: 3 586
Par défaut

Bon, allez... j'attends la fin de la semaine pour savoir si je peux gagner une sucette ou pas
__________________
MVP Office Systems - Access
Je ne réponds pas aux questions techniques par MP

surtout ne cliquez pas >>là<< je vous aurai prévenu !
Profil LinkedIn <=> Viadeo
Pour une formation de qualité : 1formaxion
Maxence HUBICHE est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 24/09/2008, 20h22   #7 (permalink)
Membre éprouvé
 
Date d'inscription: février 2007
Messages: 471
Par défaut

bonjour,

Voici ma fonction décryptage
Pas très propre mais bon c 'est pour le jeu

Code :
 
Function décryptage(ByVal chaîneAD2crypter As String)
Dim div
Dim lcompteur As Long
Dim mot_codé As String
Dim val_cod
Dim clef_ch
Dim asc_mot_codé
Dim lLongueur As Long
Dim ofset As Integer
Dim res
Dim sLettres    As String
Dim lBoucle     As Long
 
Const NBROTATIONSMAX    As Long = 26
Const CLEF   As String = "nbvfdszé""'(-è_ijhgfcKLKjhgyuilM^+)àçiu-('32azsDRtvBhujkoç_è6tre""zsXWqazerfcx<;:<?"
 
chaîneAD2crypter = Crypter(chaîneAD2crypter)
lLongueur = Len(chaîneAD2crypter)
sLettres = String(lLongueur, Chr(0))
For lBoucle = 1 To NBROTATIONSMAX
    For lcompteur = 1 To lLongueur
        clef_ch = Asc(Mid(CLEF, (lcompteur Mod Len(CLEF)) + 1, 1)) * lLongueur
        asc_mot_codé = Asc(Mid(chaîneAD2crypter, lcompteur, 1))
        div = clef_ch \ 256
        val_cod = (div * 256) + asc_mot_codé
            If val_cod < clef_ch Then
                ofset = 256
                    Else: ofset = 0
            End If
        res = val_cod + ofset - clef_ch
    Mid(sLettres, lcompteur, 1) = Chr(res)
    Next lcompteur
      chaîneAD2crypter = sLettres
Next lBoucle
décryptage = sLettres
 
End Function
 
 
patbou est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 25/09/2008, 19h16   #8 (permalink)
Rédacteur/Modérateur
 
Avatar de Arkham46
 
Date d'inscription: septembre 2003
Localisation: Orléans
Messages: 2 675
Par défaut



Citation:
Envoyé par patbou Voir le message
bonjour,

Voici ma fonction décryptage
Pas très propre mais bon c 'est pour le jeu

[...]
Bien joué !

Voilà donc ma fonction :
Code :
 
Public Function Decrypter(ByVal pChaine As String)
'---------------------------------------------------------------------------------------
' Procedure : Decrypter
' Créée le  : 25 juin 2008 18:51
' Auteur    : Thierry GASPERMENT
' Site      : http://arkham46.developpez.com
' Objet     : Decrypter la chaîne en fonction d'une clef et de la méthode
'               de Vigenère
'---------------------------------------------------------------------------------------
'
    Dim sLettres    As String
    Dim lCompteur   As Long
    Dim lLongueur   As Long
    Dim lBoucle     As Long
    Dim lLenValues  As Long
    Dim lPosition   As Long
    
    'Définition des constantes utiles pour la fonction (Clé et nombre d'itérations de la fonction maximum)
    Const CLEF              As String = "nbvfdszé""'(-è_ijhgfcKLKjhgyuilM^+)àçiu-('32azsDRtvBhujkoç_è6tre""zsXWqazerfcx<;:<?"
    Const NBROTATIONSMAX    As Long = 13
    
    'Définition de la longueur de la chaîne à crypter et de la chaîne de résultat
    lLongueur = Len(pChaine)
    sLettres = String(lLongueur, Chr(0))
    'Boucler en fonction du nombre de rotations attendues
    For lBoucle = 1 To NBROTATIONSMAX
        'boucler pour chaque caractère de la chaîne initiale
        For lCompteur = 1 To lLongueur
            Mid(sLettres, lCompteur, 1) = Chr((Asc(Mid(pChaine, lCompteur, 1)) + 256 - (Asc(Mid(CLEF, (lCompteur Mod Len(CLEF)) + 1, 1)) * lLongueur) Mod 256) Mod 256)
        Next
        'réaffecter la chaîne à crypter par le résultat trouvé pour pouvoir recommencer une itération
        pChaine = sLettres
    'Nouvelle itération
    Next
    'Renvoyer le résultat final
    Decrypter = sLettres
End Function
 
J'ai un peu galéré pour tout mettre dans une ligne

Encore bravo à patbou.

__________________
-------------------------------------------------------------------------------------------------------------------------------------------
[ACCESS][EXCEL] Utilisez la librairie graphique gdiplus.dll (GDI+) avec le module de classe VBA clGdiPlus
[OFFICE] Utilisez la librairie graphique gdi32.dll (GDI) avec le module de classe VBA clGdi32

Le Blog de la rubrique Office (RSS 2.0, Atom 1.0)
Arkham46 est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 25/09/2008, 19h20   #9 (permalink)
Modérateur
 
Avatar de Cl@udius
 
Date d'inscription: février 2006
Localisation: Hautes-Pyrénées
Âge: 46
Messages: 3 303
Par défaut

Et voilà pour ma part:
Code :
Function Decrypter(ByVal S As String)
    Dim I As Long, J As Long, L As Long
    
    Decrypter = S
    L = Len(S)
    For I = 1 To NBROTATIONSMAX
        For J = 1 To L
            Mid(Decrypter, J, 1) = Chr(((Asc(Mid(Decrypter, J, 1)) - (Asc(Mid(CLEF, J Mod Len(CLEF) + 1, 1)) * L) Mod 256) + 256) Mod 256)
        Next
    Next
End Function
@+
__________________
Pour voir qu'il fait noir, on n'a pas besoin d'être une lumière (P. Geluck).
A la question technique que par MP tu m'enverras, la réponse aux oubliettes finira.
Cl@udius est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 27/09/2008, 19h24   #10 (permalink)
Responsable MSOffice

 
Avatar de Maxence HUBICHE
 
Date d'inscription: juin 2002
Localisation: Argenteuil (95)
Messages: 3 586
Par défaut



bon, ben ... tant pis alors... avec trois réponses, je m'incline
Pour ma part, j'avais la même solution que cl@udius, mais avec la totalité du code autour et après avoir sorti les constantes de la procédure crypter pour en étendre la portée au module...
vàlà vàlà...

__________________
MVP Office Systems - Access
Je ne réponds pas aux questions techniques par MP

surtout ne cliquez pas >>là<< je vous aurai prévenu !
Profil LinkedIn <=> Viadeo
Pour une formation de qualité : 1formaxion
Maxence HUBICHE est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 07/10/2008, 09h02   #11 (permalink)
Rédacteur/Modérateur
 
Avatar de Arkham46
 
Date d'inscription: septembre 2003
Localisation: Orléans
Messages: 2 675
Par défaut

bravo et merci à vous

maintenant on sait décrypter la fonction de maxence
__________________
-------------------------------------------------------------------------------------------------------------------------------------------
[ACCESS][EXCEL] Utilisez la librairie graphique gdiplus.dll (GDI+) avec le module de classe VBA clGdiPlus
[OFFICE] Utilisez la librairie graphique gdi32.dll (GDI) avec le module de classe VBA clGdi32

Le Blog de la rubrique Office (RSS 2.0, Atom 1.0)
Arkham46 est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 17/11/2008, 20h23   #12 (permalink)
Candidat au titre de Membre du Club
 
Date d'inscription: août 2007
Messages: 20
Par défaut

Citation:
Pensez aussi que vous risquez deux choses qui pourraient faire planter votre programme
1. L'addition des 2 codes ASCII risque de dépasser la valeur 255, ce qui n'est pas acceptable, les valeurs de la table ASCII étant comprises entre 0 et 255. un moyen de passer outre cette limite sera d'utiliser le modulo (reste d'une division entière) par 256
2. La longueur de la chaîne à crypter pourrait être plus longue que votre clé, ce qui implique de retourner au début de la clé à chaque fois qu'on est arrivé à la fin. Encore une fois, le modulo par la longueur de la chaîne devrait nous permettre de nous en sortir.
Et aussi une troisième: Les codes des caractères inférieurs à 32 ne sont pas toujours utilisables sous MS-Office.

Par conséquent, un valeur cryptée à l'aide de la méthode de maxence ne peut pas être stockée dans une cellule pour être décryptée plus tard...

Mon défit à moi sera peut être de limiter l'alphabet utilisable aux caractères imprimables entre 32 et 255 dans la table ascii.

La seule chose, c'est comment faire ?... C'est mon défit... Je reviendrai que quand je saurais faire... Au revoir pour un bout de temps... ;D Content de vous avoir connu ...
JMPS.VBA est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 17/11/2008, 20h30   #13 (permalink)
Rédacteur/Modérateur
 
Avatar de Arkham46
 
Date d'inscription: septembre 2003
Localisation: Orléans
Messages: 2 675
Par défaut

Bjr,

Citation:
Envoyé par JMPS.VBA Voir le message
Mon défit à moi sera peut être de limiter l'alphabet utilisable aux caractères imprimables entre 32 et 255 dans la table ascii.
Voir ici :
http://www.developpez.net/forums/d36...ence-cryptees/
On peut définir les caractères utilisables.
__________________
-------------------------------------------------------------------------------------------------------------------------------------------
[ACCESS][EXCEL] Utilisez la librairie graphique gdiplus.dll (GDI+) avec le module de classe VBA clGdiPlus
[OFFICE] Utilisez la librairie graphique gdi32.dll (GDI) avec le module de classe VBA clGdi32

Le Blog de la rubrique Office (RSS 2.0, Atom 1.0)
Arkham46 est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 18/11/2008, 19h37   #14 (permalink)
Candidat au titre de Membre du Club
 
Date d'inscription: août 2007
Messages: 20
Par défaut

Citation:
Voir ici
C'est pas drôle !

Mais bon.... je suis faible.... alors j'y vais...

Mais je maintien que c'est pas drôle !

___________________
PS : Merci quand même
JMPS.VBA est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 18/11/2008, 22h58   #15 (permalink)
Candidat au titre de Membre du Club
 
Date d'inscription: août 2007
Messages: 20
Par défaut

Mon soucis c'est que je peux le faire avec une fonction de feuille de calcul, mais le code de Arkham46 est trop imbriqué pour mes petits neurones. je ne le comprends pas à ces heures tardives (même le matin j'aurais du mal de toute façon).
Un petit coup de main je veux bien.

dans une feuille de calcul je pose :

Colonne A = CODE(Caractère Clair) 'Obligatoirement >=32 et <=255
Colonne B = CODE(Caractère de la Clef) 'Obligatoirement >=32 et <=255
Colonne C = A1 + B1

Pour générer un caractère crypté compris entre 32 et 255:
Colonne D = MOD(C1;224)+32

Pour retrouver le caractère clair
Colonne E =MOD(((D1+224)-(MOD(B1;224)+32))-32;224)+32


Donc le code VBA devrait être : je ne le met pas entre balises de code exprès pour conserver la couleur des parenthèses et essayer de comprendre l'erreur dans les imbrications ....

Pour coder :
___________________________
Mid(sLettres, lCompteur, 1) =

Chr(((Asc(Mid(pChaine, lCompteur, 1)) + (Asc(Mid(CLEF, (lCompteur Mod Len(CLEF)) + 1, 1)) * lLongueur)) Mod 224) + 32)
___________________________
OUI, Ok, Ça fonctionne


Pour décoder :
___________________________
Mid(sLettres, lCompteur, 1) =

Chr(((((Asc(Mid(pChaine, lCompteur, 1)) + 224)- ((Asc(Mid(CLEF, (lCompteur Mod Len(CLEF)) + 1, 1)) * lLongueur) Mod 224)+32)-32) Mod 224)+32)
___________________________
NON, Ça ne fonctionne pas ....
Ça ne décode pas... Ça déconne plutôt... (Jeux de mots si vous permettez)

23h00 bientôt, je vais me coucher, demain travail...

_______________________________
NB j'ai testé le code du lien proposé par Arkham46 , mais ça ne me convient pas. 1) j'ai pas tout compris (ou rien compris), 2) je ne veux pas de caractères non imprimables (code ascii entre 1 et 31) car ils génèrent des erreurs au décryptage dans les cellules ou les contrôles de formulaires.
Le pire c'est que j'ai pas besoin de tout ça, c'est juste pour du codage en VBA...

Dernière modification par JMPS.VBA ; 18/11/2008 à 23h10
JMPS.VBA est déconnecté   Envoyer un message privé Réponse avec citation
NEWS ACCESSF.A.Q AccessF.A.Q VBATutorielsSourcesOutilsLivresAccess TVAccess 2007

Réponse

Précédent   Forum des développeurs > Hardware, Systèmes et Logiciels > Microsoft Office > Défis



Outils de la discussion

Règles de messages
Vous ne pouvez pas créer de nouvelles discussions
Vous ne pouvez pas envoyer des réponses
Vous ne pouvez pas envoyer des pièces jointes
Vous ne pouvez pas modifier vos messages

Les balises BB sont activées : oui
Les smileys sont activés : oui
La balise [IMG] est activée : oui
Le code HTML peut être employé : non
Trackbacks are non
Pingbacks are non
Refbacks are non
Navigation rapide