Python有着丰富的类库,可以快速实现基于DES的加密和解密。下面就是简单的几行代码就可以实现DES-CBC,采用PKCS5进行填充的标准加密和解密。
import pyDes,base64
def __encrypt(data,key):
des=pyDes.des(key,pyDes.CBC,b" ", pad=None, padmode=pyDes.PAD_PKCS5)
ecryptdata=des.encrypt(data)
return bytes.decode(base64.b64encode(ecryptdata)) #base64 encoding bytes
def __decrypt(ecryptdata,key):
des=pyDes.des(key,pyDes.CBC,b" ", pad=None, padmode=pyDes.PAD_PKCS5)
data=des.decrypt(base64.b64decode(ecryptdata)) #base64 decoding bytes
return bytes.decode(data)
需要指出的是,Python支持的DES-CBC,key是8位的,建议采用安全性更高的DES-EDE-CBC或DES-EDE3-CBC, 使用 pycryptodome做3DES,参考代码如下:
import Crypto
import pyDes,base64
from Crypto.Cipher import DES3
from Crypto.Random import get_random_bytes
def _pad(bStr:bytes):
blen=len(bStr)
add=8-(blen%8)
buffer=bStr+add*chr(0).encode()
return buffer
key=DES3.adjust_key_parity(get_random_bytes(16))
cipher=DES3.new(key,DES3.MODE_CBC)
cipherdata=cipher.encrypt(_pad(b'Hello world'))
ciphertext=bytes.decode(base64.b64encode(cipherdata))
print(ciphertext)
以上是非常简单的代码,根据实际应用场景,需要自己再封装另外的代码。
1. 密码等信息加密后存放在配置文件,针对这种场景,你往往需要解密的程序不需要再用一个key,而是一个简单调用,就可以获得源字符串。这个时候,可以考虑这样:
1) 每次加密产生一个随机密钥,密钥混淆在最终的密文中。
def __createkey():
N=8
newkey=''.join(secrets.choice(string.ascii_letters+string.digits) for i in range(N))
return newkey
2)因为密钥混淆在最终的密文中,所以风险在于被第三人截取或者破解出密钥。所以需要对于你把随机密钥作为一个种子密钥来产生一个用于加密和解密的真正密钥,建立一个显示密钥=>真正的密钥=>密文, 其中复杂度就仁者见仁,智者见智了。
但是考虑到只是用来解决应用的关键配置信息不是明码保存,所以DES加上混淆处理,还是有很大的适用性。一个推荐的思路:种子密钥做MD5摘要后,产生的16个字节,可以分别作为一个8字节的key和8字节的IV。至于如何来分配者16个字节,就看你怎么做了。
2.希望输入一串密码来加密内容或者解密,这个适合不需要在算法上做过分复杂的定制,因为所产生的种子密钥是由外部输入的。这个思路也是可以适用第一种场景,每个应用程序可以用不同的密码来解开配置文件中的加密内容。同时也不用在密文中混入种子密钥。
类似可以构建一个这样的程序
Python是解释性语言,即便编译过的pyc都避免不了反向工程的,可以把关键的加密和解密编译成pyd,从而提高安全性。



