【问题标题】:Extract Publickey from Privatekey input using Python使用 Python 从私钥输入中提取公钥
【发布时间】:2016-12-28 16:38:18
【问题描述】:

我需要从没有临时位置的私钥生成公钥,就像我们在 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

动态地,我需要在执行我的 python 脚本时传递如上所示的密钥值,然后它将生成公钥。是否可能??,我不需要在本地存储,因为对于特权和密钥证券,不想要破解。

【问题讨论】:

  • 看源码,好像不支持那种格式的私钥。此外,一旦您以可接受的格式获取密钥,您应该使用 conch.keys.Key.fromString() 导入密钥。
  • 谢谢詹姆斯,但我错过了什么,我知道我在这行 rsa = keys.RSA.importKey(k) 中犯了一些错误。因为我需要将我的私钥作为输入而不是进入 pem 文件并从中提取公钥。有可能吗???

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


【解决方案1】:

你可以这样做:

如果您已经拥有私钥,您基本上可以用它创建一个私钥对象,然后简单地使用 as 从中提取公钥:

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

【讨论】:

  • 如果您在导入from Crypto.PublicKey import RSA 时遇到问题,请尝试使用easy_install 安装pycrypto:pip uninstall pycrypto easy_install pycrypto
  • keyPriv = RSA.importKey(key) 然后public_key = keyPriv.publickey().exportKey('PEM') 也有效..
猜你喜欢
  • 1970-01-01
  • 2019-12-13
  • 1970-01-01
  • 2011-07-31
  • 2015-09-06
  • 2012-04-30
  • 1970-01-01
  • 1970-01-01
  • 2017-12-18
相关资源
最近更新 更多