giovedì 20 febbraio 2020

Enigma

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

Nessun commento:

Posta un commento

Regressione per illite su suoli naturali

Il dataset visto nel precedente post e' fornito anche da determinazione mineralogiche come la speciazione delle argille. Ho provato a ...