Forum de mathématiques - Bibm@th.net
Vous n'êtes pas identifié(e).
- Contributions : Récentes | Sans réponse
#1 31-01-2009 13:17:31
- yoshi
- Modo Ferox
- Inscription : 20-11-2005
- Messages : 16 991
[Python] Décryptage d'un texte codé par masque jetable
Bonjour,
Suite de l'idée de Lutcho74.
Code optimisé.
# -*- 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 :
# -*- 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
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 991
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 :
# -*- 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
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 991
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
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 991
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
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 991
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
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 991
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