W kryptografii klucza publicznego odcisk palca klucza publicznego to krótka sekwencja bajtów używana do identyfikacji dłuższego klucza publicznego.
W szczególności w SSH można ich użyć do sprawdzenia, czy serwer jest w rzeczywistości serwerem, z którym mam się komunikować i że nie jestem atakowany przez man-in-the-middle.
Zazwyczaj są one przedstawiane jako ciąg cyfr szesnastkowych, więc porównywanie go z odciskiem palca, którego bym się spodziewał, może być nudne i żmudne:
37:e4:6a:2d:48:38:1a:0a:f3:72:6d:d9:17:6b:bd:5e
Aby to trochę ułatwić, OpenSSH wprowadził metodę wizualizacji odcisków palców jako sztuki ASCII, która wyglądałaby następująco:
+-----------------+
| |
| |
| . |
| . o |
|o . o . S + |
|.+ + = . B . |
|o + + o B o E |
| o . + . o |
| .o |
+-----------------+
Dzięki temu mogłem spróbować zapamiętać szorstki kształt sztuki ASCII, a następnie (teoretycznie) rozpoznać ją, gdy zmienił się odcisk palca serwera i obraz wygląda inaczej.
Jak to działa
Zaczerpnięte z Dirk Loss, Tobias Limmer, Alexander von Gernler. 2009. Pijany biskup: Analiza algorytmu wizualizacji odcisków palców OpenSSH .
Siatka ma szerokość 17 znaków i wysokość 9 znaków. „Biskup” zaczyna się w rzędzie 4 / kolumnie 8 (środek). Każda pozycja może być oznaczona jako [x, y], tj. [8,4] dla pozycji początkowej biskupa.
1111111
01234567890123456
+-----------------+
0| |
1| |
2| |
3| |
4| S |
5| |
6| |
7| |
8| |
+-----------------+
Biskup używa odcisku palca, aby się poruszać. Odczytuje bajty od lewej do prawej i od najmniej znaczącego do najbardziej znaczącego:
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
Biskup wykona następujący plan:
Bits Direction
-----------------
00 Up/Left
01 Up/Right
10 Down/Left
11 Down/Right
Przypadki specjalne:
- Jeśli biskup znajduje się w kącie i ponownie się w nie ruszy, w ogóle się nie rusza. tj .: Biskup jest w,
[0,0]
a jego następnym krokiem będzie00
. On pozostaje w[0,0]
- Jeśli biskup jest w rogu lub pod ścianą i porusza się do jednej ze ścian, porusza się tylko poziomo lub pionowo. tj .: Biskup jest w,
[0,5]
a jego następnym krokiem będzie01
. Nie może iść w lewo, więc po prostu przesuwa się w górę, do[0,4]
.
Każda pozycja zawiera wartość tego, jak często biskup odwiedzał to pole:
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 |
Wartości 15 (S) i 16 (E) są wyjątkowe, ponieważ oznaczają odpowiednio pozycję początkową i końcową biskupa i zastępują rzeczywistą wartość pozycji szacunku.
Cel
Utwórz program, który pobiera alfanumeryczny odcisk palca jako dane wejściowe i tworzy reprezentację graficzną ASCII, jak pokazano w przykładach.
Przykłady
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 |
| |
| |
| |
+-----------------+
Zasady
- To jest golf golfowy . Kod w najmniejszej liczbie bajtów wygrywa.
- Można nie korzystać z istniejącej biblioteki, która wytwarza obraz.
- Używaj dowolnego preferowanego języka!
- Twoje zgłoszenie musi być kompletnym programem
źródło
33:33:33:...:33
,cc:cc:cc:...:cc
byłyby tego przykłady. Odcisk palca jest zwykle skrótem MD5, więc bardzo mało prawdopodobne jest uzyskanie takiego wyniku. Nie znalazłem żadnych wiarygodnych źródeł, jak sobie z nimi radzić, więc na razie powiem: Załóżmy, że żadna komórka nie będzie odwiedzana więcej niż 14 razy.Odpowiedzi:
Pyth, 125 bajtów
Wypróbuj online: wersja demonstracyjna lub pakiet testowy
Napisałem kilka dni temu, ale nie opublikowałem tego, ponieważ nie byłem z tego powodu szczęśliwy.
Wyjaśnienie:
Podstawowa idea jest następująca. Zaczynam od pary
(4, 8)
. W każdym ruchu(m1,m2)
przechodzę od(x, y)
do(x-1+2*m1, y-1+2*m2)
. Aby upewnić się, że te współrzędne nie chodzą poza granicami, zrobię jakieś listy, sortować je i powrócić element środkowy:(sorted(0,8,newx)[1], sorted(0,16,newy)[1])
.Śledzę wszystkie pozycje. Do tej listy pozycji dodaję listę wszystkich możliwych pozycji, sortuję je i koduję według długości. Co daje mi numer dla każdej pozycji. Za pomocą tego numeru mogę wybrać znak „coorect”, a na końcu zastąpić znaki pozycji początkowej i końcowej.
źródło
Dyalog APL (178)
Jest to funkcja, która przyjmuje ciąg jako prawidłowy argument i zwraca macierz znaków zawierającą reprezentację graficzną ASCII, np .:
Wyjaśnienie:
⎕ML←3
: ustaw⎕ML
na3
. To sprawia, że jest⊂
bardziej przydatny do dzielenia ciągów.F←9 17⍴0
: utwórz macierz zer 17 na 9.F
reprezentuje ile razy każda pozycja została odwiedzona.⍵⊂⍨':'≠⍵
: podział⍵
na:
postacie.{
...}¨
: dla każdej grupy:¯1+⍵⍳⍨⎕D,'abcdef'
: znajdź indeks każdego znaku w ciągu'01234567890abcdef'
. Odejmij 1, ponieważ APL jest domyślnie indeksowany jako 1.(4/2)⊤
: przekonwertuj wartości na ich reprezentacje 4-bitowe (powinna być teraz matryca 2 na 4).↓⊖4 2⍴⍉
: obróć matrycę, użyj elementów, aby zamiast tego wypełnić matrycę 2 na 4, wykonaj lustrzane odbicie matrycy w poziomie, a następnie pobierz każdą linię osobno. To daje nam 4 2-bitowe wartości, których potrzebujemy.⊃,/
: połącz wynikowe listy razem, podając listę 2-bitowych kroków.5 9{
...}
: biorąc pod uwagę listę kroków i zaczynając od pozycji [9,5]:(⍺⌷F)+←1
: zwiększ aktualną pozycję wF
.×⍴⍵:
: jeśli lista kroków nie jest pusta:↑⍵
: zrób pierwszy krok z listy⍺-1 1-2×
: pobierz deltę dla tego kroku i odejmij ją od bieżącej pozycji1 1⌈9 17⌊
: ogranicz ruch w obrębie pola(
...)∇1↓⍵
: kontynuuj z nową pozycją i resztą kroków(⍺⌷F)←16
: ustawF
na 16 w pozycji końcowejF[5;9]←15
: ustawF
na 15 w pozycji początkowej' .o+=*BOX@%&#/^SE'[1+F]
: zamapuj każdą pozycję na odpowiedni znakK⍪(M,
...,M←'|')⍪K←'+','+',⍨17⍴'-'
: zawiń wynik w wierszeźródło
Perl, 300 + 1 (-n) = 301 bajtów
Ta odpowiedź jest obrzydliwa, ale jest też pierwsza dla tej układanki, więc na razie wystarczy.
-n
wziąć wiersz danych wejściowych STDIN i wypełnić$_
.źródło
R,
465459410393382357 bajtówZ wcięciami i znakami nowej linii:
Stosowanie:
źródło
function
.Oktawa, 277
Wyjaśnienie:
Przykładowy przebieg:
źródło
Pyth,
145143140Wypróbuj online.
Pyth nie jest zbyt dobry w wyzwaniach związanych z iteracją. Spodziewam się, że CJam łatwo to pokona.
źródło
JavaScript (ES6) 249
208Edytuj Dodano brakującą ramkę
Przetestuj poniższy fragment kodu w dowolnej przeglądarce zgodnej z EcmaScript 6
źródło
forEach
, nadal brakuje pionowych ramek.Python,
381328-51 dzięki @JonathanFrech
Nieco golfa dla wyjaśnienia:
Ten bałagan na linii:
Jest funkcjonalnie równoważny z tym:
ale zawiera wszystkie warunki warunkowe w tym skrócie golfowym:
(false_value,true_value)[condition]
Mam nadzieję, że reszta jest dość oczywistaTesty
źródło
(1,0)[p%17==16]
jest+(p%17!=16)
, a może nawetp%17!=16
.] for
.fp
powinno byćf
.~16
? Odrobina zaciemnienia nigdy nie zaszkodzi twojemu golfowi!Rubinowy 288
Wypróbuj online: http://ideone.com/QOHAnM
Czytelna wersja (ta, od której zacząłem grać w golfa) znajduje się tutaj: http://ideone.com/XR64km
źródło
C - 488
Musi istnieć sposób na zmniejszenie tego ...
źródło
Rdza - 509 bajtów
Duży, ale ... prawie zbliżony do C. Jak zwykle zużytych jest wiele bajtów ze względu na to, że Rust nie rzuca się w siebie automatycznie. Ale prawdopodobnie jest też miejsce na ulepszenia ... prawdopodobnie przydałoby się kilka pomysłów innych rozwiązań.
wersja bez gry jest na Rust Playground online
źródło