python实现PKCS5Padding

理解PKCS5Padding与PKCS7Padding的区别与实现
本文深入探讨了PKCS5Padding和PKCS7Padding两种填充方式的区别,包括它们在处理块大小和填充字符上的不同,并通过代码示例展示了如何实现这两种填充方式。

    在PKCS5Padding中,明确定义Block的大小是8位
    而在PKCS7Padding定义中,对于块的大小是不确定的,可以在1-255之间


    PKCS #7 填充字符串由一个字节序列组成,每个字节填充该字节序列的长度。
    假定块长度为 8,数据长度为 9,
    数据: FF FF FF FF FF FF FF FF FF
    PKCS7 填充: FF FF FF FF FF FF FF FF FF 07 07 07 07 07 07 07


    def nrPadBytes(blocksize, size):
      'Return number of required pad bytes for block of size.'
      if not (0 < blocksize < 255):
        raise Error('blocksize must be between 0 and 255')
      return blocksize - (size % blocksize)


    def appendPadding(blocksize, s):
      '''Append rfc 1423 padding to string.


      RFC 1423 algorithm adds 1 up to blocksize padding bytes to string s. Each
      padding byte contains the number of padding bytes.
      '''
      n = nrPadBytes(blocksize, len(s))
      return s + (chr(n) * n)


    def removePadding(blocksize, s):
      'Remove rfc 1423 padding from string.'
      n = ord(s[-1]) # last byte contains number of padding bytes
      if n > blocksize or n > len(s):
        raise Error('invalid padding')
      return s[:-n]


    PKCS5的另一种


                pad_len = 8 - (len(data) % self.block_size)
                if _pythonMajorVersion < 3:
                    data += pad_len * chr(pad_len)
                else:
                    data += bytes([pad_len] * pad_len)
                if _pythonMajorVersion < 3:
                    pad_len = ord(data[-1])
                else:
                    pad_len = data[-1]
                data = data[:-pad_len]


    第3种
    pad = lambda s: s + (BS - len(s) % BS) * chr(BS - len(s) % BS)
    unpad = lambda s : s[0:-ord(s[-1])]

### Python 中 AES-CBC-PKCS5Padding 实现 为了在Python实现AES加密算法的CBC模式并采用PKCS5填充,可以利用`pycryptodome`库来完成这一操作。下面提供了一个完整的例子,展示了如何进行数据的加密和解密。 #### 安装依赖包 首先需要安装 `pycryptodome` 库,可以通过pip命令轻松安装: ```bash pip install pycryptodome ``` #### 数据准备与处理函数定义 对于输入的数据,在执行加密之前应当确保其长度为区块大小(通常是16字节)的整数倍。如果不足,则需按照指定的方式补充至合适长度;而在解密之后也需要去除这些额外添加的部分以恢复原始消息[^2]。 #### 加密过程 创建一个用于加密的方法如下所示: ```python from Crypto.Cipher import AES import base64 def pad(text, block_size=16): """根据PKCS5标准对文本进行补位""" text_length = len(text) amount_to_pad = block_size - (text_length % block_size) if amount_to_pad == 0: amount_to_pad = block_size padding = chr(amount_to_pad) * amount_to_pad return str.encode(text + padding) def encrypt(plain_text, key, iv): cipher = AES.new(key=key, mode=AES.MODE_CBC, IV=iv) encrypted_bytes = cipher.encrypt(pad(plain_text)) return base64.b64encode(encrypted_bytes).decode('utf-8') ``` 此部分实现了基于给定秘钥key以及初始化向量IV下的字符串加密功能,并返回经过Base64编码后的结果以便于传输或存储。 #### 解密过程 相应地,这里也给出了解码的过程: ```python def unpad(padded_text): unpadder = ord(padded_text[-1]) if unpadder < 1 or unpadder > 32: pass return padded_text[:-unpadder] def decrypt(ciphered_base64, key, iv): raw_cipher_data = base64.b64decode(ciphered_base64) cipher = AES.new(key=key, mode=AES.MODE_CBC, IV=iv) decrypted_bytes = cipher.decrypt(raw_cipher_data) return unpad(decrypted_bytes.decode()) ``` 上述代码片段完成了接收已编码的信息作为参数传入,通过逆运算还原成最初的明文形式。 #### 测试实例 最后附上一段简单的测试程序验证以上两个主要逻辑单元的功能是否正常工作: ```python if __name__ == "__main__": secret_key = b'your_secret_key_' init_vector = b'initializationVe' original_message = "你好世界" encoded_msg = encrypt(original_message, secret_key, init_vector) print(f"Encrypted message: {encoded_msg}") decoded_msg = decrypt(encoded_msg, secret_key, init_vector) print(f"Decoded message :{decoded_msg}") ``` 这段脚本会输出加密前后的信息对比,从而直观展示整个流程的效果。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值