Obtención de una huella digital SSH de una clave pública en Python

Estoy tratando de entender los pasos para tomar una clave pública de OpenSSH así:

ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAqmEmDTNBC6O8HGCdu0MZ9zLCivDsYSttrrmlq87 / YsEBpvwUTiF3UEQuFLaq5Gm + dtgxJewg / UwsZrDFxzpQhCHB6VmqrbKN2hEIkk / HJvCnAmR1ehXv8n2BWw3Jlw7Z + VgWwXAH50f2HWYqTaE4qP4Dxc4RlElxgNmlDPGXw / dYBvChYBG / RvIiTz1L + pYzPD4JR54IMmTOwjcGIJl7nk1VjKvl3D8Wgp6qejv4MfZ7Htdc99SUKcKWAeHYsjPXosSk3GlwKiS / sZi51Yca394GE7T4hZu6HTaXeZoD8 + IZ7AijYn89H7EPjuu0iCAa / cjVzBsFHGszQYG + U5KfIw ==

Y luego convertirlo en una huella dactilar estándar así:

2048 49:d3:cb:f6:00:d2:93:43:a6:27:07:ca:12:fd:5d:98 id_rsa.pub (RSA) 

He intentado sumergirme en la fuente de OpenSSH para entender esto, pero está sobre mi cabeza. Mi primera suposición fue hacer un MD5 simple en el texto clave, pero el resultado no coincide con la salida anterior.

Es la sum MD5 de la clave codificada en base64:

 import base64 import hashlib def lineToFingerprint(line): key = base64.b64decode(line.strip().split()[1].encode('ascii')) fp_plain = hashlib.md5(key).hexdigest() return ':'.join(a+b for a,b in zip(fp_plain[::2], fp_plain[1::2])) 

https://github.com/ojarva/sshpubkeys

pip install sshpubkeys

Uso:

 import sshpubkeys key = sshpubkeys.SSHKey("ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAqmEmDTNBC6O8H" + "GCdu0MZ9zLCivDsYSttrrmlq87/YsEBpvwUTiF3UEQuFLaq5Gm+dtgxJewg/UwsZrDFxz" + "pQhCHB6VmqrbKN2hEIkk/HJvCnAmR1ehXv8n2BWw3Jlw7Z+VgWwXAH50f2HWYqTaE4qP4" + "Dxc4RlElxgNmlDPGXw/dYBvChYBG/RvIiTz1L+pYzPD4JR54IMmTOwjcGIJl7nk1VjKvl" + "3D8Wgp6qejv4MfZ7Htdc99SUKcKWAeHYsjPXosSk3GlwKiS/sZi51Yca394GE7T4hZu6H" + "TaXeZoD8+IZ7AijYn89H7EPjuu0iCAa/cjVzBsFHGszQYG+U5KfIw== user@host") print(key.bits) # 2048 print(key.hash()) # '49:d3:cb:f6:00:d2:93:43:a6:27:07:ca:12:fd:5d:98'