Skip to content

Instantly share code, notes, and snippets.

@cosmin
Created February 27, 2011 22:12
Show Gist options
  • Save cosmin/846606 to your computer and use it in GitHub Desktop.
Save cosmin/846606 to your computer and use it in GitHub Desktop.
Utilities for fingerprinting RSA keys
import base64
from hashlib import sha1, md5
import re
from pyasn1.codec.ber import encoder
from pyasn1.type.univ import *
def rsa_key_to_der(key):
seq = Sequence()
for index, key in enumerate([0, key.n, key.e, key.d, key.p, key.q, key.d % (key.p - 1), key.d % (key.q - 1), paramiko.util.mod_inverse(key.q, key.p)]):
seq.setComponentByPosition(index, Integer(key))
return encoder.encode(seq)
def strip_pem_header_footer(data):
return re.sub('-.*-', '', data.replace('\r', '')).replace('\n', '')
def rsa_pem_to_der(data):
assert "RSA PRIVATE KEY" in data
return base64.decodestring(strip_pem_header_footer(data))
def rsa_to_pkcs8_der(key=None, pem=None, der=None):
if not der:
if key:
der = rsa_key_to_der(key)
elif pem:
der = rsa_pem_to_der(pem)
seq = Sequence()
seq.setComponentByPosition(0, Integer(0))
seq.setComponentByPosition(1, Sequence().setComponentByPosition(0, ObjectIdentifier('1.2.840.113549.1.1.1')).setComponentByPosition(1, Null('')))
seq.setComponentByPosition(2, OctetString(der))
return encoder.encode(seq)
def format_digest(digest):
return re.sub(r'(\w{2})(?!$)', r'\1:', digest)
def fingerprint(key=None, pem=None, der=None):
pkcs8_der = rsa_to_pkcs8_der(key, pem, der)
plain_sha1 = sha1(pkcs8_der).hexdigest()
plain_md5 = md5(pkcs8_der).hexdigest()
return {'md5' : format_digest(plain_md5), 'sha1' : format_digest(plain_sha1)}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment