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 13:17:31

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

[Python] Décryptage d'un texte codé par masque jetable

Bonjour,

Suite de l'idée de Lutcho74.
Code optimisé.

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

Cle="RENZOKUSAYUMENNOUCHIKATASANKYODO"
LongCle=len(Cle)

MessageCrypte="ZODAD FWPFI ETWSZ PYTCO UFKVC MFOEY HBJDT AXYSY VTLVL AMSPP \
HSEZW HGPVB OLOYV OLEOS HOWRO NTRDP YPAAU AFHIO GNQYN BXULJ NUOCW CDTWN \
SQIWP QINKW BFRCH PRPID YZWJG DWHSM KESZM PCILN BXRBI JJEPD VGPPB JEFAC \
JFZET QIDEP HOLXL MRLKC OBVQW WSXGP DPSTK EMSEF KXIFD HOOGN EYSMV FPJNW \
SDGJS OGTQD QZCHY JRUIV VWKEQ NSRYI KNHCW EYVJQ TNMZC IYQPW OFWJQ CDB"
# Suppression de tous les espaces d'un coup avec stockage dans un autre conteneur
Crypt=MessageCrypte.replace(" ","")
l=len(Crypt)

# Initialisations
decalage=[]
MessageClair=""
asc=0

# Calcul du décalage et rangement dans un "tableau"
# ord() équivalent de ASC() du BASIC
for i in range(LongCle):
    decalage.append((ord(Cle[i])-65-i)%26)

# Toute chaîne de caractères est en fait une liste (ndexée), un "tableau"
for i in range(l):
    CodeLettreCryptee=ord(Crypt[i]) # Extraction du code ASCII de chacune des lettres
    if LongCle>l:                   # Cas où la clé est plus longue que le message
        j=i
    else:
        j=i%LongCle                # Dans le cas contraire, j est égal au reste (symbole %) de i dans la division par LongCle
        asc=CodeLettreCryptee-decalage[j] # Code ASCII, non corrigé, de la lettre du message clair
        MessageClair+=chr(asc-26*(asc>90)+26*(asc<65)) # concaténation de chaque caractère correspondant au code corrigé

# Découpe du message de sortie en groupes de 5 caractères séparés par une espace
Coupes=l/5-(l%5==0)
for i in range(Coupes):
    MessageClair=MessageClair[0:5+6*i]+" "+MessageClair[5+6*i:l]
    l+=1

# Affichage du message d'origine non retouché
print "           Message crypté :"
print MessageCrypte
print

# Affichage du message décodé
print "           Message décrypté :"
print MessageClair
print

@+

PS
A titre de Comparaison, un message "codé" en ASCII avait été posté ici : http://www.bibmath.net/forums/viewtopic.php?id=2050.
J'avais proposé un décryptage via Traitement de textes.
Voilà le programme de décryptage en Python à comparer avec la longueur et la complexité du précédent :

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

Code="4a 65 20 63 6f 6d 70 72 65 6e 64 73 20 74 72 e9 73 20 62 69 65 6e 20 74 6f 6e 20 6d 65 73\
 73 61 67 65 20 6d 61 69 73 20 63 68 61 63 75 6e 20 e0 20 73 61 20 66 61 63 6f 6e 20 64 65\
 20 70 61 72 6c 65 72 20 2c 20 6f 6e 20 6e 65 20 70 65 75 74\ 20 70 61 73 20 6f 62 6c 69 67\
 65 72 20 6c 65 73 20 67 65 6e 73 20 e0 20 6e 6f 75 73 20 72 65 73 73 65 6d 62 6c 65 72 20\
 3b 20 6a 27 61 69 20 6c 75 20 64 61 6e 73 20 6c 65 20 6d 61 67 61 7a 69 6e 20 6e 74 69 63\
 20 6c 61 20 73 65 6d 61 69 6e 65 20 70 61 73 73 e9 20 71 75 65 20 6c 61 20 63 68 61 73 73\
 65 20 61 75 78 20 70 69 72 61 74 65 73 20 65 73 74 20 6f 75 76 65 72 74 65 20 65 74 20 73\
 69 20 63 27 65 73 74 20 76 72 61 69 20 61 6c 6f 72 73 20 6c 65 73 20 70 6f 75 72 73 75 69\
 74 65 73 20 6a 75 64 69 63 69 61 69 72 65 73 20 6e 65 20 76  6f 6e 74 20 70 6c 75 73 20 74\
 61 72 64 65 72 20 e0 20 63 6f 6d 6d 65 6e 63 65 72 20 2c 20 6c 65 73 20 63 6f 6d 6d 65 6e\
 74 61 74 61 69 72 65 73 20 73 6f 6e 74 20 73 6f 72 74 69 73 20 74 6f 74 61 6c 65 6d 65 6e\
 74 20 64 75 20 73 75 6a 65 74 20 2c 20 65 74 20 6a 65 20 73 75 69 73 20 64 e9 73 6f 6c e9\
 20 70 6f 75 72 20 63 65 20 71 75 69 20 61 20 e9 74 e9 20 70 6f 73 74 e9 20 2c 20 6a 65 20\
 6e 65 20 66 65 73 61 69 73 20 70 61 73 20 74 72 e9 73 20 61 74 74 65 6e 74 69 6f 6e 2e 0d\
 0a 4d 65 72 63 69 20 64 65 20 74 69 6e 71 75 69 65 74 65 72 20 70 6f 75 72 20 6d 6f 69 20\
 2c 20 63 6f 6d 6d 65 20 74 75 20 6c 27 61 73 20 64 69 74 20 6a 27 61 69 20 32 31 20 61 6e\
 73 20 65 74 20 6a 27 61 69 20 65 6e 63 6f 72 65 20 64 65 73 20 61 6e 6e e9 73 20 64 27 e9\
 74 75 64 65 73 20 64 65 76 61 6e 74 20 6d 6f 69 20 2c 20 61 6c 6f 72 73 20 6a 65 20 6e 27\
 61 69 20 70 61 73 20 64 75 20 74 6f 75 74 20 65 6e 76 69 65 20 64 65 20 73 75 62 69 72 65\
 20 75 6e 65 20 61 75 74 72 65  20 70 72 65 73 73 69 6f 6e 20 64 65 20 6c 61 20 70 61 72 74\
 20 64 75 20 67 6f 75 76 65 72 6e 65 6d 65 6e 74 2e 0d 0a 56 6f 69 61 6c 20 2c 20 6a 27 65\
 73 70 65 72 65 20 71 75 65 20 6a 65 20 6e 27 61 69 20 72 69 65 6e 20 6f 75 62 6c 69 65 72 2e"

Code=Code.replace(" ","")
LongCode=len(Code)

for i in range(0,LongCode,2):
       Message+=chr(int("0x"+Code[i:i+2],16))
print Message

3 lignes en ne tenant pas compte de la suppression des espaces et de la recherche de la nouvelle longueur !!!

@+


Arx Tarpeia Capitoli proxima...

Hors ligne

#2 27-02-2009 18:08:19

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

Re : [Python] Décryptage d'un texte codé par masque jetable

Salut,

Pour le second code c'est pas du ASCII mais de l'hexa, non?
Et ton code ne fonctionne pas...(peu être que ça vient  de ma version de python mais j'en doute...)
A un moment tu lui demande de te donné la valeur entière d'un caractère...et je ne sais pas si ça vien de ma version de python mais tu as oublier de définir la variable Message avant de l'utiliser...

@+


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

Hors ligne

#3 27-02-2009 19:30:50

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

Re : [Python] Décryptage d'un texte codé par masque jetable

Salut,

C'est de l'ascii écrit en hexadécimal (base seize) et non en en décimal (base 10)
Il y avait 2 erreurs, pourtant j'ai testé avant la mise en ligne...
1. Il y avait un \ en trop en 3e ligne du code après le 74
2. Message n'était pas défini.

C'est rectifié ci-dessous :

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

Code="4a 65 20 63 6f 6d 70 72 65 6e 64 73 20 74 72 e9 73 20 62 69 65 6e 20 74 6f 6e 20 6d 65 73\
 73 61 67 65 20 6d 61 69 73 20 63 68 61 63 75 6e 20 e0 20 73 61 20 66 61 63 6f 6e 20 64 65\
 20 70 61 72 6c 65 72 20 2c 20 6f 6e 20 6e 65 20 70 65 75 74 20 70 61 73 20 6f 62 6c 69 67\
 65 72 20 6c 65 73 20 67 65 6e 73 20 e0 20 6e 6f 75 73 20 72 65 73 73 65 6d 62 6c 65 72 20\
 3b 20 6a 27 61 69 20 6c 75 20 64 61 6e 73 20 6c 65 20 6d 61 67 61 7a 69 6e 20 6e 74 69 63\
 20 6c 61 20 73 65 6d 61 69 6e 65 20 70 61 73 73 e9 20 71 75 65 20 6c 61 20 63 68 61 73 73\
 65 20 61 75 78 20 70 69 72 61 74 65 73 20 65 73 74 20 6f 75 76 65 72 74 65 20 65 74 20 73\
 69 20 63 27 65 73 74 20 76 72 61 69 20 61 6c 6f 72 73 20 6c 65 73 20 70 6f 75 72 73 75 69\
 74 65 73 20 6a 75 64 69 63 69 61 69 72 65 73 20 6e 65 20 76  6f 6e 74 20 70 6c 75 73 20 74\
 61 72 64 65 72 20 e0 20 63 6f 6d 6d 65 6e 63 65 72 20 2c 20 6c 65 73 20 63 6f 6d 6d 65 6e\
 74 61 74 61 69 72 65 73 20 73 6f 6e 74 20 73 6f 72 74 69 73 20 74 6f 74 61 6c 65 6d 65 6e\
 74 20 64 75 20 73 75 6a 65 74 20 2c 20 65 74 20 6a 65 20 73 75 69 73 20 64 e9 73 6f 6c e9\
 20 70 6f 75 72 20 63 65 20 71 75 69 20 61 20 e9 74 e9 20 70 6f 73 74 e9 20 2c 20 6a 65 20\
 6e 65 20 66 65 73 61 69 73 20 70 61 73 20 74 72 e9 73 20 61 74 74 65 6e 74 69 6f 6e 2e 0d\
 0a 4d 65 72 63 69 20 64 65 20 74 69 6e 71 75 69 65 74 65 72 20 70 6f 75 72 20 6d 6f 69 20\
 2c 20 63 6f 6d 6d 65 20 74 75 20 6c 27 61 73 20 64 69 74 20 6a 27 61 69 20 32 31 20 61 6e\
 73 20 65 74 20 6a 27 61 69 20 65 6e 63 6f 72 65 20 64 65 73 20 61 6e 6e e9 73 20 64 27 e9\
 74 75 64 65 73 20 64 65 76 61 6e 74 20 6d 6f 69 20 2c 20 61 6c 6f 72 73 20 6a 65 20 6e 27\
 61 69 20 70 61 73 20 64 75 20 74 6f 75 74 20 65 6e 76 69 65 20 64 65 20 73 75 62 69 72 65\
 20 75 6e 65 20 61 75 74 72 65  20 70 72 65 73 73 69 6f 6e 20 64 65 20 6c 61 20 70 61 72 74\
 20 64 75 20 67 6f 75 76 65 72 6e 65 6d 65 6e 74 2e 0d 0a 56 6f 69 61 6c 20 2c 20 6a 27 65\
 73 70 65 72 65 20 71 75 65 20 6a 65 20 6e 27 61 69 20 72 69 65 6e 20 6f 75 62 6c 69 65 72 2e"

Code=Code.replace(" ","")
LongCode=len(Code)
Message=''
print "          Message codé :"
print Code
print
for i in range(0,LongCode,2):
    Message+=chr(int('0x'+Code[i:i+2],16))
print "          Message clair :"
print Message

C'est opérationnel, je viens de retester...

@+


Arx Tarpeia Capitoli proxima...

Hors ligne

#4 27-02-2009 21:46:47

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

Re : [Python] Décryptage d'un texte codé par masque jetable

Re,

A ok en faite moi j'ai un petit document là où y a toutes les lettre de l'alphabet en binaire,ASCII et de l'ascii ecrit hexadécimal , c'est pour ça moi y a écrit que c'est de l'hexadécimal sur la feuille j'ignorai que c'était de l'ascii écrit en hexadécimal...je vien d'apprendre quelque chose :-)

Drôle de message quand même...

@+


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

Hors ligne

#5 27-02-2009 21:55:20

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

Re : [Python] Décryptage d'un texte codé par masque jetable

Re,

L'ascii,acronyme de American Standard Code for Information Interchange , est une norme internationale qui fait que dans tous les pays du monde le caractère de code 65 est la lettre A...
65 c'est de la base 10
41 c'est 65 en base 16
100001 c'est 65 en base 2

C'est clair comme ça ?

@+


Arx Tarpeia Capitoli proxima...

Hors ligne

#6 27-02-2009 22:22:09

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

Re : [Python] Décryptage d'un texte codé par masque jetable

Re,

Pour les deux première ligne c'est clair mais après...non je suis encore plus embrouiller...mais c'est pas grave je vais voir pour trouver de la doc dessus ou alors demander à mon prof de techno...

Merci quand même :-)

@+


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

Hors ligne

#7 28-02-2009 14:15:20

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

Re : [Python] Décryptage d'un texte codé par masque jetable

Salut,

Je ne suis pas sûr de comprendre ce que tu ne comprends pas ? ;-)

- Comment passer de la base 16 à la base 10 ?
  * a la main  :   E4D   14 x 16² + 4 x 16 + 13 = 3661
  * via python :  print int("0xE4D",16) --> 3661. Il faut indiquer que la chaîne de caractères est de la base 16, pour ça on la fait précéder de 0x.

- Comment passer de la base 10 à la base 16 ?
  * à la main : par divisions successives :   3661  | 16   
                                                                46    | -------
                                                                141  | 228  | 16         
                                                                  13      64  | ----   
                                                                              0 |  14

Ce qui donne (14)4(13). En base 16, 10 --> A --> 10, B --> 11, C --> 12, D --> 13, E --> 14, F  --> 15.  D'où le résultat  : E4D
                                                                   
  * avec Python : print hex(3361)  --> 0xe4d

Je commence par supprimer les espaces, puis je prends les caractères par groupe de 2 à la fois -- > i:i+2
Et ma boucle commence à 0, et saute de 2 en 2 : elle compte ainsi :  0,2,4,6,8... (c'est le 2 du range : le "pas")
le int('0x'+Code[i:i+2],16) convertit le groupe 2 chiffres de la base 16 à la base 10..

@+


Arx Tarpeia Capitoli proxima...

Hors ligne

#8 28-02-2009 21:25:21

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

Re : [Python] Décryptage d'un texte codé par masque jetable

Salut,

Ok, c'est bon j'ai tout pigé j'ai fait quelque essai avec python en tapant: print int("0x41",16) par exemple...,
et j'ai même compris la seul ligne de ton code que je ne comprenais pas(la seul ligne "importante")... :-)
Par contre, comment faire avec python pour que quand on donne par exemple A il donne le code hexadécimal sous la forme 0x41?

Merci encore une fois pour tes explications

@+


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

Hors ligne

#9 28-02-2009 21:33:45

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

Re : [Python] Décryptage d'un texte codé par masque jetable

Salut,

Simple !
Il faut extraire le code ASCII en décimal du caractère avec ord(), puis lui appliquer la conversion hex().
Ce qui donne :
print hex(ord('Q')) -->  0x51
print hex(ord('m')) --> 0x6d

@+


Arx Tarpeia Capitoli proxima...

Hors ligne

#10 28-02-2009 21:40:12

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

Re : [Python] Décryptage d'un texte codé par masque jetable

Re,

Oui c'est vrai que c'est évident mais ça ne met pas venue à l'idée...
Merci

@+


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

Hors ligne

#11 22-06-2009 14:24:56

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

Re : [Python] Décryptage d'un texte codé par masque jetable

Bonjour,

Correction d'une erreur de codage/décodage avec cette méthode...
Désolé !
Explications circonstanciées dans le post : "Cryptage par masque jetable".

@+


Arx Tarpeia Capitoli proxima...

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)?
vingt huit plus quatre-vingt sept
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