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 17-08-2009 09:51:41

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

[Python]Kit d'aide à la cryptanalyse

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

#!/usr/bin/env python
# -*- 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é.

#!/usr/bin/env python
# -*- 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.

@+


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 cette opération? 3*3=

Pied de page des forums