Python版本的desede/CBC/PKCS5Padding加密

环境 && 依赖

Python版本是3.7.7

python3 --version
Python 3.7.7

因为要使用pycryptodome,需要先卸载pycrypto,pydes:

pip3 uninstall pycrypto

pip3 uninstall pydes

pip3 install pycryptodome

参考代码:

from Crypto.Cipher import DES3
import base64

def getDES3Token(text):
    #PKCS5Padding
    #字符串长度需要是8的倍数
    BS = 8
    pad = lambda s: s + (BS - len(s) % BS) * chr(BS - len(s) % BS).encode() 
    unpad = lambda s : s[0:-ord(s[-1])]

    #后端给的key是 YcwjZGpmZZhpAmtsbW5qcHFyc3R1pnd4 长度位32位
    #注意3DES的MODE_CBC模式下只有前24位有意义
    #key和iv都需要是bytearray
    key = b'YcwjZGpmZZhpAmtsbW5qcHFy'
    iv = b'123ab321'

    #text也需要encode成bytearray
    plaintext = pad(text.encode()) 

    #使用MODE_CBC创建cipher
    cipher = DES3.new(key, DES3.MODE_CBC, iv)

    #加密
    result = cipher.encrypt(plaintext)

    #base64 encode
    result = base64.b64encode(result)

    return str(result, encoding='utf-8').replace('\n', '')

另附热心大佬说明:

对于 key不满足24位问题一般做法是通过填充0解决

b_key = str.encode(key)[:24] 
b_key += (24 - len(b_key)) * b'\0'

测试网页:

http://tool.chacuo.net/crypt3des

遇到的问题:

Java版本的desede/CBC/PKCS5Padding使用超过24位的key是不会报错的,代码会自动取前面24位
Python版本就会报错:

ValueError: Not a valid TDES key

和java后台联调时需要注意

文档:

https://pycryptodome.readthedocs.io/en/latest/src/introduction.html

标签:python, 3des, des3, cbc, pkcs5padding, java, pycryptodome, python3, tdes