【发布时间】:2010-11-22 04:23:50
【问题描述】:
我在名为 varkey 的变量中有一个“公钥”,为了获取公钥,我使用了 urllib 并将该公钥存储在一个变量中。现在我想用公钥加密一个消息/字符串。
如果有人可以带我去某个图书馆,那也没关系。
【问题讨论】:
-
除非您想自己实现加密(我对此表示怀疑),否则您可能应该寻找一个可以满足您需要的库并查看其 API 文档。
标签: python encryption
我在名为 varkey 的变量中有一个“公钥”,为了获取公钥,我使用了 urllib 并将该公钥存储在一个变量中。现在我想用公钥加密一个消息/字符串。
如果有人可以带我去某个图书馆,那也没关系。
【问题讨论】:
标签: python encryption
我的博客文章(John Boker 回答中的passingcurioity.com 链接)使用 M2Crypto 库执行 AES(一种对称加密算法)。 M2Crypto 是围绕 OpenSSL 的 Python 包装器。该 API 几乎是 OpenSSL 到 Python 的直接翻译,因此有些粗略的文档不应该成为太大的问题。如果 M2Crypto 支持您需要使用的公钥加密算法,那么您可以很好地使用它来进行公钥加密。
我发现M2Crypto test suite 是使用其 API 的一个有用示例。特别是 RSA(在 test_rsa.py 中)、PGP(在 test_pgp.py 中)和 EVP(在 test_evp.py 中)测试将帮助您弄清楚如何设置和使用该库。请注意,它们是单元测试,因此要准确确定哪些代码是必要的以及什么是测试的产物可能有点棘手。
PS:由于我是新人,我的帖子只能包含一个链接,所以我不得不删除大部分。对不起。
from M2Crypto import RSA
rsa = RSA.load_pub_key('rsa.pub.pem')
encrypted = rsa.public_encrypt('your message', RSA.pkcs1_oaep_padding)
print encrypted.encode('base64')
【讨论】:
这是演示如何使用 M2Crypto ($ easy_install m2crypto) 加密消息的脚本,假设公钥位于 varkey 变量中:
#!/usr/bin/env python
import urllib2
from M2Crypto import BIO, RSA
def readkey(filename):
try:
key = open(filename).read()
except IOError:
key = urllib2.urlopen(
'http://svn.osafoundation.org/m2crypto/trunk/tests/' + filename
).read()
open(filename, 'w').write(key)
return key
def test():
message = 'disregard the -man- (I mean file) behind curtain'
varkey = readkey('rsa.pub.pem')
# demonstrate how to load key from a string
bio = BIO.MemoryBuffer(varkey)
rsa = RSA.load_pub_key_bio(bio)
# encrypt
encrypted = rsa.public_encrypt(message, RSA.pkcs1_oaep_padding)
print encrypted.encode('base64')
del rsa, bio
# decrypt
read_password = lambda *args: 'qwerty'
rsa = RSA.load_key_string(readkey('rsa.priv2.pem'), read_password)
decrypted = rsa.private_decrypt(encrypted, RSA.pkcs1_oaep_padding)
print decrypted
assert message == decrypted
if __name__ == "__main__":
test()
【讨论】:
根据我最近的 python 经验,python 本身并不做加密。您需要使用外部(第 3 方)包。显然,这些中的每一个都提供了不同的体验。你用的是哪个?这可能会决定您的语法将如何变化。
【讨论】:
您是否听说过“RSAError: data too large for key size”?
用更长的消息试试你的示例:
encrypted = rsa.public_encrypt('My blog post (the passingcuriosity.com link in John Boker's answer) does AES -- a symmetric encryption algorithm -- using the M2Crypto library', RSA.pkcs1_oaep_padding)
【讨论】:
您可以将 MD5 或 SHA1 哈希与您的密钥一起使用...
【讨论】: