2016-08-22 619 views
1

我需要從私鑰生成公鑰,沒有臨時位置,就像我們在sshgen中做的一樣。所以我使用this.Here傳遞我的私鑰作爲輸入像這樣(執行時):使用Python從私鑰輸入中提取公鑰publickeykey

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 

Dyanam當我執行我的python腳本時,我需要傳遞如上所示的關鍵值,並從中產生公鑰。它是否可能??我不需要在本地存儲,因爲對於priveleges和關鍵證券,不想破解。

+0

查看源代碼,它看起來並不像私有密鑰的該格式支持。此外,您應該使用conch.keys.Key.fromString()以可接受的格式導入密鑰。 –

+0

謝謝詹姆斯,但我錯過了什麼,我知道我在這一行中做了一些錯誤rsa = keys.RSA.importKey(k)。因爲我需要得到我的私鑰作爲輸入,而不是獲取pem文件並提取公共密鑰從它。它可能????如果我們使用sshkeygen它本地存儲密鑰。我不希望出於安全原因。 – Doefi

回答

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 objectdo的私鑰:

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

如果您在導入'from Crypto.PublicKey import RSA'時遇到問題,請嘗試使用easy_install安裝pycrypto: 'pip uninstall pycrypto easy_install pycrypto' – E235