OpenSSH秘钥指纹图像生成算法

news/2024/9/20 8:59:29/文章来源:https://www.cnblogs.com/HUOE/p/18337028

OpenSSH秘钥指纹图像生成算法


使用 SSH 秘钥生成时产生疑惑,它的 randomart image 是如何生成的?下面进行了探索和研究

引入

生成位数为 4096 位的 rsa 公私钥

ssh-keygen -t rsa -b 4096
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa
Your public key has been saved in /root/.ssh/id_rsa.pub
The key fingerprint is:
SHA256:zUAZt7Ydw2s0LQqupcMjvB1KtniGX344tnxl2CE3zUg root@ArchLinux
The key's randomart image is:
+---[RSA 4096]----+
|        oo.      |
|       ...Eo .   |
|        o.o+B .  |
|       ..*==o*   |
|        S==o+    |
|   . . +. +.     |
|   .= O. o       |
|  .+oX++o        |
|  .+=.==         |
+----[SHA256]-----+

这张图到底是如何生成的?我十分好奇

算法

OpenSSH-5.1(2008)引入了这种指纹可视化方案
醉酒的主教(drunken bishop)
根据秘钥的指纹转换为比特流,从场地中心开始根据比特流向四周游走,记录每个像素途径的次数,根据次数进行打印

OpenSSH秘钥指纹图像生成算法-1

场地

定义场地宽为 17 个字符,高为 9 个字符,起点位于场地中心 (8, 4)

  01234567890123456+-----------------+ x
0|                 |
1|                 |
2|                 |
3|                 |
4|        S        |
5|                 |
6|                 |
7|                 |
8|                 |+-----------------+y

移动

以上面的秘钥指纹为例 SHA256:zUAZt7Ydw2s0LQqupcMjvB1KtniGX344tnxl2CE3zUg
首先通过 Base64 编码转换成 16进制 CD4019B7B61DC36B342D0AAEA5C323BC1D4AB678865F7E38B67C65D82137CD48
然后根据字节流进行拆分

Hex     |    C D    |    4 0    |    1 9    |    B 7    | ...
Bits    |11 00 11 01|01 00 00 00|00 01 10 01|10 11 01 11| ...
Steps   | 4  3  2  1| 8  7  6  5|12 11 10  9|16 15 14 13| ...

得到数组 ['01', '11', '00', '11', '00', '00', '00', '01', '01', '10', '01', '00', '11', '01', '11', '10', ...]

这个数组就是后续移动的步骤

定义移动方向 00 ↖ 01 ↗ 10 ↙ 11 ↘00 左上 01 右上 10 左下 11 右下

打印

根据移动步骤移动后,每个像素就会有相应的经过次数,根据次数打印

起点(start) : S
终点(end) : E

每个值的对应规则:

次数:  0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16
字符:     .  o  +  =  *  B  O  X  @  %  &  #  /  ^  S  E  
 .o+=*BOX@%&#/^SE

代码实现

#!/usr/bin/env python# NOTE: Requires Python 3+
# usage: drunken_bishop.py [-h] [--mode {md5,sha256}] fingerprint
#
# Generate randomart from fingerprint
#
# positional arguments:
#   fingerprint
#
# optional arguments:
#   -h, --help            show this help message and exit
#   --mode {md5,sha256}, -m {md5,sha256}import argparse
import base64def simulate_bishop_stumbles(steps):field = [[0] * 17 for _ in range(9)]start_position = (4, 8)direction_map = {"00": (-1, -1),"01": (-1, 1),"10": (1, -1),"11": (1, 1),}def clip_at_walls(x, y):return min(max(x, 0), 8), min(max(y, 0), 16)pos = start_positionfor step in steps:x, y = posfield[x][y] += 1dx, dy = direction_map[step]pos = clip_at_walls(x + dx, y + dy)x, y = start_positionfield[x][y] = 15x, y = posfield[x][y] = 16return fielddef get_steps(fingerprint_bytes):return ["{:02b}".format(b >> s & 3) for b in fingerprint_bytes for s in (0, 2, 4, 6)]def print_randomart(atrium, hash_mode):# Symbols for the number of times a position is visited by the bishop# White space means that the position was never visited# S and E are the start and end positionsvalue_symbols = " .o+=*BOX@%&#/^SE"print("+---[   n/a  ]----+")for row in atrium:symbolic_row = [value_symbols[visits] for visits in row]print("|" + "".join(symbolic_row) + "|")print("+" + ("[" + hash_mode.upper() + "]").center(17, "-") + "+")def get_bytes(fingerprint, hash_mode):if hash_mode == "md5":return [int(i, 16) for i in fingerprint.split(":")]elif hash_mode == "sha256":missing_padding = 4 - (len(fingerprint) % 4)fingerprint += "=" * missing_paddingreturn base64.b64decode(fingerprint)raise RuntimeError("Unsupported hashing mode: {}".format(hash_mode))def get_argparser():parser = argparse.ArgumentParser(description="Generate randomart from fingerprint")parser.add_argument("--mode", "-m", choices=["md5", "sha256"], default="sha256")parser.add_argument("fingerprint", type=str)return parserdef drunken_bishop(fingerprint, hash_mode):fingerprint_bytes = get_bytes(fingerprint, hash_mode)steps = get_steps(fingerprint_bytes)atrium_state = simulate_bishop_stumbles(steps)print_randomart(atrium_state, hash_mode)if __name__ == "__main__":parser = get_argparser()args = parser.parse_args()drunken_bishop(args.fingerprint, args.mode)

使用

python drunken_bishop.py --mode sha256 zUAZt7Ydw2s0LQqupcMjvB1KtniGX344tnxl2CE3zUg
+---[   n/a  ]----+
|        oo.      |
|       ...Eo .   |
|        o.o+B .  |
|       ..*==o*   |
|        S==o+    |
|   . . +. +.     |
|   .= O. o       |
|  .+oX++o        |
|  .+=.==         |
+-----[SHA256]----+

引用

openssh.com/txt/release-5.1 OpenSSH 5.1 更新日志
Making art with SSH key randomart GIF图片引用,算法解析
The drunken bishop: An analysis of the OpenSSH fingerprint visualization algorithm 算法解析,马尔科夫分析
A command to display a a key's randomart image from a fingerprint? - Stack Overflow 代码引用

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/776218.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

检测Linux服务器CPU、内存、负载、IO读写、机房带宽和服务器类型的脚本

脚本内容: #!/usr/bin/env bash # # # #RED=\033[0;31m GREEN=\033[0;32m YELLOW=\033[0;33m SKYBLUE=\033[0;36m PLAIN=\033[0mabout() {echo ""echo " ========================================================= "echo " \ Supe…

拖拽式操作也能制作中国式报表了?

报表作为企业经营和决策的重要工具,其重要性不言而喻。中国式报表,不仅要求数据的精准呈现,还需要在格式上保持高度的灵活性,以满足不同场景下的需求。中国式报表以独特的复杂性和信息量大而著称,而这种复杂性也带来了制作和维护上的挑战,使得许多企业在处理中国式报表时…

STM32G030F6P6TR_IAP

bootloader程序 STM32FLASH读写1 /**2 ******************************************************************************3 * @file stmflash.c4 * @brief 读写STM32内部flash(STM32G030F6P6TR)5 **********************************************************…

XALM基本语法

1.同一个UI可以有不同的实现如上图所示,可以存在以下两种不通的实现: 实现一: 实现二:2.对对象属性赋值: 两种语法:使用字符串进行简单赋值;使用属性元素进行复杂赋值; 一.简单赋值: 二.使用属性元素赋值: 3.简化XAML得技巧 精简后如下: 4.对于复杂的绘图和动画制作…

8月8日在线研讨会 | 如何快速开发量产级别功能安全应用软件

本次研讨会经纬恒润将结合自身控制器产品研发及国内外功能安全开发、集成、测试、咨询的实践经验,重点基于功能的应用监控软件,从需求定义、架构设计、单元设计及测试验证等多个环节,分享功能安全量产软件实施的方案、加速实施过程的方法,以推动客户汽车量产级别软件功能安…

vue集成svg大图拖拽无限放大缩小

vue项目中根据实际CAD图为参考,以及参看项目实际现场,手动绘制了一张线体、堆垛机、库区货架svg图,集成到vue页面中,svg图中可以交互接收C#发送过来的singalR实时数据。接收singalR的实时数据并显示到vue中,这里不作展开讲,可以参看笔者另一篇文章《vue若依集成C#的singa…

积目社交app应用深度剖析:定位、功能与用户生态

一、产品概述 积目是一款主打青年文化领域的陌生人社交App,成立于2016年9月。它致力于提高用户质量,为青年群体提供基于兴趣的社交服务。积目的业务涵盖了看照滑卡牌、青年社区、共鸣匹配、线下活动等多个方面,旨在打造一个全方位的社交娱乐平台。二、用户分析 用户特征: 积…

抖音私信如何跳转微信,抖音卡片制作教程

在社交媒体平台中,抖音和微信都是非常受欢迎的应用程序。抖音是一款短视频分享平台,而微信是一款社交聊天应用。有时候,我们可能希望将抖音视频分享到微信上,但是却无法直接在抖音上找到跳转微信的功能。所以在本文中,我们将探讨如何生成抖音跳转微信链接的方法。 首先,我…

比较基因组学流程

1、OrthoFinder 教程 用于比较基因组学的系统发育直系学推断 1.1 orthofinder介绍OrthoFinder是一种快速、准确和全面的比较基因组学分析工具。它可以找到直系和正群,为所有的正群推断基因树,并为所分析的物种推断一个有根的物种树。OrthoFinder还为比较基因组分析提供全面的…

记一次拿到网站管理员账号密码的渗透

信息收集 第一步肯定是老生常谈的信息收集了,这次,首先是给了一个域名,我拿到之后,先是去收集了一些基本信息,如ip等等,但由于是个门户网站,没找到什么打的地方,便用fscan进行了c段扫描 fscan.exe -h ip/24 得到了很多,也都去看了一遍,在其中一个网站...... 探索 前面…

AlertManager简介与使用

目录一、AlertManager简介AlertManager 常用的功能Prometheus 和 AlertManager 的关系二、分组、抑制、静默分组抑制静默三、Alertmanager部署基于k8s部署PVC资源 alertmanager-storage.yamlConfigMap(邮件方式)deploy.yaml创建svc.yamlingress.yaml四、Prometheus添加告警配…

汽车虚拟仿真应用存在的几大挑战及解决方案

汽车虚拟仿真是指利用软件和数学模型,模拟汽车的设计、制造、测试和运行等过程,以及汽车与环境、驾驶员、乘客等的交互.实时云渲染技术可以将汽车虚拟仿真应用的运行画面,以可实时交互的视频流的形式推送到用户终端.汽车虚拟仿真是指利用软件和数学模型,模拟汽车的设计、制造、…