Search code examples
pythonopensshpycryptoecdsadsa

Creating openssh public keys from private keys with pycrypto


How do I create DSA openssh-formatted public key with a given private key?

The openssh public key format looks like this:

ssh-dss AAAAB3NzaC1kc3MAAACBAKFY7ysDwhMf5j3IOmPg1ztzAodBzQHua5m7/IM8nEYdCDeLzI+Jx24pRDUKseRVC5DUIHU7sRtRpCMDmGBcJwxHF9G4ofrP5hlUaDTHeKHrOKgGdRzPw5xtExImwYfCn97HMc6OpQrsAysL7KCxQHgD41t7IEaSQRjK8zK2IBqJAAAAFQD6Wjepos/lp0Vw8mrRLMIEhocZpQAAAIBXJ+E3J+dMOIHlYpEYm6BmI92/YhAT3+4rfDORQkUtcgmyQiAJ4CWvOBrcwK7zpLZ/pNNujv3cc4whigAqnZm9f+x8LDT7iIZ3FGdvHFDxYiTZVJTv2g1kaS/AABG5KfsVVkV2TP+XO12EjoEjoNvgjA1Z0fSeeKeP8YQNgMNjFgAAAIAobgPabsJCnFuazy+WOoo9SgfqeafXbrsxWPbKV4mjbUKXbOASV4F35Vuk1DAFRRP2/xYxv2QsiW4F2wsGSlsfnvb8bbmhzFHU81BrPRd1R60JUCDnvwVYJlJUqIvgfYbi3AXuxaqK3cLKWIFZGrYGyd2x8DRNpE7SLDMfWY7Jgw== root@Server

Using pycrypto, same thing with RSA works just fine:

key.publickey().exportKey('OpenSSH')

Unfortunately, There is no exportKey() func for a DSA object.

I also have a similar issue with an ecdsa key. Bottom line, I need a python equivalent (for both DSA and ecdsa) to:

ssh-keygen -y -f /path/to/private_key > /path/to/public_key

Solution

  • The expression:

     key.publickey().exportKey('OpenSSH')
    

    to get the DSA public key in the OpenSSH format is supported by PyCryptodome, a PyCrypto fork.