PyDes中pad mode简单研究

本文详细解释了padmode填充模式的工作原理,特别是在pyDes库中使用CBC模式时,如何处理数据长度不足block长度的情况。通过具体示例展示了PAD_PKCS5和PAD_NORMAL两种填充模式的区别,并说明了填充模式在不同场景下的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

pad mode主要是填充模式,一般是按照8 bytes的数据block长度,在data长度不足block长度或倍数的时候给你补齐。

举个例子:

#use DES cipher
from pyDes import CBC,des,PAD_PKCS5,PAD_NORMAL
import binascii
key = "1234567812345678"
key = bytearray.fromhex(key)
print("key: \t", key, " len: ", len(key))
iv = b"\0\0\0\0\0\0\0\0"
deser = des(key, CBC, iv, pad=None, padmode=PAD_PKCS5)
print("randomNoStr: \t", randomNoStr, " len: ", len(randomNoStr))
cipherText = deser.encrypt(randomNoStr)
print("cipherText: \t", cipherText, " len: ", len(cipherText))
#import array
print("\tb2a_hex: \t", binascii.b2a_hex(cipherText), " len: ", len(cipherText))
clearText = deser.decrypt(cipherText)
print("clearText: \t", binascii.b2a_hex(clearText))

data 设为8 bytes 16进制的: 87A7097795A865AA
看看你得到了啥:
ciphertext: 1f44d34fb7216844eb4f598a1c871f86
在C语言下,得到的可是:1f44d34fb7216844
多了一截: eb4f598a1c871f86

这是因为这个pad mode设置的PAD_PKCS5填充模式,会按照该模式指定的方式,往传入的data后面塞数据,给你8 bytes填充成16个bytes。
可是我特么8 bytes的key,8 bytes的data,走的还是ECB单加密,我要你填充个毛线啊。

至于这个填充规律是啥,暂时还没研究出来,有空查查RFC,或许有答案。

把padmode从PAD_PKCS5 改为 PAD_NORMAL 不填充,结果就好了。1f44d34fb7216844

import pyDes # 定义三个密钥,每个密钥必须是8字节长 key1 = b'12345678' key2 = b'abcdefgh' key3 = b'12345678' # 如果只需要两组密钥,则本组密钥可以和密钥1一样 # 要加密的数据 data = b'Cryptosystemlab' # 打印输入数据 print("\n++++++++3DES加密示例++++++++") print("3DES[输入]明文:", data) print("3DES[输入]密钥1:", key1) print("3DES[输入]密钥2:", key2) print("3DES[输入]密钥3:", key3) # 初始化DES对象 def des_encrypt(key, data): des = pyDes.des(key, pyDes.CBC, b"\0\0\0\0\0\0\0\0", pad=None, padmode=pyDes.PAD_PKCS5) return des.encrypt(data) def des_decrypt(key, data): des = pyDes.des(key, pyDes.CBC, b"\0\0\0\0\0\0\0\0", pad=None, padmode=pyDes.PAD_PKCS5) return des.decrypt(data) # 3DES加密:Encrypt with key1, Decrypt with key2, Encrypt with key3 encrypted_step1 = des_encrypt(key1, data) encrypted_step2 = des_decrypt(key2, encrypted_step1) encrypted_data = des_encrypt(key3, encrypted_step2) # 打印加密后的数据 print("3DES[输出]密文:", encrypted_data) # 3DES解密:Decrypt with key3, Encrypt with key2, Decrypt with key1 decrypted_step1 = des_decrypt(key3, encrypted_data) decrypted_step2 = des_encrypt(key2, decrypted_step1) decrypted_data = des_decrypt(key1, decrypted_step2) # 打印解密后的数据 print("\n++++++++3DES解密示例++++++++") print("3DES[输入]密文:", encrypted_data) print("3DES[输入]密钥1:", key1) print("3DES[输入]密钥2:", key2) print("3DES[输入]密钥3:", key3) print("3DES[输出]明文:", decrypted_data.decode())
最新发布
03-12
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值