Bibm@th

Forum de mathématiques - Bibm@th.net

Bienvenue dans les forums du site BibM@th, des forums où on dit Bonjour (Bonsoir), Merci, S'il vous plaît...

Vous n'êtes pas identifié(e).

#1 11-05-2009 16:00:22

Genki
Invité

[Visual Basic] Algorithme de Cesar

Bonjour,

Voila pour un cours d'algorithme, j'ai un projet à rendre qui repose sur l'algorithme de Cesar =)

Si vous avez vu Da Vinci Code, la méthode est employer avec le Cryptex

Voici mon TP (je réalise seulement la partie informatique sur VB)

http://www.acyrin.com/sujet-projet-09-cesar.PDF

Je sais à peine par ou commencer, sachant que mon TP se fait à l'aide de Visual Basic Express.
Merci

#2 11-05-2009 17:18:24

yoshi
Modo Ferox
Inscription : 20-11-2005
Messages : 16 947

Re : [Visual Basic] Algorithme de Cesar

Bonjour,

Je ne connais pas le Visual Basic mais j'ai déjà programmé en BASICs (Basic GFA, QuickBASIc, TurboBasic et Basic Amstrad) et j'ai mis en ligne un script de codage et de décodage en Python dans ce Forum...
La méthode qui t'es imposée revient au même que la mienne, même si je la trouve un poil plus complexe...

Bon, donc il me faut savoir si en VB (et quels sont les mots-clé) on peut
- Afficher une lettre à partir de son code ASCII en principe CHR$ (chr tout court en Python):  print chr$(65) --> A
- Trouver le code ASCII d'une lettre, en principe ASC :  print ASC("H") --> 72 (print ord("A") en Python)

Soit à coder "ALGORITHME DE CESAR"
1. Je stocke cette "phrase dans une chaîne de caractères" par exemple acoder$="ALGORITHME DE CESAR"
2. Je détermine le decalage : decalage = 12, par exemple.
3. Je détermine la longueur de la "phrase" : longueur=LEN(acoder$)
4. Je crée un tableau Talpha, par exemple, de dimension 26 que je remplis ainsi :
Talpha[0]="A"
Talpha[1]="B"
.........................
Talpha[25]="Z"

4. Je crée une boucle de la longueur voulue :
FOR i =0 TO longueur
5. Maintenant, il faut extraire lettre par lettre, prendre le code ASCII de la lettre et s'il est différent de 32 (l'espace) lui enlever 64, on obtient ainsi le rang de la lettre dans l'alphabet...
Donc tu dois utilise l'instruction MID (dans les autres BASIC, c'était MID$).
Si tu fais :

FOR i = 0 TO longueur
lettre$=MID(acoder$,i,1)
rang = ASC(lettre$)-65
print rang;
NEXT

Tu vas obtenir : 0 11 6 14 17 8 19 7 12 4 -33 3 4 -33 2 4 18 0 17
ok ?
Maintenant, il te faut ajouter le décalage (cette histoire de décalage à gauche ou à droite est peu bofbof ; décaler de -2, c'est la même chose que décaler de + 24.

Si tu fais alors :
FOR i = 1 TO longueur
lettre$=MID(acoder$,i,1)

print rang+12;
NEXT

tu obtiens : 12 23 18 26 29 20 31 19 24 16 -21 15 16 -21 14 16 30 12 29
Et comme aucun rang ne doit dépasser 26, il te faut calculer le reste avec mod (modulo) 26...


Donc
* créer une chaine vide motchiffre$ (si pas besoin de $ tu t'adaptes !)
* lancer la boucle
* extraire le caractère en position i,
* Si caractère = " " (espace) alors motchiffre = motchiffre+ " "
* sinon rang = ASC(lettre$)-65 et rangch=(rang+12)modulo 26, puis motchiffre=motchiffre+Talpha[rangch]
* fin de boucle
* afficher le résultat

Ca doit marcher,

Je vérifie en traduisant en Python...
C'est bon !

Résultat (avec déclage de 12) : MXSADUFTYQ PQ OQEMD


@+


Arx Tarpeia Capitoli proxima...

Hors ligne

#3 11-05-2009 19:04:11

Genki
Invité

Re : [Visual Basic] Algorithme de Cesar

Ouah ! Pas mal ! Sa va bien m'aider ça.

Pour te répondre, notre prof nous interdit d'utiliser leur valeur ASCII =(
Mais on a le droit de donner une valeur numérique à chaque lettre

A => 1
B => 2
x => n
Z => 26

#4 11-05-2009 19:17:35

yoshi
Modo Ferox
Inscription : 20-11-2005
Messages : 16 947

Re : [Visual Basic] Algorithme de Cesar

Salut,

Pour te répondre, notre prof nous interdit d'utiliser leur valeur ASCII =(

Peux-tu préciser ?
Tu n'as pas le droit d'extraire la valeur ASCII d'une lettre ? C'est ça ? Boufre ! Ca c'est ch...
En Python, aucun pb on a les dictionnaires, mais je ne connais pas le VBE  (je me documente), il faut donc trouver une astuce pour savoir que la lettre A correspond au n° défini (l'inverse de ton tableau Talpha, quoi).
Je vais rejeter un oeil sur ton lien, donc...

@+

[EDIT]
Il n'est pas précisé que le code ASCII est interdit sur les pages en lien...


Arx Tarpeia Capitoli proxima...

Hors ligne

#5 12-05-2009 01:24:56

Genki
Invité

Re : [Visual Basic] Algorithme de Cesar

En effet, ce n'est pas écrit, en revanche c'est un détail qui a été dit oralement =/
Mais c'est difficile de faire ce que j'ai dit ?

A = 1
B = 2
etc...

?

Ensuite on chance la valeur de chaque lettre (+le décalage) et on les affiche à nouveaux

nan ?

#6 12-05-2009 07:42:54

yoshi
Modo Ferox
Inscription : 20-11-2005
Messages : 16 947

Re : [Visual Basic] Algorithme de Cesar

Bonjour,

Oui, ce n'est pas simple si ce n'est pas prévu...
Pourquoi ?
Un tableau est géré par des indices numériques, ainsi si tu demandes Talpha[2] tu obtiens C..
Mais on peut pas gérer un tableau via des lettres, sauf en Python où  tu peux construire un "dictionnaire" de telle façon que Dico["C"] te renvoie 2...
En VB, je l'ignore...

De toutes façons, j'ai trouvé un moyen de contourner la difficulté.
Donc :
Puisque la fonction INSTR existe en QuickBaic, en TurboBasic et en Basic Amstrad, il n'y a aucune raison qu'en VB cette fonction INSTR n'existe pas...
Elle marche comme ça : INSTR("GINGEMBRE","M") donne 5. Vérification si tu demandes MID("GINGEMBRE",5,1) tu obtiens bien M...
Donc, si ça existe, je crée une variable chaîne Alphabet$ :
Alphabet$="ABCDEFGHIJKLMNOPQRSTUVWXYZ"
Et dès que tu as récupéré la lettre et testé que ce n'est pas une espace (donc dans la partie ELSE), tu obtiens le rang de ta lettre, non plus par rang=ASC(lettre$)-65, mais par rang=InStr(Alphabet$,lettre$)
Après, on continue comme indiqué.

Alors où en es-tu ? Tu avances j'espère parce que le temps presse !

[EDIT] Je viens de Chercher sur Google : la réponse est oui, cette fonction existe... alors au boulot !

@+

PS
Lorsque tu auras écrit ton prg et qu'il marchera, puisque tu dois faire des commentaires, tu pourras leur expliquer qu'on peut se passer d'écrire rangch=(rang+decalage)Mod 26...
Il suffit d'utiliser un 2e tableau TalphaX2 qui va contenir 52 lettres A, B....Z, A, B....Z, ainsi tu seras sûr de tomber sur la bonne lettre rangch=rang+decalage puis TalphaX2[rangch]. Quant aux décalages gauche/ou droite, c'est facile à gérer :
* pour gauche on prend une boucle qui va de 26 à la fin
* pour droite on va de 0 à 25 (ou 26 ça dépend du VB en Python pour décrire 26 itértations de 0 à 25, il faut donner un indice de fin de 26 et non 25).

PS2
Apparemment, après recherche, la boucle For/Next  fonctionne comme dans les BASICs que je connais.
Donc ce n'est plus Longueur=len(Acoder$), mais Longueur=len(Acoder$)-1, puisque la boucle démarre de 0 :
For i = 0 To Longueur

Donc tu commences par déclarer Alphabet$="ABCDEFGHIJKLMNOPQRSTUVWXYZ"
Avec une première boucle, tu remplis Talpha :
For i = 0 To 25
Talpha[i]=Mid(Alphabet$,i,1)
Next i
Tu déclares ensuite PhraseCodee$="" et Acoder$="AVE CESAR MORITURI TE SALUTANT"
Puis Longueur=len(Acoder$)-1
Et enfin tu lances ta 2e boucle :
For i = 0 To Longueur
     lettre$=Mid(Acoder$,i,1)
    If...
         ...
    Else....
         ....
         ....
         ....
Next i

Et écriture du résultat obtenu PhraseCodée$

PS3
Je viens de simuler en Python les instructions que je t'ai données, sauf le InStr qui n'existe pas (mais je l'ai remplacé par son équivalent : find), ça colle :

                     Phrase à coder :
AVE CESAR MORITURI TE SALUTANT

        Phrase codée avec un décalage de 12 :
MHQ OQEMD YADUFGDU FQ EMXGFMZF

Dernière modification par yoshi (12-05-2009 18:44:14)


Arx Tarpeia Capitoli proxima...

Hors ligne

#7 17-05-2009 10:44:10

yoshi
Modo Ferox
Inscription : 20-11-2005
Messages : 16 947

Re : [Visual Basic] Algorithme de Cesar

Bonjour,

Notre ami Genki n'ayant pas redonné signe de vie, probablement  terrassé par les légions de Jules Cesar, n'a donc peut-être pas pu, lui, franchir son Rubicon...
Pour ceux que ça intéresse, voici donc, brut de décoffrage (non testé : je n'ai pas VB, mais je serais surpris qu'il ne fonctionne pas) : le petit script VB de codage selon l'algorithme de Cesar :

Dim Alphabet, PhraseEnClair, PhraseCodee,  Caractere As String
Dim decalage, rang, rangch, i, Longueur As Integer
Dim Talpha(26) As String

Alphabet= "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
For i = 0 To  25
    Talpha(i) = Mid(Alphabet,i,1)
Next i

PhraseEnClair = "AVE CESAR MORITURI TE SALUTANT"
PhraseCodee = ""
Longueur = Len(PhraseEnClair)-1
decalage = 12

For i = 0 To Longueur
    caractere = Mid(PhraseEnClair,i,1)
    If caractere = " " Then
        PhraseCodee = PhraseCodee + " "
    Else
        rang = InStr(1,Alphabet,caractere)
        rangch = (rang + decalage) Mod 26
        PhraseCodee = PhraseCodee + Talpha(rangch)
Next i

MsgBox(PhraseCodee)

Réactions ?

@+


Arx Tarpeia Capitoli proxima...

Hors ligne

#8 17-05-2009 19:40:54

Lutcho74
Membre
Lieu : Vitrolles
Inscription : 22-12-2008
Messages : 136
Site Web

Re : [Visual Basic] Algorithme de Cesar

Lu,

Désolé mais j'ai une question qui n'a aucun rapport direct avec le code :
    -qu'est ce qu'un "Rubicon"
Et sinon pour le code il est facilement compréhensible sauf je comprend pas trop dans les Dim les "As" après une variable à quoi servent-ils(serai-ce pour dire quelle style de variable elle est?), et "Talpha(26)" à quoi servent les parenthèses et le 26(je pense que c'est les lettre de l'alphabet mais je ne comprend pas le fonctionnement...)???

@+


La seule façon raisonnable de vivre en ce bas monde, c'est en dehors des règles.

Hors ligne

#9 17-05-2009 19:59:20

Barbichu
Membre actif
Inscription : 15-12-2007
Messages : 405

Re : [Visual Basic] Algorithme de Cesar

Lut,
http://fr.wikipedia.org/wiki/Rubicon
La première section de l'article devrait te permettre de tout comprendre.
++


Barbichu

Hors ligne

#10 17-05-2009 20:15:55

yoshi
Modo Ferox
Inscription : 20-11-2005
Messages : 16 947

Re : [Visual Basic] Algorithme de Cesar

Hey Lutcho,

C'est un peu comme en Basic Panoramic : il faut déclarer le type des tableaux (et leur taille), et des variables...
Integer : nombre entier relatif
String : qui contient des caractères non numériques...

Ce travail était un exercice imposé, regarde ici les conditions imposées à Genki :
http://www.acyrin.com/sujet-projet-09-cesar.PDF,
on y parle notamment de ce Talpha qui t'intrigue...
Pour moi, Talpha = contraction de Tableau+Alphabet...

@+


Arx Tarpeia Capitoli proxima...

Hors ligne

#11 18-05-2009 14:34:14

yoshi
Modo Ferox
Inscription : 20-11-2005
Messages : 16 947

Re : [Visual Basic] Algorithme de Cesar

Bonjour,

Voilà la variante Python de l'algo de cryptage de Cesar, avec la même problématique et en collant au plus près du script Visual Basic :

#!/usr/bin/python
# -*- coding: Latin-1 -*-

A_Coder="AVE CESAR MORITURI TE SALUTANT"
Alphabet="ABCDEFGHIJKLMNOPQRSTUVWXYZ"
decalage = 12
Phrase_Codee=""
Talpha=[]
for i in xrange(26):
    Talpha.append(Alphabet[i])

longueur=len(A_Coder)
for i in xrange(longueur):
    car=A_Coder[i]
    if car==" ":
       Phrase_Codee+=" "
    else:
        rangch=(Alphabet.find(car)+decalage)%26
        Phrase_Codee+=Talpha[rangch]
print
print "                     Phrase à coder :"
print A_Coder
print
print "        Phrase codée avec un décalage de 12 :"
print Phrase_Codee

Résultat :

        Phrase à coder :
AVE CESAR MORITURI TE SALUTANT

        Phrase codée avec un décalage de 12 :
MHQ OQEMD YADUFGDU FQ EMXGFMZF

@+


Arx Tarpeia Capitoli proxima...

Hors ligne

#12 19-05-2009 00:57:33

Genki
Invité

Re : [Visual Basic] Algorithme de Cesar

Bonjour

Je viens au nouvelle, c'est cool de vous êtes autant dévoué à m'accorder votre temps sur ce sujet, malheureusement, suite au blocage de ma FAC, la prof à carrément annulé le projet ><

Tant pis, mais merci pour tout quand même !
Laisser quand même le sujet ouvert on ne sais jamais ^^

Genki.

#13 19-05-2009 10:16:01

yoshi
Modo Ferox
Inscription : 20-11-2005
Messages : 16 947

Re : [Visual Basic] Algorithme de Cesar

Salut,

OK !

Essaie quand même le script Visual Basic  pour savoir si ça marche vraiment...
Et puis, pour le fun, on mettra le script de décryptage...

@+


Arx Tarpeia Capitoli proxima...

Hors ligne

#14 19-05-2009 20:39:34

Lutcho74
Membre
Lieu : Vitrolles
Inscription : 22-12-2008
Messages : 136
Site Web

Re : [Visual Basic] Algorithme de Cesar

Salut,

Bon je me "ré-incruste" un peu dans le sujet mais c'est juste pour dire merki à Barbichu(pour le Rubicon) et a yoshi(pour les explications)  :-)

@+

[edit] Voilà j'ai lu le code python juste après avoir posté le message (oui c'est stupide ^^''), et y a un truc que je comprend pas :

rangch=(Alphabet.find(car)+decalage)%26

Cette ligne se trouve juste après un else d'une condition qui se trouve dans la boucle de codage ; bon, j'ai compris que tu rechercher le caractère "car" dans l'alphabet avec le .find mais je ne pige pas trop comment tu peux additionné une variable string avec un nombre(12) mais je pense avoir mal compris...

Dernière modification par Lutcho74 (19-05-2009 20:49:01)


La seule façon raisonnable de vivre en ce bas monde, c'est en dehors des règles.

Hors ligne

#15 19-05-2009 21:01:30

yoshi
Modo Ferox
Inscription : 20-11-2005
Messages : 16 947

Re : [Visual Basic] Algorithme de Cesar

Salut,


Alphabet.find(car) te renvoie la position (en partant de 0) du caractère car dans la chaine Alphabet.
Alphabet.find(car) est donc un nombre entier...
Lance Python.
En mode console tu tapes :
>>> Alphabet="ABCDEFGHIJKLMNOPQRSTUVWXYZ"
>>> car = "I"
>>> Alphabet.find(car)
Et tu obtiens 8...

@+


Arx Tarpeia Capitoli proxima...

Hors ligne

#16 20-05-2009 12:26:14

Lutcho74
Membre
Lieu : Vitrolles
Inscription : 22-12-2008
Messages : 136
Site Web

Re : [Visual Basic] Algorithme de Cesar

Salut,

A oui j'avais pas penser à ça....
Merci pour ta réponse, j'aurais appris un nouveau truc avec python :-)

@+


La seule façon raisonnable de vivre en ce bas monde, c'est en dehors des règles.

Hors ligne

#17 05-10-2009 20:20:54

gatha
Membre
Inscription : 28-09-2009
Messages : 46

Re : [Visual Basic] Algorithme de Cesar

bonsoir
ce sujet est passionant, en l'occurence, il me rappelle le système de codage allemand
"Enigma". destiné essentiellement aux U-Boats.
Sa force résidait dans le fait qu'il est "facile" de décoder en fonction de la fréquence d'apparition des lettres.
En français, par exemple, on repère vite le E car c'est la lettre la plus usitée.
Enigma, par un simple jeu de rouleaux de décalage, codait chaque lettre différement selon sa fréquence au sein du message. Ainsi je tape un a, apparaît un nb. je retape un a c'est un autre nb qui s'affiche.
Je crois savoir que les systèmes de codage US st basés sur les nombres premiers.
quelqu'un en sait-il plus?
Bonne soirée à tous et Semper en dabant!

Hors ligne

Réponse rapide

Veuillez composer votre message et l'envoyer
Nom (obligatoire)

E-mail (obligatoire)

Message (obligatoire)

Programme anti-spam : Afin de lutter contre le spam, nous vous demandons de bien vouloir répondre à la question suivante. Après inscription sur le site, vous n'aurez plus à répondre à ces questions.

Quel est le résultat de l'opération suivante (donner le résultat en chiffres)?
quarantecinq plus cinquante et un
Système anti-bot

Faites glisser le curseur de gauche à droite pour activer le bouton de confirmation.

Attention : Vous devez activer Javascript dans votre navigateur pour utiliser le système anti-bot.

Pied de page des forums