使用Python从Privatekey输入中提取Publickey

时间:2016-08-22 08:07:58

标签: python rsa ssh-keys pycrypto twisted.conch

我需要从私钥生成publickey,而不像我们在sshgen那样在本地生成临时位置。所以我使用它。这里我传递我的私钥作为输入(执行时):

python codekey.py "-----BEGIN RSA PRIVATE KEY-----\nMIhhhhhhhhhhhhhhhh......Bidqt/YS3/0giWrtv+rMkJtv8n\nmirJ+16SZodI5gMuknvZG....................n-----END RSA PRIVATE KEY-----"

我的代码(codekey.py):

import sys
import io
from twisted.conch.ssh import keys
k = sys.argv[1]
rsa = keys.RSA.importKey(k)
key = keys.Key(rsa)
ssh_public = key.public().toString("openssh")
print ssh_public

错误:

      Traceback (most recent call last):
    File "codekey.py", line 7, in <module>
     rsa = keys.RSA.importKey(k)
    File "/usr/lib/python2.7/dist-packages/Crypto/PublicKey/RSA.py", line                638, in importKey
     if lines[1].startswith(b('Proc-Type:4,ENCRYPTED')):
       IndexError: list index out of range

Dyanamically我需要在执行我的python脚本时传递键值,如上所示,它将生成公钥。是否有可能??,我不需要在本地存储,因为对于priveleges和关键证券,不要破解。

1 个答案:

答案 0 :(得分:2)

以下是如何做到的:

如果您已经拥有私钥,您基本上可以使用它创建一个私钥对象,然后只需使用以下方法从中提取公钥:

public_key = private_key.publickey().exportKey('PEM')

假设 private_key 是您的私钥对象。

如果您没有此对象,从PEM编码(PKCS#1)私钥文件中获取它的一种方法(正如您在上面的问题中给出的那样)将是这样的:

from Crypto.PublicKey import RSA
from base64 import b64decode
pem_key = b'your private key in PEM'
key = b64decode(pem_key)
keyPriv = RSA.importKey(key)
# key now has all the components of the private 
print keyPriv.keydata
modulusN = keyPriv.n
pubExpE = keyPriv.e
priExpD = keyPriv.d
primeP = keyPriv.p
primeQ = keyPriv.q
private_key = RSA.construct((modulusN, pubExpE, priExpD, primeP, primeQ))

然后在 private_key 对象中拥有私钥后:

public_key = private_key.publickey().exportKey('PEM')