Leggendo di
Enigma mi e' venuta la voglia di provar a scrivere una versione in Python..rendendomi conto che non e' proprio banale
La prima cosa che ho imparato a mie spese e' che si deve progettare tutto in modo simmetrico perche' la codifica e la successiva decodifica avvengono con le stesse impostazione
In un primo momento avevo usato un array per simulare un rotore ma lo avevo creato inserendo dei valori a caso. Invece per permettere che la decodifica segua lo stesso percorso (all'inverso della codifica) l'array non puo' essere creato a caso ma le posizioni devono essere reciproche...meglio con un esempio...se la posizione 5 dell'array contiene un valore 13 la posizione 13 deve contenere il vaore 5
================================================================================
import numpy as np
import readchar
# 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
# 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
plugboard = np.array([16,21,11,15,18,25, 9,22,14, 6,20, 2,13,12, 8, 3, 0,23, 4,24,10, 1, 7,17,19, 5])
rotore_1 = np.array([ 6,10,16,25,20,18, 0,23,17,11, 1, 9,15,19,24,12, 2, 8, 5,13, 4,22,21, 7,14, 3])
rotore_2 = np.array([25,24,23,22,21,20,19,18,17,16,15,14,13,12,11,10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0])
rotore_3 = np.array([17,22,25, 8,16,20,19,14, 3,23,12,24,10,18, 7,21, 4, 0,13, 6, 5,15, 1, 9,11, 2])
riflettore = np.array([24, 5,11,16,21, 1,25,23,10,22, 8, 2,13,12,18,20, 3,19,14,17,15, 4, 9, 7, 0, 6])
while True:
c = readchar.readkey()
print(c),
print(ord(c)-97),
pg = plugboard[ord(c)-97]
print("PG "+str(pg)),
r1 = rotore_1[pg]
print("/R1 "+str(r1)),
r2 = rotore_2[r1]
print("/R2 "+str(r2)),
r3 = rotore_3[r2]
print("/R3 "+str(r3)),
ri = riflettore[r3]
ri_2 = riflettore[ri]
print("/RI "+str(ri)),
print("/RI2 "+str(ri_2)),
r3 = rotore_3[ri_2]
print("/R3 "+str(r3)),
r2 = rotore_2[r3]
print("/R2 "+str(r2)),
r1 = rotore_1[r2]
================================================================================Questa e' la base con tutti i passaggi nei rotori, nella plugboard e nel riflettore
Il problema e' che il dopo il primo passaggio il primo rotore esegue una rotazione per cambiare in automatico il percorso di criptazione ma al momento non sono riuscito ad utilizzare in modo semplice la rotazione dell'array