如何在Python中使用ECB模式192位密钥的3DES算法加密消息
3DES ECB 192位密钥Python加密实现方案
依赖安装
首先安装加密依赖库:
pip install pycryptodome
报错原因
你遇到的ValueError("Not a valid TDES key")错误核心原因是传入的密钥长度不符合3DES算法规范:3DES算法仅支持16字节(128位)或24字节(192位)长度的密钥,你原代码中传入的密钥长度远大于24字节,因此触发报错。
除此之外原代码还存在以下问题:
- 未导入base64模块,也未实现PKCS5填充逻辑,运行时会抛出其他异常
- 加密前的编码逻辑顺序错误,应该先把明文转字节再做填充,原代码先填充再编码会导致填充长度计算错误
- 变量名笔误:3DES实例被错误命名为aes
正确可运行实现
以下实现和参考的Java版加密逻辑完全对齐,加密结果可以和Java实现互通:
from Crypto.Cipher import DES3 import base64 # PKCS5填充实现,3DES块大小固定为8字节 def pkcs5_pad(data: bytes, block_size: int = 8) -> bytes: padding_len = block_size - len(data) % block_size return data + bytes([padding_len]) * padding_len def encrypt_3des_ecb(plaintext: str, secret_key: str) -> str: # 取密钥前24字节作为192位有效密钥,和Java DESedeKeySpec逻辑对齐 key_bytes = secret_key.encode("utf-8")[:24] # 初始化3DES ECB模式加密实例 cipher = DES3.new(key_bytes, DES3.MODE_ECB) # 明文转字节后做填充 padded_plaintext = pkcs5_pad(plaintext.encode("utf-8")) # 加密后转base64,去除换行符和回车符和Java逻辑对齐 encrypted_bytes = cipher.encrypt(padded_plaintext) return base64.b64encode(encrypted_bytes).decode("utf-8").replace("\r", "").replace("\n", "") # 使用示例 if __name__ == "__main__": # 替换为你的实际密钥和待加密明文 your_key = "M4H5DE7mHXMS219b8adm9H4WFTElLfa26e7s3U7dBgT2hegt5fMq5aRfEv3345uiZh2zGxRPaBT663669mb01MCU9OHz2glYb2aOco5vJfoN9LKjxjOIZE64Jd4t9FUQ1F043TvRp4CwBX7Ug8Dp9fV25Zs4m7Z5DIL7H7D617jVcXLHT5Z83atR1sQcJpEG" test_plaintext = "测试待加密内容" print(encrypt_3des_ecb(test_plaintext, your_key))
注意事项
- ECB模式安全性较低,生产环境如果允许建议更换为CBC等更安全的加密模式
- 密钥请做好保密存储,不要硬编码到业务代码中
内容的提问来源于stack exchange,提问作者xyyHIT
相关产品推荐
相关产品推荐

