使用私钥在python中简单加密/解密lib

时间:2010-09-28 17:57:33

标签: python encryption

是否有一种使用密钥加密/解密字符串的简单方法。

像:

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

我找不到任何简单的事情。

5 个答案:

答案 0 :(得分:23)

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"

答案 1 :(得分:22)

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'

答案 2 :(得分:10)

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

对于python 3,直到keyczar可用,我写了simple-crypt http://pypi.python.org/pypi/simple-crypt

我问这个问题后,事情发生了变化,我迟到了这两年。

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

答案 3 :(得分:1)

使用预共享密钥加密短文本片段的最简单,最快捷的方法是使用cryptohash函数之一(md5,sha等)。

即。你的密钥的计算md5,然后xor你的字符串片段与此md5哈希。如果你需要编码长度超过md5的文本片段 - 执行md5(md5哈希)并加密下一个片段。

此解决方案的安全性比使用3-DES更糟糕,但在平均情况下足够(即在配置文件中存储不是非常安全的密码)除了基本python发行版之外它没有任何要求。

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

答案 4 :(得分:1)

扩展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'))