diff --git a/implementation.py b/implementation.py index 5647f73..8e275d4 100644 --- a/implementation.py +++ b/implementation.py @@ -1,34 +1,49 @@ -import random +# fonction qui retourne une liste de nombres entre 0 pLength a partir d'un nombre +# compris entre 0 et pLength**pLevel +def decomposeKey(pNum, pLength, pLevel): + xReturn = []; + n = pNum + for i in range(pLevel-1, -1, -1): + xReturn.append( n // (pLength**i) ); + n -= xReturn[i-pLevel+1] * (pLength**i) + return xReturn; -def encode(al, key, msg): - tmp = ''; - hash = ''; - for i in range(0, len(msg)): # parcourt chaque caractere du message - tmp = al[1].index( msg[i] ); - hash += al[len(al)-1][tmp]; - - # decale le premier alphabet d'un cran, le deuxieme si le premier depasse - for i in range(1, len(al)): - print i; - return hash; - -alphabet = []; -alphabet.append( [] ) -alphabet.append( ['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'] ) -alphabet.append( ['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'] ) -alphabet.append( ['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'] ) -for i in range(1, len(alphabet)): - random.shuffle( alphabet[i] ); - alphabet[0].append( alphabet[i][0] ); - print alphabet[i] -print +# fonction qui retourne le resultat d'une liste pList melangee par un nombre pNum +def shuffle(pList, pNum): + xReturn = [] + l = len(pList) + i = pNum % l; # rang actuel + n = 0; # nombre d'elements traites + while( n < len(pList) ): + if( pList[i] != '_' ): # si l'element n'est pas traite + xReturn.append( pList[i] ); # on met le caractere dans xReturn + pList[i] = '_'; # on met un caractere qui nous indique que l'on a deja traite + n += 1; # on met a jour notre indicateur de caracteres traites + else: # si l'element est deja traite + i += 1 + i = (i+pNum) % l + return xReturn -code = raw_input("Votre message: ") -# demande la saisie des cles (positions initiales) -key = []; -for i in range(0, len(alphabet)): - key.append( raw_input('Cle n%d : ' % (i+1) ) ) -print +# fonction qui fait tourner les rotors -print encode(alphabet, key, code); + + + + + + +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', ' '] +userkey = 3*(27**0) + 21*(27**1) + 25*(27**2); +level = 3; +keymax = len(sigma)**level + +# decomposition de n compris entre 0 et len(sigma)**level +key = decomposeKey(userkey, len(sigma), level); + +rotor = []; +# on cree les rotors grace a sigma et aux cles recuperees +for i in range(0, level): + print key[i] + rotor.append( shuffle(sigma, key[i]) ); + print rotor[i]