In der Kryptografie mit öffentlichem Schlüssel ist ein Fingerabdruck mit öffentlichem Schlüssel eine kurze Folge von Bytes, die zum Identifizieren eines längeren öffentlichen Schlüssels verwendet wird.
Insbesondere in SSH können sie verwendet werden, um zu überprüfen, ob es sich bei einem Server tatsächlich um den Server handelt, mit dem ich voraussichtlich kommunizieren und auf den kein Man-in-the-Middle-Angriff abzielt.
Sie werden in der Regel als hexadezimale Ziffernfolge dargestellt, daher kann es ziemlich langweilig und mühsam sein, sie mit dem erwarteten Fingerabdruck zu vergleichen:
37:e4:6a:2d:48:38:1a:0a:f3:72:6d:d9:17:6b:bd:5e
Zur Vereinfachung hat OpenSSH eine Methode zur Visualisierung von Fingerabdrücken als ASCII-Grafik eingeführt, die wie folgt aussehen würde:
+-----------------+
| |
| |
| . |
| . o |
|o . o . S + |
|.+ + = . B . |
|o + + o B o E |
| o . + . o |
| .o |
+-----------------+
Damit könnte ich versuchen, mich an die raue Form der ASCII-Grafik zu erinnern, und sie dann (theoretisch) erkennen, wenn sich der Fingerabdruck des Servers ändert und das Bild anders aussieht.
Wie es funktioniert
Das Raster hat eine Breite von 17 Zeichen und eine Höhe von 9 Zeichen. Der "Bischof" beginnt in Zeile 4 / Spalte 8 (in der Mitte). Jede Position kann als [x, y] bezeichnet werden, dh [8,4] für die Startposition des Bischofs.
1111111
01234567890123456
+-----------------+
0| |
1| |
2| |
3| |
4| S |
5| |
6| |
7| |
8| |
+-----------------+
Der Bischof benutzt den Fingerabdruck, um sich zu bewegen. Es liest es byteweise von links nach rechts und vom niedrigstwertigen bis zum höchstwertigen Bit:
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
Der Bischof wird sich nach folgendem Plan bewegen:
Bits Direction
-----------------
00 Up/Left
01 Up/Right
10 Down/Left
11 Down/Right
Sonderfälle:
- Wenn der Bischof in einer Ecke ist und wieder in die Ecke ziehen würde, bewegt er sich überhaupt nicht. Dh: Der Bischof ist bei
[0,0]
und sein nächster Schritt wäre00
. Er bleibt bei[0,0]
- Befindet sich der Bischof in einer Ecke oder an einer Wand und würde er in eine der Wände einziehen, bewegt er sich nur horizontal oder vertikal. Dh: Der Bischof ist bei
[0,5]
und sein nächster Schritt wäre01
. Er kann nicht nach links gehen, also bewegt er sich einfach nach oben[0,4]
.
Jede Position enthält einen Wert dafür, wie oft der Bischof dieses Feld besucht hat:
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 |
Die Werte 15 (S) und 16 (E) sind insofern besonders, als sie die Start- und Endposition des Bischofs markieren und den tatsächlichen Wert der jeweiligen Position überschreiben.
Tor
Erstellen Sie ein Programm, das einen alphanumerischen Fingerabdruck als Eingabe verwendet und dessen ASCII-Grafikdarstellung wie in den Beispielen gezeigt erstellt.
Beispiele
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 |
| |
| |
| |
+-----------------+
Regeln
- Das ist Code-Golf . Der Code mit den wenigsten Bytes gewinnt.
- Sie können keine vorhandene Bibliothek verwenden, die das Bild erzeugt.
- Verwenden Sie die Sprache, die Sie bevorzugen!
- Ihre Einreichung muss ein vollständiges Programm sein
quelle
33:33:33:...:33
,cc:cc:cc:...:cc
wären Beispiele dafür. Der Fingerabdruck ist normalerweise ein MD5-Hash, daher ist es sehr unwahrscheinlich, dass Sie ein solches Ergebnis erhalten. Ich habe keine verlässlichen Quellen gefunden, um mit diesen umzugehen. DeshalbAntworten:
Pyth, 125 Bytes
Probieren Sie es online aus: Demo oder Test-Suite
Ich habe vor ein paar Tagen geschrieben, aber nicht gepostet, weil ich nicht wirklich glücklich darüber war.
Erläuterung:
Die Grundidee ist die folgende. Ich fange mit dem Paar an
(4, 8)
. Bei jedem Zug(m1,m2)
gehe ich vom(x, y)
zum(x-1+2*m1, y-1+2*m2)
. Um sicher zu gehen, dass diese Koordinaten gehen nicht außerhalb der Grenzen, werde ich einige Listen machen, sortieren sie und senden Sie das mittlere Element:(sorted(0,8,newx)[1], sorted(0,16,newy)[1])
.Ich verfolge alle Positionen. Zu dieser Liste von Positionen füge ich eine Liste aller möglichen Positionen hinzu, sortiere sie und codiere sie in Lauflängen. Das gibt mir eine Nummer für jede Position. Mit dieser Nummer kann ich das Coorect-Zeichen auswählen und am Ende die Zeichen der Start- und Endposition überschreiben.
quelle
Dyalog APL (178)
Dies ist eine Funktion, die die Zeichenfolge als rechtes Argument verwendet und eine Zeichenmatrix mit der ASCII-Grafikdarstellung zurückgibt, z.
Erläuterung:
⎕ML←3
: eingestellt⎕ML
auf3
. Dies ist⊂
nützlicher zum Teilen von Strings.F←9 17⍴0
: Erstelle eine 17 x 9-Matrix aus Nullen.F
stellt dar, wie oft jede Position besucht wurde.⍵⊂⍨':'≠⍵
:⍵
auf:
Zeichen aufgeteilt.{
...}¨
: für jede Gruppe:¯1+⍵⍳⍨⎕D,'abcdef'
: Finden Sie den Index jedes Zeichens in der Zeichenfolge'01234567890abcdef'
. Subtrahieren Sie 1, da APL standardmäßig 1-indiziert ist.(4/2)⊤
: wandle die Werte in ihre 4-Bit-Darstellungen um (es sollte jetzt eine 2-mal-4-Matrix geben).↓⊖4 2⍴⍉
: Drehen Sie die Matrix, verwenden Sie die Elemente, um stattdessen eine 2-mal-4-Matrix zu füllen, spiegeln Sie diese Matrix horizontal und erhalten Sie dann jede Zeile separat. Dies gibt uns die 4 2-Bit-Werte, die wir benötigen.⊃,/
: Fügen Sie die resultierenden Listen zu einer Liste von 2-Bit-Schritten zusammen.5 9{
...}
: mit der Liste der Schritte und beginnend an Position [9,5]:(⍺⌷F)+←1
: Erhöht die aktuelle Position inF
.×⍴⍵:
: wenn die Liste der Schritte nicht leer ist:↑⍵
: Machen Sie den ersten Schritt aus der Liste⍺-1 1-2×
: Hole das Delta für diesen Schritt und subtrahiere es von der aktuellen Position1 1⌈9 17⌊
: Bewegung auf das Feld beschränken(
...)∇1↓⍵
: Fahren Sie mit der neuen Position und den restlichen Schritten fort(⍺⌷F)←16
:F
an der Endposition auf 16 stellenF[5;9]←15
:F
An der Startposition auf 15 stellen' .o+=*BOX@%&#/^SE'[1+F]
: Ordne jede Position dem entsprechenden Zeichen zuK⍪(M,
...,M←'|')⍪K←'+','+',⍨17⍴'-'
: Wickle das Ergebnis in Zeilen umquelle
Perl, 300 + 1 (-n) = 301 Bytes
Diese Antwort ist widerlich, aber es ist auch die erste für dieses Rätsel.
-n
um eine Eingabezeile auf STDIN zu nehmen und zu füllen$_
.quelle
R,
465459410393382357 BytesMit Einrückungen und Zeilenumbrüchen:
Verwendungszweck:
quelle
function
.Oktave, 277
Erläuterung:
Probelauf:
quelle
Pyth,
145143140Probieren Sie es online aus.
Pyth kann mit Iterationen nicht wirklich gut umgehen. Ich erwarte, dass CJam es leicht schlägt.
quelle
JavaScript (ES6) 249
208Bearbeiten Fehlender Rand hinzugefügt
Testen Sie das folgende Snippet in einem beliebigen EcmaScript 6-kompatiblen Browser
quelle
forEach
, die vertikalen Ränder fehlen noch.Python,
381328-51 danke an @JonathanFrech
Zur Erklärung etwas ungolfed:
Dieses Durcheinander einer Linie:
Ist funktional äquivalent dazu:
Aber in dieser Art von Golf-Abkürzung
(false_value,true_value)[condition]
nisten alle Bedingungen: Der Rest ist hoffentlich ziemlich selbsterklärendTests
quelle
(1,0)[p%17==16]
ist+(p%17!=16)
, oder möglicherweise sogarp%17!=16
.] for
.fp
sollte seinf
.~16
? Ein bisschen Verschleierung kann Ihrem Golf niemals schaden!Rubin 288
Probieren Sie es online aus: http://ideone.com/QOHAnM
Die lesbare Version (von der ich angefangen habe zu golfen) ist hier: http://ideone.com/XR64km
quelle
C - 488
Es muss einen Weg geben, dies kleiner zu machen ....
quelle
Rust - 509 Bytes
Groß, aber ... fast in der Nähe von C. Wie üblich sind viele Bytes verbraucht, da Rust Typen nicht automatisch ineinandergreift. Aber es gibt wahrscheinlich auch Verbesserungspotential .... könnte wahrscheinlich einige Ideen von anderen Lösungen gebrauchen.
Die ungolfed version ist auf dem Rust Playground online
quelle