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