📅  最后修改于: 2023-12-03 15:27:37.795000             🧑  作者: Mango
编码填充方法(Padding)是一种在数据块加解密时,对数据块长度不足设定长度的倍数时所采取的一种填充方式。常用的编码填充方法有 PKCS#5、PKCS#7、Zero Padding、ANSI X.923等,其中PKCS#5、PKCS#7是最常使用的两种。
基于PKCS#7,PKCS#5是一种补足不足块长度的方法。在加密时,如果最后一个块的长度不足一个块长度,则填充一个字节。填充字节的二进制位全为填充的字节数,例如:若填充一位,则放入的为[00000001];若填充n位,则放入的为[n..n]。
public static byte[] pkcs5Padding(byte[] data, int blockSize) {
int padding = blockSize - data.length % blockSize;
byte[] result = new byte[data.length + padding];
System.arraycopy(data, 0, result, 0, data.length);
for (int i = 0; i < padding; i++) {
result[data.length + i] = (byte) padding;
}
return result;
}
PKCS#7 编码填充方法是 PKCS#5 编码填充方法的超集,其分组长度可以从 1 到 255 字节,如果原文长度正好是分组长度的整数倍,那么在最后增加一个新块,该块的每个字节填充充数的值,若充数为 8 则填充 8 个字节,充数为 n 则填充 n 个字节。
public static byte[] pkcs7Padding(byte[] data, int blockSize) {
int padding = blockSize - data.length % blockSize;
byte[] result = new byte[data.length + padding];
System.arraycopy(data, 0, result, 0, data.length);
for (int i = 0; i < padding; i++) {
result[data.length + i] = (byte) padding;
}
return result;
}
Zero Padding 补充的是一个块内所有位全部为 0,常用于加密数据的块长度为 8 位的倍数时,例如 DES 算法。
public static byte[] zeroPadding(byte[] data, int blockSize) {
int padding = blockSize - data.length % blockSize;
byte[] result = new byte[data.length + padding];
System.arraycopy(data, 0, result, 0, data.length);
return result;
}
ANSI X.923 编码填充方法是在数据块的最后一个字节填充数据块填充的字节数,其余字节填 充 0.
public static byte[] ansix923Padding(byte[] data, int blockSize) {
int padding = blockSize - data.length % blockSize;
byte[] result = new byte[data.length + padding];
System.arraycopy(data, 0, result, 0, data.length);
for (int i = 1; i <= padding; i++) {
result[data.length + i - 1] = (byte) padding;
}
return result;
}
编码填充方法是在数据块加解密时常常用到的一种技术。根据不同的算法和需求,程序员可以选择不同的编码填充方法。在选择填充方法时,可以根据实际需要来做出选择,以保证程序的运行效率和数据安全。