Dalam kriptografi kunci publik, sidik jari kunci publik adalah urutan singkat byte yang digunakan untuk mengidentifikasi kunci publik yang lebih panjang.
Dalam SSH khususnya mereka dapat digunakan untuk memverifikasi bahwa server sebenarnya adalah server yang saya harapkan untuk berkomunikasi dengan dan saya tidak ditargetkan oleh serangan man-in-the-middle.
Mereka biasanya direpresentasikan sebagai rangkaian angka heksadesimal, sehingga bisa agak membosankan dan membosankan untuk membandingkannya dengan sidik jari yang saya harapkan:
37:e4:6a:2d:48:38:1a:0a:f3:72:6d:d9:17:6b:bd:5e
Untuk membuatnya sedikit lebih mudah, OpenSSH telah memperkenalkan metode untuk memvisualisasikan sidik jari sebagai seni ASCII, yang akan terlihat seperti berikut:
+-----------------+
| |
| |
| . |
| . o |
|o . o . S + |
|.+ + = . B . |
|o + + o B o E |
| o . + . o |
| .o |
+-----------------+
Dengan ini, saya bisa mencoba mengingat bentuk kasar seni ASCII dan kemudian (secara teoritis) mengenalinya ketika sidik jari server berubah dan gambar terlihat berbeda.
Bagaimana itu bekerja
Diambil dari Dirk Loss, Tobias Limmer, Alexander von Gernler. 2009. Uskup yang mabuk: Analisis algoritma visualisasi sidik jari OpenSSH .
Kisi memiliki lebar 17 karakter dan tinggi 9 karakter. "Uskup" dimulai pada baris 4 / kolom 8 (tengah). Setiap posisi dapat dilambangkan sebagai [x, y], yaitu [8,4] untuk posisi awal uskup.
1111111
01234567890123456
+-----------------+
0| |
1| |
2| |
3| |
4| S |
5| |
6| |
7| |
8| |
+-----------------+
Uskup menggunakan sidik jari untuk bergerak. Bunyinya byte-bijaksana dari kiri ke kanan dan dari bit paling signifikan ke bit paling signifikan:
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
Uskup akan bergerak dengan rencana berikut:
Bits Direction
-----------------
00 Up/Left
01 Up/Right
10 Down/Left
11 Down/Right
Kasus khusus:
- Jika uskup ada di sudut dan akan pindah ke sudut lagi, dia tidak bergerak sama sekali. yaitu: Uskup berada di
[0,0]
dan langkah selanjutnya adalah00
. Dia tetap di[0,0]
- Jika uskup berada di sudut atau di dinding dan akan pindah ke salah satu dinding, dia bergerak secara horizontal atau vertikal saja. yaitu: Uskup berada di
[0,5]
dan langkah selanjutnya adalah01
. Dia tidak bisa pergi ke kiri, jadi dia hanya bergerak ke atas, ke[0,4]
.
Setiap posisi memiliki nilai seberapa sering uskup mengunjungi bidang ini:
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 |
Nilai 15 (S) dan 16 (E) adalah istimewa karena menandai masing-masing posisi awal dan akhir uskup dan menimpa nilai sebenarnya dari posisi yang menghormati.
Tujuan
Buat program, yang mengambil sidik jari alfanumerik sebagai input dan menghasilkan representasi seni ASCII seperti yang ditunjukkan dalam contoh.
Contohnya
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 |
| |
| |
| |
+-----------------+
Aturan
- Ini adalah kode-golf . Kode dalam byte paling sedikit menang.
- Anda tidak dapat menggunakan perpustakaan yang ada yang menghasilkan gambar.
- Gunakan bahasa apa pun yang Anda suka!
- Kiriman Anda harus merupakan program yang lengkap
sumber
33:33:33:...:33
,cc:cc:cc:...:cc
akan menjadi contoh untuk ini. Sidik jari biasanya hash MD5, jadi sangat tidak mungkin Anda mendapatkan hasil seperti itu. Saya belum menemukan sumber yang dapat dipercaya tentang cara menangani ini, jadi untuk sekarang saya akan mengatakan: Asumsikan tidak ada sel yang akan dikunjungi lebih dari 14 kali.Jawaban:
Pyth, 125 byte
Cobalah online: Demonstrasi atau Test-Suite
Saya menulis beberapa hari yang lalu, tetapi tidak mempostingnya, karena saya tidak begitu suka.
Penjelasan:
Ide dasarnya adalah sebagai berikut. Saya mulai dengan pasangan
(4, 8)
. Dalam setiap gerakan(m1,m2)
saya beralih dari(x, y)
ke(x-1+2*m1, y-1+2*m2)
. Untuk memastikan, bahwa koordinat ini tidak pergi ke luar asrama, saya akan membuat beberapa daftar, semacam mereka dan kembali elemen tengah:(sorted(0,8,newx)[1], sorted(0,16,newy)[1])
.Saya melacak semua posisi. Ke daftar posisi ini saya menambahkan daftar semua posisi yang mungkin, urutkan dan jalankan-panjang-encode mereka. Yang memberi saya nomor untuk setiap posisi. Dengan nomor ini saya dapat memilih char coorect, dan pada akhirnya menimpa karakter awal dan posisi akhir.
sumber
Dyalog APL (178)
Ini adalah fungsi yang mengambil string sebagai argumen yang benar, dan mengembalikan matriks karakter yang berisi representasi seni ASCII, misalnya:
Penjelasan:
⎕ML←3
: diatur⎕ML
ke3
. Ini membuat⊂
lebih berguna untuk memisahkan string.F←9 17⍴0
: membuat 17-by-9 matriks nol.F
mewakili berapa kali setiap posisi telah dikunjungi.⍵⊂⍨':'≠⍵
: split⍵
pada:
karakter.{
...}¨
: untuk setiap grup:¯1+⍵⍳⍨⎕D,'abcdef'
: temukan indeks setiap karakter dalam string'01234567890abcdef'
. Kurangi 1, karena APL diindeks 1 secara default.(4/2)⊤
: konversikan nilai-nilai ke representasi 4-bit mereka (sekarang harus ada 2-by-4 matrix).↓⊖4 2⍴⍉
: memutar matriks, gunakan elemen untuk mengisi matriks 2-oleh-4 sebagai gantinya, mirror matriks itu secara horizontal, dan kemudian dapatkan setiap baris secara terpisah. Ini memberi kita 4 nilai 2-bit yang kita butuhkan.⊃,/
: bergabung dengan daftar yang dihasilkan bersama, memberikan daftar langkah 2-bit.5 9{
...}
: diberi daftar langkah, dan mulai dari posisi [9,5]:(⍺⌷F)+←1
: increment posisi saat ini diF
.×⍴⍵:
: jika daftar langkah tidak kosong:↑⍵
: ambil langkah pertama dari daftar⍺-1 1-2×
: dapatkan delta untuk langkah itu, dan kurangi dari posisi saat ini1 1⌈9 17⌊
: batasi gerakan di dalam bidang(
...)∇1↓⍵
: lanjutkan dengan posisi baru dan sisa langkah(⍺⌷F)←16
: diaturF
ke 16 di posisi akhirF[5;9]←15
: diaturF
ke 15 di posisi awal' .o+=*BOX@%&#/^SE'[1+F]
: memetakan setiap posisi ke karakter yang sesuaiK⍪(M,
...,M←'|')⍪K←'+','+',⍨17⍴'-'
: bungkus hasilnya dalam garissumber
Perl, 300 + 1 (-n) = 301 byte
Jawaban ini menjijikkan, tetapi ini juga yang pertama untuk teka-teki ini, jadi akan berlaku untuk sekarang.
-n
untuk mengambil jalur input pada STDIN dan mengisi$_
.sumber
R,
465459410393382357 byteDengan lekukan dan baris baru:
Pemakaian:
sumber
function
.Oktaf, 277
Penjelasan:
Contoh dijalankan:
sumber
Pyth,
145143140Cobalah online.
Pyth tidak benar-benar pandai dalam tantangan dengan iterasi. Saya mengharapkan CJam untuk mengalahkannya dengan mudah.
sumber
JavaScript (ES6) 249
208Edit penambahan batas yang hilang
Tes menjalankan cuplikan di bawah ini di peramban apa pun yang mendukung EcmaScript 6
sumber
forEach
, batas vertikal masih hilang.Python,
381328-51 terima kasih kepada @JonathanFrech
Sedikit ungolfed demi penjelasan:
Kekacauan garis ini:
Secara fungsional setara dengan ini:
tapi sarang semua persyaratan dalam gaya jalan pintas golf ini:
(false_value,true_value)[condition]
Semoga sisanya cukup jelasTes
sumber
(1,0)[p%17==16]
adalah+(p%17!=16)
, atau mungkin bahkanp%17!=16
.] for
.fp
seharusnya begituf
.~16
? Sedikit kebingungan tidak pernah bisa melukai golf Anda!Ruby 288
Cobalah online: http://ideone.com/QOHAnM
Versi yang dapat dibaca (yang saya mulai main golf) ada di sini: http://ideone.com/XR64km
sumber
C - 488
Pasti ada cara untuk membuat ini lebih kecil ....
sumber
Karat - 509 byte
Besar tapi ... hampir mendekati C. Seperti biasa ada banyak byte yang digunakan karena cara Rust tidak secara otomatis saling melemparkan tipe. Tetapi mungkin juga ada ruang untuk perbaikan .... mungkin bisa menggunakan beberapa ide dari solusi lain.
versi ungolfed ada di Rust Playground online
sumber