Ajout decodage possible et operationnel [stable~95]
This commit is contained in:
parent
ea70ee296f
commit
620db262a3
57
source.py
57
source.py
|
@ -27,26 +27,41 @@ def shuffle(pSIGMA, pKEY):
|
||||||
return xReturn;
|
return xReturn;
|
||||||
|
|
||||||
|
|
||||||
# fonction qui fait tourner les rotors de pROTOR (indice 1 a len(pROTOR)) l'indice 0 etant la liste des premiers caracteres des rotors
|
# fonction qui fait tourner les rotors (sens horaire) de pROTOR (indice 1 a len(pROTOR)) l'indice 0 etant la liste des premiers caracteres des rotors
|
||||||
def rotateRotors(pROTOR):
|
def rotateRotorsClockwise(pROTOR):
|
||||||
moveNext = True;
|
moveNext = True;
|
||||||
for r in range(1, len(pROTOR)): # parcourt les rotors
|
for r in range(1, len(pROTOR)): # parcourt les rotors
|
||||||
if( moveNext ): # si on doit deplacer le rotor
|
if( moveNext ): # si on doit deplacer le rotor
|
||||||
pROTOR[r] = [pROTOR[r][-1]] + pROTOR[r][:-1] # pivote le rotor de 1 caractere
|
pROTOR[r] = [pROTOR[r][-1]] + pROTOR[r][:-1] # pivote le rotor de 1 caractere
|
||||||
moveNext = ( pROTOR[r][0] == pROTOR[0][r-1] ); # si le rotor vient de finir un tour, moveNext = True sinon moveNext = False
|
moveNext = ( pROTOR[r][0] == pROTOR[0][r-1] ); # si le rotor vient de finir un tour, moveNext = True sinon moveNext = False
|
||||||
|
|
||||||
|
|
||||||
|
# fonction qui fait tourner les rotors (sens anti-horaire) de pROTOR (indice 1 a len(pROTOR)) l'indice 0 etant la liste des premiers caracteres des rotors
|
||||||
|
def rotateRotorsAnticlockwise(pROTOR):
|
||||||
|
moveNext = True;
|
||||||
|
for r in range(1, len(pROTOR)): # parcourt les rotors
|
||||||
|
if( moveNext ): # si on doit deplacer le rotor
|
||||||
|
pROTOR[r] = pROTOR[r][1:] + [pROTOR[r][0]] # pivote le rotor de 1 caractere
|
||||||
|
moveNext = ( pROTOR[r][-1] == pROTOR[0][r-1] ); # si le rotor vient de finir un tour, moveNext = True sinon moveNext = False
|
||||||
|
|
||||||
|
|
||||||
# fonction qui affiche les rotors
|
# fonction qui affiche les rotors
|
||||||
def printRotors(pROTOR):
|
def printRotors(pROTOR):
|
||||||
for i in range(1, len(pROTOR)):
|
for i in range(1, len(pROTOR)):
|
||||||
print pROTOR[i];
|
print pROTOR[i];
|
||||||
|
|
||||||
# fonction qui code un caractere pChar via les rotors
|
# fonction qui code un caractere pChar via les rotors
|
||||||
def codeChar(pChar, pSIGMA, pROTOR):
|
def encodeChar(pChar, pSIGMA, pROTOR):
|
||||||
for r in range(1, len(pROTOR)): # parcourt les rotors
|
for r in range(1, len(pROTOR)): # parcourt les rotors
|
||||||
pChar = SIGMA[ pROTOR[r].index(pChar) ]; # le caractere devient celui au rang de l'alphabet correspondant au rang du caractere dans le rotor r
|
pChar = SIGMA[ pROTOR[r].index(pChar) ]; # le caractere devient celui au rang de l'alphabet correspondant au rang du caractere dans le rotor r
|
||||||
return pChar;
|
return pChar;
|
||||||
|
|
||||||
|
# fonction qui decode un caractere pChar via les rotors
|
||||||
|
def decodeChar(pChar, pSIGMA, pROTOR):
|
||||||
|
for r in reversed(range(1, len(pROTOR))): # parcourt les rotors
|
||||||
|
pChar = pROTOR[r][ pSIGMA.index(pChar) ]; # le caractere devient celui au rang de l'alphabet correspondant au rang du caractere dans le rotor r
|
||||||
|
return pChar;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#############################################################################################################################
|
#############################################################################################################################
|
||||||
|
@ -67,7 +82,7 @@ def codeChar(pChar, pSIGMA, pROTOR):
|
||||||
#############################################################################################################################
|
#############################################################################################################################
|
||||||
|
|
||||||
# ALPHABET
|
# ALPHABET
|
||||||
SIGMA = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', ' '];
|
SIGMA = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', ' '];
|
||||||
# NOMBRE DE ROTORS
|
# NOMBRE DE ROTORS
|
||||||
LEVEL = 3; # valeur par defaut
|
LEVEL = 3; # valeur par defaut
|
||||||
LEVEL = int( raw_input('Level: ') );
|
LEVEL = int( raw_input('Level: ') );
|
||||||
|
@ -88,11 +103,33 @@ for i in range(0, LEVEL):
|
||||||
# SAISIE DU MESSAGE
|
# SAISIE DU MESSAGE
|
||||||
m = raw_input('Message: ');
|
m = raw_input('Message: ');
|
||||||
|
|
||||||
# CODAGE DU MESSAGE
|
# CHOIX DU TYPE (ENCODE / DECODE)
|
||||||
|
type = 'X';
|
||||||
|
while( type != 'E' and type != 'D' ):
|
||||||
|
type = ( raw_input('encoder ou decoder [E/D]: ') ).upper();
|
||||||
|
# VARIABLE DU HASH
|
||||||
M = '';
|
M = '';
|
||||||
for c in range(0, len(m)):
|
|
||||||
M += codeChar(m[c], SIGMA, ROTOR);
|
|
||||||
rotateRotors(ROTOR); # on pivote les rotors
|
|
||||||
|
# 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];
|
||||||
|
|
||||||
print
|
print
|
||||||
print 'Enigma :', M
|
print 'Enigma :', M
|
Loading…
Reference in New Issue