【发布时间】:2018-11-26 04:01:32
【问题描述】:
我正在用 java 构建一个加密工具。我得到了这个方法:
public byte[] blockEncrypt(byte[] b) {
//...
}
以一个 16 字节的数组作为参数。但我不希望用户自己拆分字节,所以我创建了这个方法:
public byte[] encrypt(final byte[] plain) {
int remainder = plain.length % blockSize();
// I create the final array of size modulo blockSize
byte[] encrypted = new byte[plain.length - remainder + (remainder == 0 ? 0 : blockSize())];
// Here the array is splitted
byte[][] splitted = CryptoUtil.splitBytes(plain, blockSize());
// I pad the last block if the argument is not modulo blockSize (with '=')
if (plain.length % blockSize() != 0) {
byte[] last = new byte[blockSize()];
CryptoUtil.fill(last, (byte) 0x3D);
System.arraycopy(splitted[splitted.length - 1], 0, last, 0, splitted[splitted.length - 1].length);
splitted[splitted.length - 1] = last;
}
for (int i = 0; i < splitted.length; i++) {
System.arraycopy(blockEncrypt(splitted[i], 0), 0, encrypted, i * blockSize(), blockSize());
}
return encrypted;
}
这段代码根本不起作用(而且很乱)。我根本不在乎它是如何实现的,我只想处理参数中的所有数据,每 16 个字节 16 个字节。有没有人有这个方法? 最后一个非完整块应调整为 16(通过添加空字节或任何内容)。 提前感谢您的帮助。
【问题讨论】:
-
所以您的目标是将
byte[]拆分为byte[][16]? -
1.如果您知道“很乱”,请清理它,这将更容易理解/调试。 2. 使用PKCS#7 padding,空填充不适用于二进制数据。