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 31-01-2009 14:17:49

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

[Python] Cryptage par décalage (algorithme de Cesar)

Ce script peu paraitre bizarre au niveau des conditions que j'ai fait pour la clé mais faut pas chercher a comprendre, en parlant de la clé il ne faut pas dépassé 28 comme clé sinon après sa sort des accolades pour les y et d'autre truc dans le genre ^^; ce code ne prend en compte que les lettres et les espaces.

#!/usr/bin/env python
# -*- coding: cp1252 -*-

#Cryptage par décalage (Algorithme de Cesar)

Messageacrypter="le script pour décoder ne devrait pas être long a faire, je le donnerais sur ce meme"
cle=28

acrypter=Messageacrypter.replace(" ","")

lg=len(acrypter)
MessageCrypter=""
if cle>=15:
    cle=cle-15
if cle==0 or cle<=2:
    cle=cle+3

for i in range(lg):
    caract=acrypter[i]
    asc=ord(caract)
    prob=asc+cle        
    if prob>=122:
        asc=(asc-26)+cle
    if asc>=97:
        asc=(asc+cle)
        alph=chr(asc)  
    if asc<=65:
        asc=(asc+cle)
        alph=chr(asc)

    MessageCrypter=MessageCrypter+alph

print MessageCrypter

[EDIT] J'ai trouver un beuge qu'en fait il n'y était pas avant que je fasse quelquemodif pour mettre le code sur le forum et en faisant les bon trucs je me suis rendue compte qu'il y avais plein de mauvais trucs et la je vais les modifier pour qu'il soit opérationnel avant la fin de la journée je modifirais le code a même ce message et j'enlèverais cet Edit

Dernière modification par Lutcho74 (31-01-2009 14:46:27)

Hors ligne

#2 31-01-2009 16:32:21

yoshi
Modo Ferox
Inscription : 20-11-2005
Messages : 17 385

Re : [Python] Cryptage par décalage (algorithme de Cesar)

Salut,

Bin si, justement, faut chercher à comprendre : c'est la clé des progrès...
Donc, plusieurs remarques.
1. Dans le message à crypter n'utilise que des majuscules et pas de ponctuation
2. Dans le cas contraire, il te faut préparer ton travail en virant la ponctuation et les lettres accentuées.
3. Cle = 28. Fantaisiste ! Ta clé doit être telle que -26<=cle<=26, il n'y a que 26 lettres entre de A à Z, sachant que pour 0, il n'y a pas de décalage du tout.
4. Si le code ASCII de ta lettre décalée est >90 tu dois enlever 26 et ajouter 26 si le code est < 65.
5. Ca n'existait pas en Basic Panoramic, mais dans la plupart des autres langages si :
si condition1 alors
   Faire qq ch
sinon si condition2 alors
   Faire autre chose
sinon alors
   Faire une 3e chose
Cette structure en Python, c'est :
if ... :

elif .... :

else:

elif : contraction de else if.
Toi tu fais :
if ....... :

if ....... :

if ....... :

Ca change quoi ?
Et bien dans ta structure, le programme effectue les 3 tests alors que dans la structure proposée au pire il en fait 3, au mieux il n'en fait qu'un, puisque les conditions s'excluent l'une l'autre.
Les tests sont gourmands en temps, et si tu as une boucle avec 1 000 000 d'itérations (de tours quoi), tu multiplies le temps par 1 000 000...
6. Ta variable prob sert à quoi ? Surtout qu'après tu utilises asc...
7.

if cle==0 or cle<=2:
    cle=cle+3

Le test cle==0 est totalement inutile parce que compris dans le suivant : cle<=2. Eh Lutcho, ça c'est des maths : on a bien 0 <=2, non ?
Sachant que False --> 0 et True --> 1 et que le petit script suivant :
cle=15
print (cle==14),(cle>12)
te renvoie :  False True,
tu peux écrire ça comme ça : cle=cle+3*(cle<=2)-15*(cle>=15).
D'autre part cle>=15 est vrai si cle == 15 ou cle == 16 ou cle == 17 auquel cas tu obtiens respectivement cle = 0, cle = 1 et cle =2 pour ensuite, comme cle <=2, rajouter 3... T'as pas l'impression que ton prg fait du boulot en trop ?
Et ce que je dis là est valable pour n'importe quel langage de programmation, pas seulement pour Python...

@+

Hors ligne

#3 31-01-2009 17:39:25

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

Re : [Python] Cryptage par décalage (algorithme de Cesar)

Salut,

1. Ok sais vrai que je n'y avais pas penser
2.Je les fait comme pour les espace pour toutes les ponctuation mais sa ma fait un beugue donc jles ai enlevé...
3.J'ai mit la clé 28 pour montrer que c'éatait le max que l'on pouvais mettre mais c'est vrai que c'est débile^^.
5.alors en basci panoramic il existe else mais pas elif et j'ai lut des truc sur les conditions dans des tutos donc je connais mais en faite ce code ait un peu un "brouillon" a l'origine il y avait des conditions qu'il n'y a pas la est vice vers sa...
6. la variable prob j'ai oublier de l'enlever mais elle me servait dans une des condition que j'ai enlevé
7.Les condition bizarre pour la clé est quand faite sa me mettait des caractère bizar au dessus d'un clé =15 donc j'ai modifier un peu tout sa pour que sa ne me fasse pas de clé qui soit égale ou supérieur a 15, que si on écrit par exemple 20 et bien sa fasse clé=5 avec la première condition et si on mais 15 sa nous donneras 0 et donc c'est pour sa que j'ai fait la condition d'après don sa sera égale 3 ...

Je vais reprendre mon programme a zéro en prenant en compte tout se que tu m'a dit, et pense tu que sa pourrait être utile de rendre le décryptage a la main impossible; se serai possible en faisant une certaine opération a exécute a la clé qui ne serai pas connue de la personne qui n'a pas le code et donc même si on a la clé sa ne change rien...., je propose sa vue que quand on crypte quelque chose c'est pas fait pour être décrypter par quelqu'un que l'on ne désire pas...quand pense tu?

Hors ligne

#4 31-01-2009 18:11:52

yoshi
Modo Ferox
Inscription : 20-11-2005
Messages : 17 385

Re : [Python] Cryptage par décalage (algorithme de Cesar)

RE,

Rendre le décryptage d'un message crypté via le Code de César impossible à la main ?
Impossible !
Trop simple, il n'y a que 24 décalages possibles, 0 et 26 revenant à ne pas décaler !
De plus si le texte est un peu long, il suffit de chercher quelle est la lettre du message qui a la fréquence la plus élevée, et on saura que c'est un E. A partir de là, selon la longueur du texte, il ne faudra que quelques minutes à quelques heures pour avoir le message en clair...
Si tu ne travailles qu'avec des majuscules, ta variable asc sera telle que 65<= asc <=90. Toute valeur en dehors de cet intervalle devra être corrigée en ajoutant ou retirant 26 et tu n'auras plus de problèmes de "trucs bizarres"
Toute clé supérieure à 26 doit être corrigée modulo 26.
Le seul cryptage reconnu sûr, ai-je lu, est le cryptage via un masque jetable avec une clé de longueur supérieure ou égale à celle du texte et à condition de changer de clé à chaque fois : bien trop lourd donc. Le fin du fin est de prendre la clé en langue étrangère, ce qui va brouiller une fois supplémentaire les fréquences d'apparition des lettres : ce que j'ai fait avec la clé EIJIYOSHIKAWA en japonais

J'ai repris, modifié, optimisé ton code : il marche pour n'importe clé comprise entre -26 et +26.
Si tu veux vraiment imposer des conditions à la clé, alors, il ne faut pas qu'elle vienne de toi.
Tu la demandes dans une boucle while avec cle=int(raw_input("Entrez un nombre entre 1 et 25"))
Puis après, tu utilises le couple try / except... Vois ici : http://lfe.developpez.com/tutoriel/python/node10.php pour permettre ou non la sortie de la boucle selon qie l'entrée est valide ou non.
Un point à signaler raw_input récupère une chaîne de caractères, pas un nombre, il faut donc la convertir d'où le int.
try except c'est pour le cas où un petit malin rentre zut au lieu de 25 et si pas de test de validité, paf, le prg plante et l'autre ricane, content de lui...

@+

Hors ligne

#5 31-01-2009 18:37:10

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

Re : [Python] Cryptage par décalage (algorithme de Cesar)

Re,

Je vais voir pour faire tout se que tu ma dit se soir mis à par la boucle while je verrai plus tard si j'y arrive mais pour l'instant j'ai pas trop envie de m'embrouillais ^^.

@+

Hors ligne

#6 31-01-2009 20:10:04

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

Re : [Python] Cryptage par décalage (algorithme de Cesar)

Re,
Comment faire pour mettre un string en majuscule?
Quand je fait :
messageacrypter=messageacrypter.upper
print messageacrypter
il me met--> <built-in method upper of str object at 0x013A62F0>
Merci d'avance.

@+

Dernière modification par Lutcho74 (31-01-2009 20:12:04)

Hors ligne

#7 31-01-2009 22:04:46

yoshi
Modo Ferox
Inscription : 20-11-2005
Messages : 17 385

Re : [Python] Cryptage par décalage (algorithme de Cesar)

Re,

messageacrypter=messageacrypter.upper()
Il te manque les parenthèses...

C'est une méthode, une fonction pré-construite que tu appliques à un objet : un peu comme si, en maths,  tu écrivais x.f() au lieu de f(x)

@+

Hors ligne

#8 01-02-2009 11:36:55

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

Re : [Python] Cryptage par décalage (algorithme de Cesar)

Salut,

Ok merci

@+

Hors ligne

#9 01-02-2009 12:21:37

yoshi
Modo Ferox
Inscription : 20-11-2005
Messages : 17 385

Re : [Python] Cryptage par décalage (algorithme de Cesar)

Re,

Quand tu auras fini ton code et qu'il sera fonctionnel, soit je t'expédie le mien soit je le poste ainsi tu pourras voir les différences.
Quelle solution préfères-tu ?

Hors ligne

#10 01-02-2009 13:23:16

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

Re : [Python] Cryptage par décalage (algorithme de Cesar)

Re,
Et bien je préfère que tu le poste comme sa je pourrais voir les différences et voir si je n'ai pas fait d'erreurs ou quoi que se soit qui nuise au programme...

Hors ligne

#11 24-02-2009 19:08:44

yoshi
Modo Ferox
Inscription : 20-11-2005
Messages : 17 385

Re : [Python] Cryptage par décalage (algorithme de Cesar)

Bonsoir,

Codage selon l'Algorithme de César : décalage monoalphabétique.

#!/usr/bin/env python
# -*- coding: cp1252 -*-

#Cryptage par décalage (algorithme de Cesar)
def prepare(Messageacrypter):
    li1=["âà","éèêë","îï","ô","ûü","ç"]
    li2=["A","E","I","O","U","C"]
    i=0
    # Remplacement des caractères accentués éventuels
    for mot in li1:
       repl=li2[i]
       for lettre in mot:
           Messageacrypter=Messageacrypter.replace(lettre,repl)
       i+=1      
    for lettre in "',-;:!?.":  # Suppression de la ponctuation
        Messageacrypter=Messageacrypter.replace(lettre,"")
    Messageacrypter=Messageacrypter.upper()    # Passage en majuscules
    return Messageacrypter

Messageacrypter="le script pour décoder ne devrait pas être long a faire,  je le donnerai sur ce même forum"
cle=24 # Décalage par rapport à Y (code ASCII : 24 + 1 = 25e lettre de l'alphabet)

acrypter=prepare(Messageacrypter)
lg=len(acrypter)
MessageCrypte=""

for i in range(lg):
    if acrypter[i]==' ':
        MessageCrypte+=' '
    else:
        asc=ord(acrypter[i])+cle
        MessageCrypte+=chr(asc+26*((asc<65)-(asc>90)))

print MessageCrypte

Et voilà pour le décodage :

#!/usr/bin/env python
# -*- coding: cp1252 -*-

#Décryptage par décalage (algorithme de Cesar)
MessageCrypte="JC QAPGNR NMSP BCAMBCP LC BCTPYGR NYQ CRPC JMLE Y DYGPC HC JC BMLLCPYG QSP AC KCKC DMPSK"
lg=len(MessageCrypte)
MessageClair=""
cle=24 # Décalage par rapport à Y (code ASCII : 24 + 1 = 25e lettre de l'alphabet)

for i in range(lg):
    if MessageCrypte[i]==' ':
        MessageClair+=' '
    else:
        asc=ord(MessageCrypte[i])-cle
        MessageClair+=chr(asc+26*((asc<65)-(asc>90)))

print MessageClair

Commentaires, questions bienvenus.

@+

Hors ligne

#12 25-02-2009 15:53:04

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

Re : [Python] Cryptage par décalage (algorithme de Cesar)

Salut,

Je ne regarde pas encore tes codes car là je suis en vacances donc une fois que j'aurais finit mais devoirs je vais m'y remettre et je pourrais les comparer avec les tient :-)

@+


[Pour Yoshi:] Pour ton E-mail je l'ais juste survoller et désolé de ne pas t'y répondre mais j'ai pas trop le temps en ce moment (je doit bosser un max pour rattraper mon retard dans des matières) mais dès que j'en ai l'occasion je regarderais mieux ton mail...
[Edit] Quand je parle de l'e-mail c'est pas celui que tu m'a envoyé hier(je viens juste de le voir j'ai un petit bugue avec ma boite mail)

Dernière modification par Lutcho74 (25-02-2009 17:36:15)

Hors ligne

#13 25-02-2009 20:17:59

yoshi
Modo Ferox
Inscription : 20-11-2005
Messages : 17 385

Re : [Python] Cryptage par décalage (algorithme de Cesar)

Bonsoir,

Normal. Ta priorité des priorités, c'est le boulot ! T'as intérêt à redresser la barre, pépère : rien ne sera joué tant que ton Conseil de Classe du 3e trimestre n'aura pas eu lieu. D'ici là avec du boulot et un programme serré de "bouchages des trous, à coeur vaillant, rien d'impossible !

@+

PS : Travail sur PGCD expédié...

Hors ligne

#14 27-02-2009 15:34:49

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

Re : [Python] Cryptage par décalage (algorithme de Cesar)

Bijour,

ça y est j'ai réussi... bon par contre il ne prend pas les accents...

messageacrypter="bonjour"
cle="2"
cle=int(cle)
messageacrypter=messageacrypter.replace(" ","")
longueur=len(messageacrypter)
messageacrypter=messageacrypter.upper()
i=0
alph=""
messagecrypter=""

for i in range(longueur):
    asc=ord(messageacrypter[i])
    if asc>=65 or asc<=90:
        asc=asc+cle
        if asc>91:
            asc=asc-26
        if asc<65:
            asc=asc+26
    messagecrypter=messagecrypter+chr(asc)
print messagecrypter

Bon il n'est pas super mais bon je suis quand même content de moi vue que la dernière fois que j'ai essayer je suis rester casi deux jours a voir comment je pourrais faire et que je ne trouver pas...En faite je pense que le problème dans mon ancien script c'est que je ne mettais pas le message à crypter en majuscule...

Et je compte voir pour le script de décryptage tout de suite et ensuite je verrai pour qu'il soit mieux(qu'il prenne les accents)...


@+

[EDIT] j'avais oublier d'enlever les espaces dans le message à crypter donc j'ai modifier le code et c'est bon...

Dernière modification par Lutcho74 (27-02-2009 16:23:22)

Hors ligne

#15 27-02-2009 16:28:59

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

Re : [Python] Cryptage par décalage (algorithme de Cesar)

Re,

Voilà le script de dé-cryptage :

messagecrypter="DQPLQWT"
cle="2"
cle=int(cle)
longueur=len(messagecrypter)
i=0
alph=""
messageclair=""
for i in range(longueur):
    asc=ord(messagecrypter[i])
    if asc>=65 or asc<=90:
        asc=asc-cle
    messageclair=messageclair+chr(asc)
print messageclair

J'ai regarder tes codes Yoshi mais foulala j'y comprend casiment rien...

Hors ligne

#16 05-05-2013 22:14:43

Natiish
Invité

Re : [Python] Cryptage par décalage (algorithme de Cesar)

Bonjour Lutcho, pourquoi ta clé est t-elle un chiffre et nom un mot ?

#17 06-05-2013 08:37:32

yoshi
Modo Ferox
Inscription : 20-11-2005
Messages : 17 385

Re : [Python] Cryptage par décalage (algorithme de Cesar)

Bonjour,

T'adresser à Lutcho, comme ça, t'as de l'espoir...
Voilà plus de 3 ans qu'il n'est pas passé sur le forum...
La réponse à ta question réside en la bonne compréhension de ce qu'est le code de Cesar :
simplement un décalage du même nombre de lettres du texte clair.

Il est donc équivalent de dire que l'on fait correspondre A à C :

A   B   C   D   E    F    G   H   I...
C   D   E   F   G    H    I   J   K...

ou que l'on décale de 2.
Informatiquement, là il se sert des codes ASCII : pour simplifier, lorsque tu appuies sur une touche de ton clavier, ce n'est pas une lettre mais un nombre qui est renvoyé à ton ordinateur, qui lui, transforme le nombre en lettre..
A --> 65, B --> 66, C --> 67,..., Z --> 90.
Code(C)-code(A)=2.
Pour coder YOSHI avec la clef de Lutcho :
Je fais :
code(Y)+2, code(O)+2,code(S)+2, code(H)+2,Code(I)+2
89 +2             79+2         83+2         72+2       73+2
  91                  81            85             74          75
Normalement, les codes doivent restés compris entre 65 et 90 inclus.
Comme il y a 26 lettres, on doit donc faire 91 - 26 =  65
Donc YOSHI se code : AQUJK...
Ça te va ?

Pour plus d'infos, voir ici : http://www.bibmath.net/crypto/index.php … cryptcesar

@+

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)?
quatre-vingt trois moins trente quatre
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