Forum de mathématiques - Bibm@th.net
Vous n'êtes pas identifié(e).
- Contributions : Récentes | Sans réponse
- Accueil
- » Programmation
- » [Visual Basic] Algorithme de Cesar
- » Répondre
Répondre
Résumé de la discussion (messages les plus récents en premier)
- gatha
- 05-10-2009 20:20:54
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!
- Lutcho74
- 20-05-2009 12:26:14
Salut,
A oui j'avais pas penser à ça....
Merci pour ta réponse, j'aurais appris un nouveau truc avec python :-)
@+
- yoshi
- 19-05-2009 21:01:30
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...
@+
- Lutcho74
- 19-05-2009 20:39:34
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 :
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...
- yoshi
- 19-05-2009 10:16:01
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...
@+
- Genki
- 19-05-2009 00:57:33
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.
- yoshi
- 18-05-2009 14:34:14
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 :
# -*- 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 :
AVE CESAR MORITURI TE SALUTANT
Phrase codée avec un décalage de 12 :
MHQ OQEMD YADUFGDU FQ EMXGFMZF
@+
- yoshi
- 17-05-2009 20:15:55
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...
@+
- Barbichu
- 17-05-2009 19:59:20
Lut,
http://fr.wikipedia.org/wiki/Rubicon
La première section de l'article devrait te permettre de tout comprendre.
++
- Lutcho74
- 17-05-2009 19:40:54
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...)???
@+
- yoshi
- 17-05-2009 10:44:10
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 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 ?
@+
- yoshi
- 12-05-2009 07:42:54
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 :
AVE CESAR MORITURI TE SALUTANT
Phrase codée avec un décalage de 12 :
MHQ OQEMD YADUFGDU FQ EMXGFMZF
- Genki
- 12-05-2009 01:24:56
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 ?
- yoshi
- 11-05-2009 19:17:35
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...
- Genki
- 11-05-2009 19:04:11
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







