17

I’m using PyCrypto 2.3 and I would like to save the keys I have generated into a file, so as to distribute them to the client and server. I can’t seem to find a way to print the keys correctly, neither can I find examples on the internet.

    def resetKeys(self):
        keys = RSA.generate(1024)

        privHandle = open(self.privateKeyFile, 'wb')
        privHandle.write(keys.privatekey())
        privHandle.close()

        pubHandle = open(self.publicKeyFile, 'wb')
        pubHandle.write(keys.publickey())
        pubHandle.close()

This codes does not work for many reasons: first, keys.publickey() doesn’t seem to be printable, it returns:

    <_RSAobj @0x10f810d0 n(1024),e>

and second, keys has no function named privatekey.

Has anyone done that before?

qdii
  • 12,505
  • 10
  • 59
  • 116

3 Answers3

34

keys.exportKey() for the private key, keys.publickey().exportKey() for the public key. You can change the output format with format argument, see the docs at this site.

wRAR
  • 25,009
  • 4
  • 84
  • 97
6

The following piece of code will create the RSA key pair and store them in PEM files as well as print them.

Original credits : wRAR from this post & AJ poultier from [pyOpenSSL creating a pem file

from Crypto.PublicKey import RSA
private_key = RSA.generate(1024)
public_key = private_key.publickey()
print(private_key.exportKey(format='PEM'))
print(public_key.exportKey(format='PEM'))

with open ("private.pem", "w") as prv_file:
    print("{}".format(private_key.exportKey()), file=prv_file)

with open ("public.pem", "w") as pub_file:
    print("{}".format(public_key.exportKey()), file=pub_file)
KARAN SHAH
  • 303
  • 1
  • 3
  • 16
1

Here is the example to generate keys of length 2048 with PKCS -> DER SEQUENCE (binary or PEM encoding)

from Crypto.PublicKey import RSA

private_key_start_comment = '-----BEGIN RSA PRIVATE KEY-----'
private_key_end_comment = '-----END RSA PRIVATE KEY-----'
public_key_start_comment = '-----BEGIN PUBLIC KEY-----'
public_key_end_comment = '-----END PUBLIC KEY-----'

keypair = RSA.generate(2048)
pubkey = keypair.publickey()

public_key_pem = pubkey.exportKey(format='PEM', passphrase=None, pkcs=1)
public_key_final = str(public_key_pem.decode('ascii')).replace('\n','').replace(public_key_start_comment,'').replace(public_key_end_comment,'').replace(' ','')
print('\n public_key_final - ' + public_key_final)

private_key_pem = keypair.exportKey(format='PEM', passphrase=None, pkcs=1)
private_key_final = str(private_key_pem.decode('ascii')).replace('\n','').replace(private_key_start_comment,'').replace(private_key_end_comment,'').replace(' ','')
print('\n private_key_final - ' + private_key_final)

Sample Output:

public_key_final - MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvUC4fYGPHPTraHoozf8xkSwHL4pPqcleSTtiOXvx8X4eJ7D8UAFSi5EkgGfNhzM/EWTUfPLuAH948eJorB25giVnJRzEShvsBVFVF0uTS9avwQWD1EWIoc60cH4l6GuqoAckLtqpUOvHglwBJvjeR4WenxQHV/U7WgJfou04RZQ3sosrg1hfNoWJo79LUzjzPHe+WKqXri0rtLj/JAKofQzs1mWkRKvZkGvWVk/AjCurKs/bjMuCmBd7fddL3XvOAu7bw+tETFyT54nkIOQq2Sw4I8fvcNeA6uNJL6EZMUgSj2GYXAJLOc+bwon6fH95LwaXLliMgF4FXjMlo5sbfwIDAQAB

private_key_final - MIIEogIBAAKCAQEAvUC4fYGPHPTraHoozf8xkSwHL4pPqcleSTtiOXvx8X4eJ7D8UAFSi5EkgGfNhzM/EWTUfPLuAH948eJorB25giVnJRzEShvsBVFVF0uTS9avwQWD1EWIoc60cH4l6GuqoAckLtqpUOvHglwBJvjeR4WenxQHV/U7WgJfou04RZQ3sosrg1hfNoWJo79LUzjzPHe+WKqXri0rtLj/JAKofQzs1mWkRKvZkGvWVk/AjCurKs/bjMuCmBd7fddL3XvOAu7bw+tETFyT54nkIOQq2Sw4I8fvcNeA6uNJL6EZMUgSj2GYXAJLOc+bwon6fH95LwaXLliMgF4FXjMlo5sbfwIDAQABAoIBAA1fIcnoWgrDOVDP9MsdQUzPDhDrVlaaPjmxYu7J1Z3o+ct3I1Spy0HGNwyFiQ2I7udVNvg/F9bcKtj4VMn4ba+G4gNKxYmw8Fut0/PJ6LXejNt3/skEQrOgDbq3BwmlddBJwOI4m+b2Scnpo0E0K0xlYgA+Y4hw8MkaytQRq7yqrW31uq7ueN2eJH+akpBiG7MWfEqP3UonWhSfl2yGIc/5rhF/5FcEnKGfSuiLJAE/Bzlv59ozi/+P9UPeIN95QThQL8+nThzD078L0X4ZeFkJrcXQwjkY5pIrBjOckrXFFxWdO3faYE1VAiTjoGTJjBX+F5YA3MOHRtkak7zl8HECgYEAwkbs+KCpL+VDdPSXagMrd+UcbvxCjpUXZsbkxM9OLjhaJbbjJojkSchgBcci7e9xm5Zj1vCFem2WyRmohmlk/WTu+nRpxPTw4veBDFXgRbwXZaxXryMBEZLiOrZ/ZK0SVwLtGxAFJ4z0ZhDOtUofpGwGRVGoE1btvC0euEst6FECgYEA+WEpA1S63H6emEco3bGmXpwJ76/EuuU/OHMc9BWJwDnyGuYD0CRFodjNSPPnGtlfj1jC910WcpW0NHXaMtuo3mg9S6lIgsr/ooPdW9HRQZshjF1enOpYJz9efxUa1PpPnUS7apPznyTkTjgWliPBKx2awXp6Mhknnqt8e7+pos8CgYBiUqL78dOuecl6F4/KB3CobTvGr8S/hJUjXuXI9WIL4lk9XSH5Dq766H4wbmgvI0/L/oDo9zGWlIALpwCzhgOmer634tLk61I+jCSzqYKnyFnPCzoVWRHhYwU70cEHos/1WXXGjIUPTzchsL/s4GbDQCisTHdT0lrfMbaqbuH9AQKBgC8Vzz6Xwuha5+rslKS3JCh84ctlrolzO2qXIYJchrPKvRGjGFk2YAdc/fWmR55kKIzSP42g/9oGtg2pqtcrbkj/+YLNpak8VuQCbcsmZJI0jjMIdhK+lIJkjp0ECRrpYBrbnV9ULA2CU7EJGgqjGZfgcRXS4DuRUE+/JTPgTlE1AoGAJsDjhHbcw3ftuQBM5lwlXiLRhgmCrNhfMzRS9HR2sBZU+LKrq0QLjYyLPf0GBPzKkGWV0rLpYpVIhJF0fbF58DSPMuKF/2VsbWVizVWuWCrMuasgM71wTCB0/+V4qS3wbEeHP8BMw6PtnIHEW8vsZaiuZCLOY+h9lOs+tBBKO98=
Prasad Revanaki
  • 783
  • 4
  • 10
  • 23