在公共密钥密码术中,公共密钥指纹是用于标识较长公共密钥的一小段字节序列。
特别是在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艺术的粗略形状,然后(从理论上)在服务器的指纹更改并且图像看起来不同时识别出它。
这个怎么运作
取自Dirk Loss,Tobias Limmer,Alexander von Gernler。2009.醉酒的主教:OpenSSH指纹可视化算法分析。
网格的宽度为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次。