I was looking for a quick way to generate an RSA key in Python 3 for some unit tests which needed a public key as an OpenSSH string. It ended up taking longer than expected because I started by trying to use the pycrypto library, which is hard to install on Windows (weird dependencies on specific Visual Studio runtimes) and has unresolved bugs with Python 3.
If you’re using Python 3 it’s much easier to use the cryptography library.
Here’s an example which generates an RSA key pair, prints the private key as a string in PEM container format, and prints the public key as a string in OpenSSH format.
from cryptography.hazmat.primitives import serialization from cryptography.hazmat.primitives.asymmetric import rsa from cryptography.hazmat.backends import default_backend # generate private/public key pair key = rsa.generate_private_key(backend=default_backend(), public_exponent=65537, \ key_size=2048) # get public key in OpenSSH format public_key = key.public_key().public_bytes(serialization.Encoding.OpenSSH, \ serialization.PublicFormat.OpenSSH) # get private key in PEM container format pem = key.private_bytes(encoding=serialization.Encoding.PEM, format=serialization.PrivateFormat.TraditionalOpenSSL, encryption_algorithm=serialization.NoEncryption()) # decode to printable strings private_key_str = pem.decode('utf-8') public_key_str = public_key.decode('utf-8') print('Private key = ') print(private_key_str) print('Public key = ') print(public_key_str)