如何使用密钥加密字符串
我有一个叫做 varkey 的变量,里面存着一个“公钥”。我用 urllib 这个工具获取了这个公钥,并把它存到了这个变量里。现在我想用这个公钥来加密一段消息或者字符串。
如果有人能推荐我一些相关的库就太好了。
6 个回答
1
根据我最近的Python经验,Python本身并不支持加密功能。你需要使用一个外部的(第三方)库。每个库提供的体验都不一样。你在用哪个库呢?这可能会影响你代码的写法。
3
下面这个脚本展示了如何使用 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()
输出结果
gyLD3B6jXspHu+o7M/TGLAqALihw7183E2effp9ALYfu8azYEPwMpjbw9nVSwJ4VvX3TBa4V0HAU n6x3xslvOnegv8dv3MestEcTH9b3r2U1rsKJc1buouuc+MR77Powj9JOdizQPT22HQ2VpEAKFMK+ 8zHbkJkgh4K5XUejmIk= disregard the -man- (I mean file) behind curtain
7
我的博客文章(在John Boker的回答中提到的passingcuriosity.com链接)讲的是AES加密,这是一种对称加密算法,使用的是M2Crypto库。M2Crypto是一个Python库,它是OpenSSL的一个封装。这个库的接口基本上就是把OpenSSL的功能直接翻译成Python,所以虽然文档可能有点简陋,但应该不会太难理解。如果你需要使用的公钥加密算法被M2Crypto支持,那么你可以用它来进行公钥加密。
我发现M2Crypto测试套件是一个很好的使用示例。特别是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')
输出
X3iTasRwRdW0qPRQBXiKN5zvPa3LBiCDnA3HLH172wXTEr4LNq2Kl32PCcXpIMxh7j9CmysLyWu5 GLQ18rUNqi9ydG4ihwz3v3xeNMG9O3/Oc1XsHqqIRI8MrCWTTEbAWaXFX1YVulVLaVy0elODECKV 4e9gCN+5dx/aG9LtPOE=