如何使用密钥加密字符串

2 投票
6 回答
16253 浏览
提问于 2025-04-15 13:49

我有一个叫做 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=

撰写回答