Forum de mathématiques - Bibm@th.net
Vous n'êtes pas identifié(e).
- Contributions : Récentes | Sans réponse
- Accueil
- » Programmation
- » [Python]Kit d'aide à la cryptanalyse
- » Répondre
Répondre
Résumé de la discussion (messages les plus récents en premier)
- yoshi
- 17-08-2009 10:51:41
Bonjour,
Pour plus de détails vous reporter à l'épinglé de même nom dans le sous-forum cryptographie...
Voici les lignes de code pour Python 2.5 ou 2.6.
1. Crypto_grammes.py
# -*- coding: CP1252 -*-
from time import time
from os import getcwd,remove
from operator import itemgetter
def ecriture_fichiers_intermediaires(xgr,lgx,nomf,fl):
f2=open(nomf,"w")
for i in xrange(lgx):
(a,b),(c,d)=xgr[i],xgr[i-1]
if a[0]!=c[0]and i>0 and fl:
f2.write(','+'\n')
f2.write(a+','+b+'\n')
f2.close()
return
def prepare_tri(a,c,d,e,LL,vides,blang):
if c == e:
if c==a:
ecart=abs(int(b)-int(d))
Ecart.append(ecart)
LL.append(c+','+d+','+str(ecart))
else:
LL.append(c+','+d+',')
blang=0
else:
if c == a:
ecart= abs(int(b)-int(d))
Ecart.append(ecart)
LL.append(c+','+d+','+str(ecart))
LL.append(',,')
else :
if blang == 0:
LL.append(',,')
blang=1
return LL,blang,Ecart
tp_d=time()
print " ******************************************"
print " * Analyse des X_grammes *"
print " * v. 2.1 *"
print " ******************************************"
print
rep = getcwd()
nom=rep+chr(92)+"fichier_crypto.txt"
fichier=open(nom,'r')
L=fichier.readlines()
fichier.close()
crypto=L[0].strip("\n")
crypto=crypto.replace(' ','')
crypto=crypto.upper()
lg_crypto=len(crypto)
qb_grm,q_grm,t_grm,b_grm,Ecart,Ecarts,Lq,Lt,Lb,Ll =[],[],[],[],[],[],[],[],[],[]
lg_q,lg_t,lg_b=0,0,0
print "1. Constitution des x-grammes et tri alphabétique"
lg4, lg3, lg2,lg1 = lg_crypto-3, lg_crypto-2,lg_crypto-1,lg_crypto
for i in xrange(lg2):
if i<lg4:
a,b = crypto[i:i+4],str(i+1)
Lq.append(a)
qb_grm.append((a,b))
q_grm.append((a,b))
if i <lg3:
t_grm.append((crypto[i:i+3],str(i+1)))
Lt.append(crypto[i:i+3])
if i <lg2:
b_grm.append((crypto[i:i+2],str(i+1)))
Lb.append(crypto[i:i+2])
Ll.append(crypto[i])
# Tris alpha
q_grm.sort()
t_grm.sort()
b_grm.sort()
# Elimination doublons, triplons, dénombrement et tri par qtés décr
Lq=sorted([(x, Lq.count(x)) for x in set(Lq)])
Lq=sorted(Lq,key=itemgetter(1),reverse=True)
lg_q=len(Lq)
Lt=sorted([(x, Lt.count(x)) for x in set(Lt)])
Lt=sorted(Lt,key=itemgetter(1),reverse=True)
lg_t=len(Lt)
Lb=sorted([(x, Lb.count(x)) for x in set(Lb)])
Lb=sorted(Lb,key=itemgetter(1),reverse=True)
lg_b=len(Lb)
lg_m=max(lg_q,lg_t,lg_b)
Ll=sorted([(x, Ll.count(x)) for x in set(Ll)])
Ll=sorted(Ll,key=itemgetter(1),reverse=True)
lg_l=len(Ll)
# Enregistrements des x_grammes
# 1. Quadrigrammes
print "2. Enregistrements des quadrigrammes bruts et triés"
nombrut=rep+"\\qb_grm.txt"
nomtri=rep+"\\q_grm.txt" # Nom des fichiers à ouvrir
ecriture_fichiers_intermediaires(qb_grm,lg4,nombrut,0)
ecriture_fichiers_intermediaires(q_grm,lg4,nomtri,1)
print ' Fichier : '+nombrut
print ' Fichier : '+nomtri
print
# 2. Trigrammes
print "3. Enregistrements des trigrammes triés"
nomtri=rep+"\\t_grm.txt" # Nom du fichier à ouvrir
ecriture_fichiers_intermediaires(t_grm,lg3,nomtri,1)
print ' Fichier : '+nomtri
print
# 3. Bigrammes
print "4. Enregistrements des bigrammes triés"
nomtri=rep+"\\b_grm.txt" # Nom du fichier à ouvrir
ecriture_fichiers_intermediaires(b_grm,lg2,nomtri,1)
print ' Fichier : '+nomtri
print
# Lettres seules
print '5- Enregistrement des lettres par nombre de présences décroissant'
fich_l=open(rep+'\\Bilan_lettres_seules.csv','w')
for i in xrange(lg_l):
(a,b)=Ll[i]
fich_l.write(a+',,'+str(b)+'\n')
fich_l.close()
print ' Nom du fichier : '+rep+'\\Bilan_lettres_seules.csv'
# Constitution du fichier global sans les lettres seules
print "\n6. Enregistrement des xgrammes et leurs index"
f4b=open(rep+"\\qb_grm.txt","r") # Nom des fichiers à ouvrir
f4t=open(rep+"\\q_grm.txt","r")
f3t=open(rep+"\\t_grm.txt","r")
f2t=open(rep+"\\b_grm.txt","r")
L4b=f4b.readlines()
L4t=f4t.readlines()
L3t=f3t.readlines()
L2t=f2t.readlines()
f_g=open(rep+"\\X_grammes.csv","w")
lg4t,lg3t,lg2t,raccord,vides=len(L4t),len(L3t),len(L2t),",,",","
lg_maxi=max(lg4t,lg3t,lg2t)
lign1=" ,,X_4,,,, X_3 ,,, X_2,"
lign2="Succ.,N°,,Triés,Index,,Triés,Index,,Triés,Index"
for i in xrange(lg_maxi):
if i<lg4:
C4b=L4b[i].strip('\n')
else:
C4b=vides
if i<lg4t:
C4t=L4t[i].strip('\n')
else:
C4t=vides
if i<lg3t:
C3t=L3t[i].strip('\n')
else:
C3t=vides
if i<lg2t:
C2t=L2t[i]
else:
C2t=vides
if i%59==0:
f_g.write(lign1+"\n"+lign2+"\n")
lign3=C4b+raccord+C4t+raccord+C3t+raccord+C2t
f_g.write(lign3)
f_g.close()
f4b.close()
print ' Fichier ici : '+rep+'\\X_grammes.csv'
# Bilan condensé et écarts
f_b=open(rep+"\\Bilan_Xgrammes.csv","w")
ecrit,i,blanc4,blanc3,blanc2,bl,bilan=0,0,0,0,0,0,',,,,,,,,,,,BILAN,,,,,,,,,,,,'+"\n"
vides+=','
L4,L2,L3=[],[],[]
q_grm.append(('****','4'))
t_grm.append(('@@@','3'))
b_grm.append(('&&','2'))
for x in xrange(lg_maxi):
if x <lg4:
(a,b),(c,d),(e,f)=q_grm[x-1],q_grm[x],q_grm[x+1]
LL,blanc4,Ecart=prepare_tri(a,c,d,e,[],',,',blanc4)
L4+=LL
if x <lg3:
(a,b),(c,d),(e,f)=t_grm[x-1],t_grm[x],t_grm[x+1]
LL,blanc3,Ecart=prepare_tri(a,c,d,e,[],',,',blanc3)
L3+=LL
if x <lg2:
(a,b),(c,d),(e,f)=b_grm[x-1],b_grm[x],b_grm[x+1]
LL,blanc2,Ecart=prepare_tri(a,c,d,e,[],',,',blanc2)
L2+=LL
debut=',,,,'
l4,l3,l2,ligne_vide=len(L4),len(L3),len(L2),debut*2+vides
lg_maxi,blanc1,x=max(l4,l3,l2),0,0
Champs='4_grm,Index,Ecart,-*--*--*-*-,3_grm,Index,Ecart,-*-*-*-*-*-,2_grm,Index,Ecart\n'
bilan,vides= ',,,,,BILAN,,,,,\n',',,'
for i in range(lg_maxi):
if x % 59 ==0 :
f_b.write(bilan+Champs)
x=0
bl=0
if i<l4:
bl=(L4[i]==vides)
ligne=L4[i]+', ,'
else:
ligne=debut
bl+=1
if i<l3:
bl+=(L3[i]==vides)
ligne+=L3[i]+',,'
else:
ligne+=debut
bl+=1
if i<l2:
ligne+=L2[i]
bl+=(L2[i]==vides)
else:
ligne+=vides
bl+=1
if bl==3:
blanc1+=1
if blanc1==1:
f_b.write(ligne_vide+'\n')
x+=1
else:
f_b.write(ligne+'\n')
x+=1
blanc1=0
f4b.close()
f4t.close()
f3t.close()
f2t.close()
f_g.close()
print ' Fichier ici : '+rep+'\\Bilan_Xgrammes.csv'
fi_x=open(rep+'\\X_tri_decr.csv','w')
titres='4_grm, Qté,,3_grm, Qté,,2_grm, Qté\n'
for i in xrange(lg_m):
if i%60==0:
fi_x.write('\n'+titres)
if i < lg_q:
(a,b)=Lq[i]
ligne=a+','+str(b)+',,'
else:
ligne=',,,'
if i <lg_t:
(a,b)=Lt[i]
ligne+=a+','+str(b)+',,'
else:
ligne+=',,,'
if i < lg_b:
(a,b)=Lb[i]
ligne+=a+','+str(b)+'\n'
else:
ligne+=',,\n'
fi_x.write(ligne)
fi_x.close()
print ' Fichier ici : '+rep+'\\X_tri_decr.csv'
# Suppression des fichiers obsolètes
remove (rep+'\\qb_grm.txt')
remove (rep+'\\q_grm.txt')
remove (rep+'\\t_grm.txt')
remove (rep+'\\b_grm.txt')
print ' ---------------------------------------------------'
print ' *** IMPRESSIONS VIA UN TABLEUR ***'
print ' Xgrammes.csv :'
print ' * Marges H et B : 1 cm'
print ' * Police Courrier New taille 10'
print " * Ne pas utiliser d'En-Tête et de Pied de Page"
print
tp_f=time()
print ' Temps écoulé :',int(100*(tp_f-tp_d))/100.0,' s'
raw_input(' ... Pour Quitter, Pressez ENTREE ...')
Condition d'utilisation :
Le fichier à traiter doit impérativement :
- se nommer fichier_crypto.txt
- être prêt à l'emploi, sans chiffres, ni ponctuations, ni lettres accentuées
- avoir été tapé "au kilomètre", sans appui sur la touche ENTREE donc ; le plus sûr étant d'utiliser par exemple le Bloc-Notes,
- figurer dans le même dossier que Crypto_grammes.py.
Moyennant quoi, il vous suffira de lancer Crypto_grammes.py pour que le travail s'effectue (en moins d'une seconde).
2. Decoup_crypto.py
Pré-requis :
- L'existence dans le même dossier de fichier_crypto.txt,
- Si le texte a été codé via une clé, la longueur de ladite clé doit vous être connue.
Cet utilitaire ne vous demandera qu'une seule chose : la longueur souhaitée (en nombre de caractères) de la ligne ou de la clé.
# -*- coding:UTF-8 -*-
from os import getcwd,remove
print " ******************************************************"
print u" * Découpe de Crypto selon longueur de ligne/clé *"
print " * v. 1.1 *"
print " ******************************************************"
print
rep = getcwd()
nom=rep+"\\fichier_crypto.txt"
fichier=open(nom,'r')
L=fichier.readlines()
fichier.close()
crypto=L[0].strip("\n") # Suppression du caractère de retour à la ligne
crypto=crypto.replace(' ','') # Suppression des espaces
crypto=crypto.upper() # Passage du texte en majuscules
lg_crypto=len(crypto)
# Définition des limites en mode paysage
if lg_crypto <100:
limite=36
elif lg_crypto<1000:
limite = 30
else:
limite = 26
sortie,lg_cle=0,0
while not sortie:
try:
lg_cle=int(raw_input(u'Quelle est la longueur de la ligne -ou de la clé- (maximum '+str(limite)+' ?) ' ))
if lg_cle <= limite and lg_cle >0:
sortie=1
else:
print "Longueur hors limite d'impression, veuillez modifier votre choix, SVP !"
print
except ValueError:
print u"Ce n'est pas un nombre valide, veuillez recommencer s'il vous plaît"
print
# Paramétrage de l'enregistrement en vue de l'impression future
if limite%lg_cle==0:
orientation='"Paysage"'
lg=limite
nb_blocs=1
bas_page = 37
else:
lg=lg_cle
nb_blocs=limite/lg
if lg>limite/2 and lg<21:
bas_page=57
orientation='"Portrait"'
else:
bas_page=37
orientation='"Paysage"'
carac_par_ligne=nb_blocs*lg
blanc=(26-carac_par_ligne)/(nb_blocs-(nb_blocs>1))+1
reste=lg_crypto%carac_par_ligne
nb_lignes= lg_crypto/carac_par_ligne+(reste>0)
l,ligne_vide=-3,' ,'*(lg*nb_blocs-1)+'\n'
raccord=' ,'*blanc
# Découpe Crypto lettre par lettre
print "Enregistrement du crypto lettre par lettre et des index de position"
nom=rep+'\\lettres_crypto.csv'
fichier=open(nom,'w')
for ligne in xrange(nb_lignes):
ligne1,ligne2='',''
l+=4
for no_bloc in xrange(nb_blocs):
for col in xrange(lg):
index=carac_par_ligne*ligne+lg*no_bloc+col
if index>lg_crypto-1:
ligne1+=','*(col<(lg_crypto-1))
ligne2+=','*(col<(lg_crypto-1))
else:
ligne1+=str(index+1)
ligne2+=crypto[index]
if col<lg_cle-1:
ligne1+=','
ligne2+=','
if col==lg-1 and no_bloc<(nb_blocs-1):
ligne1+=raccord
ligne2+=raccord
fichier.write(ligne1+'\n'+ligne2+'\n'+ligne_vide*2)
if l==bas_page:
fichier.write(ligne_vide)
l=-3
fichier.close()
print u'\n Fichier enregistré : '+rep+'\\Lettres_crypto.csv'
print '\n ---------------------------------------------------'
print ' *** IMPRESSIONS VIA UN TABLEUR ***\n'
print 'du fichier lettres_crypto.csv (orientation de la page en '+orientation+') :'
print ' * Marges H, B, G et D : 1 cm,'
print ' * Police Arial 10 taille 10,'
print u' * Supprimer En-Tête et Pied de Page (Avec OOo Calc décocher Activer),'
print ' * Centrer les colonnes,'
if lg <21 and bas_page==57:
print ' * Forcer leur largeur à 0,9 cm,'
print u' * Par 3 lignes à la fois, mettre un quadrillage.'
print
raw_input('Pour quitter, presser la touche ENTREE')
Commentaires, remarques, suggestions bienvenus.
@+