В криптографии с открытым ключом отпечаток открытого ключа - это короткая последовательность байтов, используемая для идентификации более длинного открытого ключа.
В частности, в SSH их можно использовать для проверки того, что сервер на самом деле является сервером, с которым я ожидаю установить связь, и на меня не нацелена атака «человек посередине».
Обычно они представлены в виде строки шестнадцатеричных цифр, поэтому сравнивать их с отпечатком пальца может быть довольно скучно и утомительно:
37:e4:6a:2d:48:38:1a:0a:f3:72:6d:d9:17:6b:bd:5e
Чтобы сделать это немного проще, OpenSSH представила метод визуализации отпечатков пальцев как ASCII-арт, который будет выглядеть следующим образом:
+-----------------+
| |
| |
| . |
| . o |
|o . o . S + |
|.+ + = . B . |
|o + + o B o E |
| o . + . o |
| .o |
+-----------------+
При этом я мог бы попытаться вспомнить грубую форму искусства ASCII и затем (теоретически) распознать его, когда отпечаток пальца сервера изменился и изображение выглядит иначе.
Как это работает
Сетка имеет ширину 17 символов и высоту 9 символов. «Епископ» начинается в строке 4 / колонке 8 (в центре). Каждую позицию можно обозначить как [x, y], то есть [8,4] для начальной позиции слона.
1111111
01234567890123456
+-----------------+
0| |
1| |
2| |
3| |
4| S |
5| |
6| |
7| |
8| |
+-----------------+
Епископ использует отпечатки пальцев, чтобы передвигаться. Он читает его побайтно слева направо и от младшего к старшему:
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
Епископ будет двигаться по следующему плану:
Bits Direction
-----------------
00 Up/Left
01 Up/Right
10 Down/Left
11 Down/Right
Особые случаи:
- Если епископ окажется в углу и снова войдет в угол, он вообще не будет двигаться. то есть: епископ в
[0,0]
и его следующим шагом будет00
. Он остается в[0,0]
- Если епископ находится в углу или у стены и двигается в одну из стен, он движется только горизонтально или вертикально. то есть: епископ в
[0,5]
и его следующим шагом будет01
. Он не может идти налево, поэтому он просто движется вверх, к[0,4]
.
Каждая позиция содержит значение того, как часто епископ посещал это поле:
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 |
Значения 15 (S) и 16 (E) отличаются тем, что они обозначают начальную и конечную позиции слона соответственно и перезаписывают реальное значение соответствующей позиции.
Цель
Создайте программу, которая принимает буквенно-цифровой отпечаток в качестве входных данных и создает свое художественное представление ASCII, как показано в примерах.
Примеры
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 |
| |
| |
| |
+-----------------+
правила
- Это код-гольф . Код в наименьшем количестве байтов побеждает.
- Вы не можете использовать существующую библиотеку, которая производит изображение.
- Используйте любой язык, который вы предпочитаете!
- Ваша заявка должна быть полной программой
33:33:33:...:33
, cc:cc:cc:...:cc
Будет примером для этого. Отпечаток пальца обычно является хешем MD5, поэтому маловероятно, что вы получите такой результат. Я не нашел надежных источников о том, как с этим справиться, поэтому пока скажу: предположим, что ни одна клетка не будет посещена более 14 раз.