80 lines
2.4 KiB
Python
80 lines
2.4 KiB
Python
# -*- coding: utf-8 -*-
|
|
from enigmail import *
|
|
|
|
|
|
|
|
|
|
# DEFINITION DE L'ALPHABET
|
|
SIGMA = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'; # maj
|
|
SIGMA += 'abcdefghijklmnopqrstuvwxyz'; # min
|
|
SIGMA += '&=+^~@%,.?!:;[](){}-_#$*/ \\"\'\n'; # ponctuation + retour charriot
|
|
SIGMA += '0123456789'; # digit
|
|
SIGMA += 'éèêàùç'; # accents
|
|
SIGMA = SIGMA.decode('utf-8');
|
|
# ALPHABET FORMATE EN LISTE
|
|
SIGMA = list(SIGMA);
|
|
# NOMBRE DE ROTORS
|
|
LEVEL = 3; # valeur par defaut
|
|
# CHOIX DE LA CLE
|
|
userkey = int( raw_input('Cle (hex ou int): '), 0);
|
|
# CALCUL de LEVEL en fonction de la clé
|
|
LEVEL = calcLevel(userkey, SIGMA);
|
|
# DECOMPOSITION DE LA CLE PRIMAIRE EN CLES SECONDAIRES
|
|
KEY = decomposeKey(userkey, len(SIGMA), LEVEL);
|
|
# CREATION DES ROTORS EN FONCTION DES CLES SECONDAIRES
|
|
ROTOR = [];
|
|
ROTOR.append( [] );
|
|
# on cree les rotors grace a sigma et aux cles recuperees
|
|
for i in range(0, LEVEL):
|
|
ROTOR.append( shuffle( SIGMA, KEY[i]) ); # on creer le rotor et le melange suivant la cle
|
|
ROTOR[0].append( ROTOR[i+1][0] ); # on enregistre la l&ettre en premiere position dans la premiere entree du rotor
|
|
|
|
|
|
# AFFICHAGE DES ROTORS
|
|
# printRotors(ROTOR);
|
|
|
|
# LIEN DU FICHIER A CRYPTER
|
|
f1 = raw_input('Fichier d\'entrée: ');
|
|
f2 = raw_input('Fichier de sortie: ');
|
|
|
|
# OUVERTURE ET LECTURE DU FICHIER
|
|
inFile = open(f1, 'r');
|
|
m = inFile.read().decode('utf-8');
|
|
|
|
# CHOIX DU TYPE (ENCODE / DECODE)
|
|
type = '';
|
|
while( type != 'E' and type != 'D' ):
|
|
type = ( raw_input('encoder ou decoder [E/D]: ') ).upper();
|
|
# VARIABLE DU HASH
|
|
M = '';
|
|
|
|
|
|
# DEMARRE LE CHRONO
|
|
startTime = time.time();
|
|
|
|
# ENCODAGE DU MESSAGE
|
|
if( type == 'E' ):
|
|
for c in range(0, len(m)):
|
|
M += encodeChar(m[c], SIGMA, ROTOR);
|
|
rotateRotorsClockwise(ROTOR); # on pivote les rotors dans le sens horaire
|
|
# DECODAGE DU MESSAGE
|
|
else:
|
|
# decalage des rotor en position de fin d'encodage (taille du message -1)
|
|
for r in range(1, len(m)):
|
|
rotateRotorsClockwise(ROTOR);
|
|
|
|
# pour chaque caractere en partant du dernier
|
|
for c in reversed(range(0, len(m))):
|
|
M += decodeChar(m[c], SIGMA, ROTOR); # on lit le caractere
|
|
rotateRotorsAnticlockwise(ROTOR); # on tourne les rotors dans le sens inverse
|
|
|
|
# on retourne la chaine
|
|
M = M[::-1];
|
|
|
|
# ON ECRIT LE RESULTAT DANS LE FICHIER DE SORTIE
|
|
outFile = open(f2, 'w');
|
|
outFile.write(M.encode('utf-8'));
|
|
outFile.close();
|
|
|
|
print
|
|
print 'Temps d\'exécution:',time.time() - startTime; |