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)
    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 result

测试网页:
http://tool.chacuo.net/crypt3des

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

ValueError: Not a valid TDES key

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

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