【问题标题】:simple encrypt/decrypt lib in python with private key使用私钥在python中简单的加密/解密库
【发布时间】:2011-04-18 10:57:33
【问题描述】:

有没有一种简单的方法可以用密钥加密/解密字符串?

类似:

key = '1234'
string =  'hello world'
encrypted_string = encrypt(key, string)
decrypt(key, encrypted_string)

我找不到任何简单的方法来做到这一点。

【问题讨论】:

  • 您是否已经搜索过 RSAPython

标签: python encryption


【解决方案1】:

pyDES是完全用python编写的DES和Triple-DES实现。

这是一个简单且可移植的示例,它应该足够安全,可以满足基本的字符串加密需求。只需将 pyDES 模块与您的程序放在同一个文件夹中并尝试一下:

发件人的计算机

>>> from pyDES import *  # pyDes if installed from pip
>>> ciphertext = triple_des('a 16 or 24 byte password').encrypt("secret message", padmode=2)  #plain-text usually needs padding, but padmode = 2 handles that automatically
>>> ciphertext
')\xd8\xbfFn#EY\xcbiH\xfa\x18\xb4\xf7\xa2'  #gibberish

收件人的计算机

>>> from pyDES import *
>>> plain_text = triple_des('a 16 or 24 byte password').decrypt(')\xd8\xbfFn#EY\xcbiH\xfa\x18\xb4\xf7\xa2', padmode=2)
>>> plain_text
"secret message"

收件人计算机

的代码中的Python3 可能会出现错误

ValueError: pyDes can only work with encoded strings, not Unicode.

from pyDes import *

a = b')\xd8\xbfFn#EY\xcbiH\xfa\x18\xb4\xf7\xa2'
plain_text = triple_des('a 16 or 24 byte password').decrypt(a, padmode=2)
print(plain_text)

只需在加密文本的开头添加b。为了使代码更清晰,请将其分配给一个新变量(在本例中为a,并以正常方式解密a)。

【讨论】:

  • 谢谢!我一直在寻找一个纯 python 加密/解密方案(所以它实际上是可移植的),这是我偶然发现的唯一一个。
  • 次要评论,你在前 2 个 sn-ps 中有 from pyDES import *,应该是 from pyDes import *,就像在第三个中一样 :)
【解决方案2】:

http://www.dlitz.net/software/pycrypto/ 应该做你想做的事。

取自他们的文档页面。

>>> from Crypto.Cipher import DES
>>> obj=DES.new('abcdefgh', DES.MODE_ECB)
>>> plain="Guido van Rossum is a space alien."
>>> len(plain)
34
>>> obj.encrypt(plain)
Traceback (innermost last):
  File "<stdin>", line 1, in ?
ValueError: Strings for DES must be a multiple of 8 in length
>>> ciph=obj.encrypt(plain+'XXXXXX')
>>> ciph
'\021,\343Nq\214DY\337T\342pA\372\255\311s\210\363,\300j\330\250\312\347\342I\3215w\03561\303dgb/\006'
>>> obj.decrypt(ciph)
'Guido van Rossum is a space alien.XXXXXX'

【讨论】:

    【解决方案3】:

    对于 python 2,你应该使用 keyczar http://www.keyczar.org/

    对于 python 3,在 keyczar 可用之前,我已经编写了 simple-crypt http://pypi.python.org/pypi/simple-crypt

    我迟到两年才回答这个问题,因为自从提出问题以来情况发生了变化。

    请注意,此问题的先前答案使用弱密码(按照今天的标准)并且没有任何密钥加强。这里的两个建议可能更安全。

    【讨论】:

    【解决方案4】:

    扩展 dsamersoff 的答案。这简单且不安全,但对于某些任务可能有用。这是一些代码:

    import crypt
    import getpass
    import os.path
    
    def auth_func():
        return (raw_input('Username:'), getpass.getpass('Password:'))
    
    def xor(a,b):
        assert len(b) >= len(a)
        return "".join([chr( ord(a[i]) ^ ord(b[i])) for i in range(len(a))])
    
    # create a new credentials file if needed
    if not os.path.exists('cred'):
        with open('cred', 'w') as f:
            user, pwd =  auth_func()
            f.write ("{}\n".format(user))               
            f.write ("{}\n".format(xor(pwd, crypt.crypt('secret', 'words'))))
            f.close()
    
    # read credentials and print user/password
    with open('cred', 'r') as f:
        user, pwd = f.read().split('\n')[:2]
        print user
        print xor(pwd, crypt.crypt('secret', 'words'))
    

    【讨论】:

      【解决方案5】:

      使用预发密钥加密短文本片段的最简单、最快的方法是使用一种加密哈希函数(md5、sha 等)。

      即计算您的密钥的 md5,然后使用此 md5 哈希对您的字符串片段进行异或运算。如果您需要对长度超过 md5 的文本片段进行编码 - 执行 md5(md5 hash) 并加密下一个片段。

      此解决方案的安全性比 3-DES 差,但在一般情况下就足够了(即在配置文件中存储不太安全的密码),并且除了基本的 python 发行版之外不需要任何东西。

      如果您需要更好的安全性 - 寻找 AES、Blowfish 等实现之一,但要真正使 AES 受益,您需要做一些额外的工作来将您的数据与随机数据混合。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-05-12
        • 1970-01-01
        • 1970-01-01
        • 2022-10-20
        • 2011-04-06
        • 1970-01-01
        • 2020-02-28
        • 2010-11-12
        相关资源
        最近更新 更多