Nella crittografia a chiave pubblica, un'impronta digitale della chiave pubblica è una breve sequenza di byte utilizzata per identificare una chiave pubblica più lunga.
In SSH, in particolare, possono essere utilizzati per verificare che un server sia in realtà il server con cui mi aspetto di comunicare e non sono preso di mira da un attacco man-in-the-middle.
Di solito sono rappresentati come una stringa di cifre esadecimali, quindi può essere piuttosto noioso e noioso confrontarlo con l'impronta digitale che mi aspetterei:
37:e4:6a:2d:48:38:1a:0a:f3:72:6d:d9:17:6b:bd:5e
Per renderlo un po 'più semplice, OpenSSH ha introdotto un metodo per visualizzare le impronte digitali come arte ASCII, che sarebbe simile al seguente:
+-----------------+
| |
| |
| . |
| . o |
|o . o . S + |
|.+ + = . B . |
|o + + o B o E |
| o . + . o |
| .o |
+-----------------+
Con questo, potrei provare a ricordare la forma approssimativa dell'arte ASCII e quindi riconoscerla (teoricamente) quando l'impronta digitale del server cambia e l'immagine appare diversa.
Come funziona
La griglia ha una larghezza di 17 caratteri e un'altezza di 9 caratteri. Il "vescovo" inizia alla riga 4 / colonna 8 (al centro). Ogni posizione può essere indicata come [x, y], ovvero [8,4] per la posizione iniziale del vescovo.
1111111
01234567890123456
+-----------------+
0| |
1| |
2| |
3| |
4| S |
5| |
6| |
7| |
8| |
+-----------------+
Il vescovo usa l'impronta digitale per muoversi. Lo legge in byte byte da sinistra a destra e dal bit meno significativo al bit più significativo:
Fingerprint 37 : e4 : 6a : ... : 5e
Bits 00 11 01 11 : 11 10 01 00 : 01 10 10 10 : ... : 01 01 11 10
| | | | | | | | | | | | | | | |
Step 4 3 2 1 8 7 6 5 12 11 10 9 64 63 62 61
Il vescovo si muoverà secondo il seguente piano:
Bits Direction
-----------------
00 Up/Left
01 Up/Right
10 Down/Left
11 Down/Right
Casi speciali:
- Se il vescovo è in un angolo e si sposta di nuovo in un angolo, non si muove affatto. cioè: il vescovo è a
[0,0]
e il suo prossimo passo sarebbe00
. Lui rimane a[0,0]
- Se il vescovo si trova in un angolo o su un muro e si sposta in uno dei muri, si sposta solo in orizzontale o in verticale. cioè: il vescovo è a
[0,5]
e il suo prossimo passo sarebbe01
. Non può andare a sinistra, quindi si sposta verso l'alto[0,4]
.
Ogni posizione ha un valore di quanto spesso il vescovo ha visitato questo campo:
Value | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10| 11| 12| 13| 14| 15| 16|
Character | | . | o | + | = | * | B | O | X | @ | % | & | # | / | ^ | S | E |
I valori 15 (S) e 16 (E) sono speciali in quanto segnano rispettivamente la posizione iniziale e finale del vescovo e sovrascrivono il valore reale della posizione rispettosa.
Obbiettivo
Crea un programma, che prende un'impronta alfanumerica come input e produce la sua rappresentazione di arte ASCII come mostrato negli esempi.
Esempi
Input:
16:27:ac:a5:76:28:2d:36:63:1b:56:4d:eb:df:a6:48
Output:
+-----------------+
| . |
| + . |
| . B . |
| o * + |
| X * S |
| + O o . . |
| . E . o |
| . . o |
| . . |
+-----------------+
Input:
b6:dd:b7:1f:bc:25:31:d3:12:f4:92:1c:0b:93:5f:4b
Output:
+-----------------+
| o.o |
| .= E.|
| .B.o|
| .= |
| S = .|
| . o . .= |
| . . . oo.|
| . o+|
| .o.|
+-----------------+
Input:
05:1e:1e:c1:ac:b9:d1:1c:6a:60:ce:0f:77:6c:78:47
Output:
+-----------------+
| o=. |
| o o++E |
| + . Ooo. |
| + O B.. |
| = *S. |
| o |
| |
| |
| |
+-----------------+
Regole
- Questo è code-golf . Vince il codice nel minor numero di byte.
- È possibile non utilizzare una libreria esistente che produce l'immagine.
- Usa la lingua che preferisci!
- La tua richiesta deve essere un programma completo
33:33:33:...:33
, cc:cc:cc:...:cc
sarebbero esempi per questo. L'impronta digitale di solito è un hash MD5, quindi è altamente improbabile che tu ottenga un tale risultato. Non ho trovato fonti affidabili su come gestirli, quindi per ora direi: supponiamo che nessuna cellula verrà visitata più di 14 volte.