Python非对称加密:使用预生成的私钥/公钥
首先,我确实在谷歌和StackOverflow上搜索过,花了超过4个小时的时间,但还是没有找到我需要的东西,原因如下:
很多人建议直接运行一个exe文件,比如gpg.exe (http://stackoverflow.com/questions/1020320)
有些人建议使用PyCrypto或其他库,但我发现要么是a) 我找不到如何使用它们的API,要么是b) 我找不到如何导入一个已经存在的私钥/公钥,要么是c) 它们使用了不安全的RandomPool(而我尝试更新它只会带来麻烦)
有些人提到过,但我找不到他们所链接的内容(或者根本没有链接)。
所以我现在想请教各位StackOverflow的用户,我该如何做呢?我想用一个公钥的字符串(或者路径,我可以把它写入一个临时文件,计划是把它作为字符串 pub_key = "...")来签名和保护一个字符串(这个字符串会在一个论坛上发布,作为更新我应用程序的JSON)?
另外,这些是RSA密钥(Putty Gen生成的4096位SSH-2-RSA),可以是任何格式(OpenSSH、ssh.com、ppk)。
这是公钥的样子:
---- 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 ----
不是这个 --> 密钥格式似乎是PKCS1,所以M2Crypto将无法工作(它的加载密钥功能期望PEM格式)
我最近的阅读认为它是SSH公钥文件格式(RFC: http://www.ietf.org/rfc/rfc4716.txt)
我还认为下面的内容是错误的,我觉得它不处理SSH公钥文件格式 :(
看起来Twisted可能是我应该关注的地方。
另外,为什么StackOverflow不允许我立即发布悬赏呢??
2 个回答
我能想到至少两个比较简单的方法:
- 使用OpenSSL(或者pyOpenSSL)把BER格式转换成PEM格式。
- 使用paramiko、twisted或者其他任何Python的SSH实现,直接处理这些密钥。
好的,我找到了怎么加载它的方法。
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)