decifrando codice di trasposizione colonnare

0

Sto cercando un'idea su come decifrare un codice di trasposizione colonnare senza conoscere la chiave o la lunghezza della chiave.

Quando prendo il testo cifrato come input per il mio algoritmo, indovinerò la lunghezza della chiave come fattori della lunghezza del testo cifrato.

Prenderò il primo fattore supponendo che la lunghezza fosse di 20 lettere, quindi prenderò 2 * 10 (2 righe e 10 colonne). Ora voglio sistemare il testo cifrato nelle colonne e leggerlo in ordine di righe per vedere se c'è qualche parola che si forma e abbinarla ad un dizionario se è qualcosa di sensato. Se corrisponde al dizionario, significa che è nell'ordine corretto, altrimenti voglio sapere come creare altre combinazioni delle colonne e leggere di nuovo la riga in fila.

Per favore suggerisci un altro approccio più efficiente.

    
posta Zack Ef 20.10.2013 - 14:49
fonte

1 risposta

0

Hai un'idea generale corretta. Ma voglio sottolineare che la lunghezza del messaggio non deve essere un multiplo esatto del conteggio delle righe, ad es.

A B C  reordering  A C B
D E    --------->  D   E

potrebbe diventare AD C BE . Contabilità per questo è piuttosto difficile, in quanto non sappiamo dove sono le colonne più brevi. Supponendo che stiamo partizionando in tre colonne, potremmo ottenere A DC BE , AD C BE o AD CB E . La situazione peggiora per un numero maggiore di colonne. Una soluzione potrebbe essere decifrare inizialmente tutto tranne l'ultima riga, in modo da conoscere l'ordine delle colonne. I caratteri incerti possono quindi essere distribuiti sulle colonne principali.

Poiché le colonne possono essere riordinate, abbiamo bisogno di un modo per determinare l'ordine originale. Sfortunatamente, ci sono r ! combinazioni diverse. Questo è banale per un piccolo numero di colonne, in cui la forzatura bruta di tutte le combinazioni è una strategia praticabile. Altrimenti, dobbiamo utilizzare un euristico che ci guida attraverso tutte le combinazioni.

Un euristico adatto considera le transizioni di lettere. Possiamo costruire una tabella simile da dati di esempio sufficientemente grandi. Data una lettera a e una lettera b , possiamo quindi stimare la probabilità che a sia seguito da b in un testo. Tra due colonne, usualmente abbiamo più transizioni, quindi possiamo moltiplicare la probabilità di ogni coppia. Fare questo per tutte le colonne produce un indice che possiamo ordinare, ed esaminare prima la transizione della colonna con la probabilità più alta. Nota: si tratta di un abuso di statistiche piuttosto grossolano, ma funziona in questo semplice caso in cui le probabilità vengono utilizzate solo per decidere una transizione.

Ad esempio, supponiamo di avere il testo cifrato eleatytoaryf_s_do_hwre_l e supponiamo di avere quattro colonne. Questo ci dà:

1234
et_h
losw
ea_r
arde
tyo_
yf_l

È irrilevante quale colonna selezioniamo per prima, quindi prenderò # 2. Ora abbiamo probabilità di possibili 2 colonne (dati di frequenza ottenuti da un file di dizionario inglese):

21 23 24
te t_ th
ol os ow
ae a_ ar
ra rd re
yt yo y_
fy f_ fl
 |  |  |                  raw   normalized
 |  |  '-1.6713389025628 e-06 = 0.9985
 |  '----1.10726823199948e-09 = 0.0007
 '-------1.39822078585934e-09 = 0.0008

Guardando l'esponente, possiamo vedere che la transizione 2 → 4 è la più probabile. Ripetiamo questo per la prossima transizione:

241 243
the th_
owl ows
are ar_
rea red
y_t y_o
fly fl_
  |   |                 raw   normalized
  |   '-1.9732647912631e-08 = 0.1122
  '-----1.5611637229838e-07 = 0.8878

Questo dichiara la transizione 4 → 1 più probabile. Ora rimane solo una colonna, quindi otteniamo le transizioni 2 → 4 → 1 → 3, che produce il testo chiaro the_owls_are_ready_to_fly . Sembra che sia inglese, quindi possiamo fermarci qui. Se così non fosse, faremo backtrack all'ultimo punto decisionale, che era il 4 →? transizione. Se la scelta di 4 → 3 avesse prodotto anche parole senza senso, tornando indietro al punto di decisione precedente dovremmo esaminare 2 → 1, e quindi decidere 1 →?.

Questa euristica potrebbe essere ulteriormente ottimizzata. Il problema può essere espresso nella teoria dei grafi ordinando pigramente tutti i percorsi attraverso tutti i vertici per il loro peso totale in un grafico ponderato diretto dove i vertici sono colonne, ei bordi sono probabilità di transizione, e gli spigoli combinano moltiplicativi. Per calcolare la probabilità di transizione, dobbiamo normalizzare le probabilità in modo che i pesi di tutti i bordi in uscita si sommino a 1.

    
risposta data 20.10.2013 - 19:46
fonte

Leggi altre domande sui tag