SM4/CBC/PKCS5Padding 和 SM4/CBC/PKCS7Padding
时间: 2025-01-23 16:01:22 浏览: 73
### SM4 加密算法在 CBC 模式下的 PKCS5Padding 和 PKCS7Padding 填充方式比较
#### 数据填充机制概述
数据加密过程中,当明文长度不是分组大小的整数倍时,需要对最后一个不完整的分组进行填充。PKCS5Padding 和 PKCS7Padding 是两种常见的填充方案。
#### PKCS5Padding 特点
PKCS5Padding 主要用于 DES、AES 等 8 字节分组密码算法。该方法规定如果最后一块不足 8 字节,则用相同的字节数来填补剩余空间[^2]。例如:
- 如果最后剩下 3 字节未填满,则补充 5 个 `0x05`;
- 若正好为 8 的倍数,则额外增加一整个新的全为 `0x08` 的区块作为填充。
```java
// Java 中使用 PKCS5Padding 进行填充的例子
Cipher cipher = Cipher.getInstance("SM4/CBC/PKCS5Padding");
SecretKeySpec keySpec = new SecretKeySpec(key.getBytes(), "SM4");
cipher.init(Cipher.ENCRYPT_MODE, keySpec);
byte[] encryptedData = cipher.doFinal(plainText.getBytes());
```
#### PKCS7Padding 特点
PKCS7Padding 更具通用性,适用于任意长度的分组密码。对于每个可能的数据单元尺寸(通常指一个字节),它会向消息结尾追加若干个相同数值的字节直到达到所需边界条件;这个值等于所添加总数量本身[^1]。具体表现为:
- 对于任何小于或等于最大分组大小的情况都适用;
- 当输入刚好匹配分组界限时不作特殊处理而是正常加入完整的一轮填充。
```java
// Java 中使用 PKCS7Padding 进行填充的例子
Cipher cipher = Cipher.getInstance("SM4/CBC/PKCSPadding"); // 注意这里应更正为标准名称如"PCKS7"
SecretKeySpec keySpec = new SecretKeySpec(key.getBytes(), "SM4");
IvParameterSpec ivSpec = new IvParameterSpec(ivBytes);
cipher.init(Cipher.ENCRYPT_MODE, keySpec, ivSpec);
byte[] encryptedData = cipher.doFinal(plainText.getBytes());
```
需要注意的是,在实际编程实践中,“PCKS7”可能是笔误或者是某些库特有的命名约定,应当查阅文档确认支持的具体字符串表示形式。
阅读全文
相关推荐


















