【问题标题】:How to encrypt a string using the key如何使用密钥加密字符串
【发布时间】:2010-11-22 04:23:50
【问题描述】:

我在名为 varkey 的变量中有一个“公钥”,为了获取公钥,我使用了 urllib 并将该公钥存储在一个变量中。现在我想用公钥加密一个消息/字符串。

如果有人可以带我去某个图书馆,那也没关系。

【问题讨论】:

  • 除非您想自己实现加密(我对此表示怀疑),否则您可能应该寻找一个可以满足您需要的库并查看其 API 文档。

标签: python encryption


【解决方案1】:

我的博客文章(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')

输出

X3iTasRwRdW0qPRQBXiKN5zvPa3LBiCDnA3HLH172wXTEr4LNq2Kl32PCcXpIMxh7j9CmysLyWu5 GLQ18rUNqi9ydG4ihwz3v3xeNMG9O3/Oc1XsHqqIRI8MrCWTTEbAWaXFX1YVulVLaVy0elODECKV 4e9gCN+5dx/aG9LtPOE=

【讨论】:

    【解决方案2】:

    这是演示如何使用 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= 无视幕后的-man-(我的意思是文件)

    【讨论】:

      【解决方案3】:

      根据我最近的 python 经验,python 本身并不做加密。您需要使用外部(第 3 方)包。显然,这些中的每一个都提供了不同的体验。你用的是哪个?这可能会决定您的语法将如何变化。

      【讨论】:

        【解决方案4】:
        【解决方案5】:

        您是否听说过“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)
        

        【讨论】:

        • 这篇文章似乎应该是对最高投票答案的评论,而不是单独的帖子。也许将其作为评论移至并删除此“答案”。
        【解决方案6】:

        您可以将 MD5 或 SHA1 哈希与您的密钥一起使用...

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-08-07
          • 2015-11-02
          • 2023-04-04
          • 2011-06-17
          • 1970-01-01
          • 1970-01-01
          • 2021-04-01
          • 2012-11-20
          相关资源
          最近更新 更多