Na criptografia de chave pública, uma impressão digital de chave pública é uma sequência curta de bytes usada para identificar uma chave pública mais longa.
No SSH, em particular, eles podem ser usados para verificar se um servidor é de fato o servidor com o qual estou esperando me comunicar e não sou alvo de um ataque do tipo intermediário.
Eles geralmente são representados como uma sequência de dígitos hexadecimais, portanto, pode ser bastante chato e tedioso compará-lo com a impressão digital que eu esperaria:
37:e4:6a:2d:48:38:1a:0a:f3:72:6d:d9:17:6b:bd:5e
Para facilitar um pouco, o OpenSSH introduziu um método para visualizar impressões digitais como arte ASCII, com a seguinte aparência:
+-----------------+
| |
| |
| . |
| . o |
|o . o . S + |
|.+ + = . B . |
|o + + o B o E |
| o . + . o |
| .o |
+-----------------+
Com isso, eu poderia tentar lembrar a forma grosseira da arte ASCII e então (teoricamente) a reconheceria quando a impressão digital do servidor mudasse e a imagem parecesse diferente.
Como funciona
A grade tem uma largura de 17 caracteres e uma altura de 9 caracteres. O "bispo" começa na linha 4 / coluna 8 (o centro). Cada posição pode ser indicada como [x, y], ou seja, [8,4] para a posição inicial do bispo.
1111111
01234567890123456
+-----------------+
0| |
1| |
2| |
3| |
4| S |
5| |
6| |
7| |
8| |
+-----------------+
O bispo usa a impressão digital para se movimentar. Ele lê em bytes da esquerda para a direita e do bit menos significativo para o bit mais 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
O bispo adotará o seguinte plano:
Bits Direction
-----------------
00 Up/Left
01 Up/Right
10 Down/Left
11 Down/Right
Casos especiais:
- Se o bispo está em um canto e se move novamente para o canto, ele não se move. ou seja: o bispo está
[0,0]
e seu próximo passo seria00
. Ele permanece em[0,0]
- Se o bispo estiver em um canto ou em uma parede e se mover para uma das paredes, ele se moverá horizontal ou verticalmente. ou seja: o bispo está
[0,5]
e seu próximo passo seria01
. Ele não pode ir para a esquerda, então ele apenas sobe, para[0,4]
.
Cada posição possui um valor de quantas vezes o bispo visitou esse 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 |
Os valores 15 (S) e 16 (E) são especiais, pois marcam a posição inicial e final do bispo, respectivamente, e substituem o valor real da posição correspondente.
Objetivo
Crie um programa que use uma impressão digital alfanumérica como entrada e produz sua representação artística ASCII, conforme mostrado nos exemplos.
Exemplos
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 |
| |
| |
| |
+-----------------+
Regras
- Isso é código-golfe . O código no menor número de bytes vence.
- Você não pode usar uma biblioteca existente que produz a imagem.
- Use o idioma que você preferir!
- Sua inscrição deve ser um programa completo
33:33:33:...:33
, cc:cc:cc:...:cc
seriam exemplos para isso. A impressão digital é geralmente um hash MD5, por isso é altamente improvável que você obtenha esse resultado. Não encontrei nenhuma fonte confiável sobre como lidar com isso, então, por enquanto, eu diria: Suponha que nenhuma célula será visitada mais de 14 vezes.