使用pycrypto将RSA密钥保存到文件

18 投票
3 回答
36851 浏览
提问于 2025-04-17 12:36

我正在使用PyCrypto 2.3,想把我生成的密钥保存到一个文件里,这样就可以分发给客户端和服务器。但是我找不到正确的方法来打印这些密钥,也没有在网上找到相关的例子。

    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()

这段代码有很多问题:首先,keys.publickey()似乎无法直接打印,它返回的是:

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

其次,keys没有名为privatekey的函数。

有没有人之前做过这个?

3 个回答

1

这里是一个示例,展示如何生成长度为2048的密钥,使用的是PKCS格式,输出为DER序列(可以是二进制格式或PEM编码)。

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=
7

下面这段代码会生成一对RSA密钥,并把它们保存在PEM文件中,同时还会把它们打印出来。

原始作者:wRAR来自这篇帖子,以及AJ poultier来自pyOpenSSL创建PEM文件

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)
35

要导出私钥,可以使用 keys.exportKey(),而导出公钥则用 keys.publickey().exportKey()。你还可以通过 format 参数来改变输出的格式,具体可以查看这个网站上的文档

撰写回答