Python非对称加密:使用预生成的prv / pub密钥

时间:2010-10-04 00:48:12

标签: python cryptography encryption-asymmetric

好的,首先是的,我已经搜索了谷歌和stackoverflow并做了一些阅读(在这次会议中只有4个小时)因为这些原因找不到我需要的东西:

  • 他们中的许多人建议只启动像gpg.exe这样的exe(http://stackoverflow.com/questions/1020320)

  • 有人建议使用PyCrypto或其他库并查看它们,a)我找不到如何使用它们的任何API,b)我找不到如何导入预先存在的prv /发布密钥或c)他们使用不安全的RandomPool(而我试图更新它只是要求麻烦)

  • 有些人顺便提一下,但我找不到他们链接的地方(或者他们根本没有链接。

所以我知道问你堆栈用户如何做到这一点,拿一个公钥的字符串(或路径(我可以把它写成临时文件,)我打算把它作为一个字符串pub_key = “...”)))并使用它来签名和保护一个字符串(将发布在论坛上(JSON用于更新我的应用程序)?

这些是使用PuttyGen生成的RSA密钥(Putty Gen 4096位SSH-2-RSA)(可以采用任何格式(OpenSSH,ssh.com,ppk)

这就是公钥的样子

----开始SSH2公共密钥----

评论:“rsa-key-20101003”

AAAAB3NzaC1yc2EAAAABJQAAAgEAi + 91fFsxZ7k1UuudSe5gZoavwARUyZScCtdf WQ0ROoJC + XIqW5vVJfgmr + A1jLS5m4wNsrCqeyoX2B22T6iEwqVXrXt3QcbccKMu WkLKFK1h67q6Coc + 3eOTmKrOuZbWc19YQgybdkR / GxF7XAbq4NCGNaCDtMOqX8Q2 L / a9fAYqVdTwg9trpcz3whNmdLk / B0edOABKuVX51UdLV + ZggK503 + uAb1JiIIj0 mARwR / HNo4oRLMLf2PjuZsGVYYjJDdVJBU6AN4PUQSRRRPL4 + YmsrLJb / TpfJeXA vj4KZMNJv15YXz7 / iMZMKznDtr2RJX5wbSpuTUBNZveA7YiIHxvvvis38b / lX9SJ SYPfZ9CeQY6MvQgG2zwDTOOvKgOIB4sTGMXfcoxB8AF / QXOcxWFJkZoj36rvMd9n Po6szLjHXwcEUOUvvQfG4VvdQA0H5gGLHqYL1EehRsgi5qcCoFPaZW2K09ErKcS0 MbrLFjBkQ9KmqAM38bvM8UhCWAMA9VXOGHMxUHBV4Bir9alGS4VX0B8Y0b3dZ + 7I MKkHMCwdEUJf7QVdGxGuSQtVsq8RZbIpk3g7wtv8f6I / iEC58ekdrH35tq5 + 1ilW dkk9 + rrhUy4qrZ + HFi7AeemybpiumbSnebvnkMaIPAOo23V8C9BQ0iuxx4gIZf10 O + TPSK8 =

----结束SSH2 PUBLIC KEY ----

不是 - >密钥格式似乎是PKCS1所以M2Crypto不起作用(其加载密钥功能需要PEM)

最新阅读我认为是SSH公钥文件格式(RFC:http://www.ietf.org/rfc/rfc4716.txt

我也认为下面的错误,我不认为它处理SSH公钥文件格式:(

看起来像Twisted可能是我应该看的地方

http://www.java2s.com/Open-Source/Python/Network/Twisted/Twisted-1.0.3/Twisted-1.0.3/twisted/conch/ssh/keys.py.htm

为什么SO不允许我立即发布赏金?

2 个答案:

答案 0 :(得分:2)

好的我找到了如何加载它

from twisted.conch.ssh import keys as Keys
import base64

public_key = """\
---- BEGIN SSH2 PUBLIC KEY ----
Comment: "rsa-key-20101003"
AAAAB3NzaC1yc2EAAAABJQAAAgEAi+91fFsxZ7k1UuudSe5gZoavwARUyZScCtdf
WQ0ROoJC+XIqW5vVJfgmr+A1jLS5m4wNsrCqeyoX2B22T6iEwqVXrXt3QcbccKMu
WkLKFK1h67q6Coc+3eOTmKrOuZbWc19YQgybdkR/GxF7XAbq4NCGNaCDtMOqX8Q2
L/a9fAYqVdTwg9trpcz3whNmdLk/B0edOABKuVX51UdLV+ZggK503+uAb1JiIIj0
mARwR/HNo4oRLMLf2PjuZsGVYYjJDdVJBU6AN4PUQSRRRPL4+YmsrLJb/TpfJeXA
vj4KZMNJv15YXz7/iMZMKznDtr2RJX5wbSpuTUBNZveA7YiIHxvvvis38b/lX9SJ
SYPfZ9CeQY6MvQgG2zwDTOOvKgOIB4sTGMXfcoxB8AF/QXOcxWFJkZoj36rvMd9n
Po6szLjHXwcEUOUvvQfG4VvdQA0H5gGLHqYL1EehRsgi5qcCoFPaZW2K09ErKcS0
MbrLFjBkQ9KmqAM38bvM8UhCWAMA9VXOGHMxUHBV4Bir9alGS4VX0B8Y0b3dZ+7I
MKkHMCwdEUJf7QVdGxGuSQtVsq8RZbIpk3g7wtv8f6I/iEC58ekdrH35tq5+1ilW
dkk9+rrhUy4qrZ+HFi7AeemybpiumbSnebvnkMaIPAOo23V8C9BQ0iuxx4gIZf10
o+TPSK8=
---- END SSH2 PUBLIC KEY ----"""

key_data = ''.join(public_key.splitlines()[2:-1])# remove begin, end tags and comment
blob = base64.decodestring(key_data)
key = Keys.Key._fromString_BLOB(blob)

答案 1 :(得分:0)

我能想到至少两个相对简单的选项

  1. 使用OpenSSL(或pyOpenSSL)将BER转换为PEM
  2. 使用paramiko,twisted或任何其他python SSH实现直接使用密钥