TomBald94
TomBald94

Reputation: 53

Creating a series of RSA Public Keys in python

So I want to create a list of RSA public keys using the RSA generator in python, but I'm having some issues figuring out how to go about it. So far I have

from Crypto.PublicKey import RSA
key_pair = RSA.generate(2048)
public_key = key.publickey()
print public_key

But so far I see two issues. One is the output is odd, looking and has the form of an RSA Object where I just want the long form version of the key with a bunch of letters

Second is that if I run this code in a loop all the keys generated are the same.

Does anyone know what I am doing wrong?

Upvotes: 2

Views: 3642

Answers (2)

mhawke
mhawke

Reputation: 87054

Addressing the first issue, you can call public_key.exportKey():

>>> from Crypto.PublicKey import RSA
>>> key_pair = RSA.generate(2048)
>>> public_key = key_pair.publickey()

>>> print(public_key.exportKey())
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAoGX9PTzmX+2AwMIhUunN
BUVPRpFFg63bLORKHEgHDW0RntE5u0yPB64Th4+zVas9yQBLhK+v2O6K4gyLOaT5
lQNF5KHQE3l/j6kInLIm73nMhdNJDpoV1cVUgTnuXoAEcTQXwYFf5ME/1/N4txIO
Toi1Z5T5eeVk2SXICdFL47l2vPpcVFmrNGZ16QrZDpVIo3aTmIllbwpm/YPsoLta
U3rcaMkEIar6y1iVEYVZCydN56YH4LDUpT7iGNFYAqgYGUkKHK/h7QATN21HAi/y
a51jrCOBCLCklcGU7/6x+2M5KhMbRRAN2/h1AH+CFdZ140Ml5a5mX+k2QPuplKwk
cwIDAQAB
-----END PUBLIC KEY-----

You can strip off the BEGIN header and END trailer by splitting the output and taking the inner lines:

>>> exported_key = public_key.exportKey().splitlines()[1:-1]
>>> print('\n'.join(exported_key))
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAoGX9PTzmX+2AwMIhUunN
BUVPRpFFg63bLORKHEgHDW0RntE5u0yPB64Th4+zVas9yQBLhK+v2O6K4gyLOaT5
lQNF5KHQE3l/j6kInLIm73nMhdNJDpoV1cVUgTnuXoAEcTQXwYFf5ME/1/N4txIO
Toi1Z5T5eeVk2SXICdFL47l2vPpcVFmrNGZ16QrZDpVIo3aTmIllbwpm/YPsoLta
U3rcaMkEIar6y1iVEYVZCydN56YH4LDUpT7iGNFYAqgYGUkKHK/h7QATN21HAi/y
a51jrCOBCLCklcGU7/6x+2M5KhMbRRAN2/h1AH+CFdZ140Ml5a5mX+k2QPuplKwk
cwIDAQAB

I am not able to replicate the second issue. A new key pair is generated each time RSA.generate() is called:

pub_keys = set()
for i in range(5):
    k = RSA.generate(2048).publickey().exportKey()
    assert k not in pub_keys
    pub_keys.add(k)

Upvotes: 4

abhinav
abhinav

Reputation: 1138

You may try the following code to generate an RSA keypair with an exponent of 65537 in PEM format.

from Crypto.PublicKey import RSA
new_key = RSA.generate(2048, e=65537)
public_key = new_key.publickey().exportKey("PEM")
print public_key

It will generate a public key for you as looks like following:

-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAp1rxDD3DyFAlZWUZhnT2
IrqXBx+XBgMRWYvOPoyjHwwBK/UlD6JW2cx2lP6TJ/Ljrpiamt35cfjRl8PROy81
hRRrVqa9AMUPcIkQoc9Y6VMxHURluX6AJOkakmszlwJvsHr5smMyG7oW/TpSBpR0
xNPc8lyGfhim8GuNomKaDkc5XhNHP7NWhpvOUbneqffkYExbRQrt1UrEMqRryxGh
Lk2rRB3Gny+iOFJP/AfDN0nxFFBrn32uD+2gDUBaBBta6Ii7+LbdpwUkXZlErFA9
5a7mE6g2Q4k87Pc0XwaxcLxwriejCtXD5cz0RgtkItkcUc/wU1vmnhol9Ncm6XSi
xwIDAQAB
-----END PUBLIC KEY-----

Hope it helps!

Upvotes: 0

Related Questions