gpt4 book ai didi

Java:用 ASCII 0 (NULL) 将字符串填充为 16 字节的倍数

转载 作者:行者123 更新时间:2023-11-30 06:55:38 25 4
gpt4 key购买 nike

在java中向字符串末尾添加空填充的最简单方法是什么?这是加密过程中的预处理步骤,因此生成的字符串必须是 16 字节的倍数。

第一次尝试只是将字符串 1 与包含 null 的字符串相加。但这不起作用,因为 null 变成了单词“null”。

第二次尝试:将字符串转换为字节,并以某种方式附加空字节,但我无法想出一种方法来实现这一点。

第三次尝试:初始化一个已知大尺寸的字节数组,例如 128 减去字符串中的字节长度,然后将字符串转换为字节,将两个数组复制在一起。所以类似:

String stringToEncrypt = "some data" ;
byte[] stringToEncryptBytes = stringToEncrypt.getBytes("UTF-8");
int stringToEncryptByteLength = stringToEncryptBytes.length;

int sizeOfNullArray = 128 - stringToEncryptByteLength;
byte[] byteBlockOfNulls = new byte[sizeOfNullArray] ;

byte[] finalBytes = new byte[stringToEncryptByteLength + sizeOfNullArray];
System.arraycopy(stringToEncryptBytes, 0, finalBytes, 0, stringToEncryptByteLength);
System.arraycopy(byteBlockOfNulls, 0, finalBytes, stringToEncryptByteLength, sizeOfNullArray);

但是当我将字节数组转换回字符串时,它只是乱码。所以我一定做错了什么。

最佳答案

当您说“这是加密过程中的预处理步骤”时,您是在谈论填充要加密的明文以达到 block 边界,还是 key 拉伸(stretch)> 形成适当长度的 key ? “空填充”在两者中都不是理想的,但它在 key 派生中是​​非常危险的。

如果您的问题是前者,您可能想使用 PKCS7Padding (在 Java 中也称为 PKCS5Padding),其中 works in the following manner :

  • 如果消息长度小于完整 block 边界(即 lengthBytes % 16 != 0),则最后一个 block 将用 N 个字节填充,其中 >N = 16 - (lengthBytes % 16),每个字节的值为N。例如,如果最后一个 block 是 13 字节,则将用 0x03 0x03 0x03 填充以达到 16 的长度。
  • 如果消息长度是 block 大小的精确倍数(即 lengthBytes % 16 == 0),则会添加 0x10 的完整 block (16 字节) .

上面的链接解释了完整的原因。由于多种原因,不建议使用零填充/空填充方案。

如果这实际上是一个关于如何实现练习代码的问题,则以下方法有效(在单个 block 上操作,而不是完整的明文):

String plaintext = "This is text"; // 12 bytes
byte[] plainBytes = plaintext.getBytes(StandardCharsets.UTF_8);
byte[] paddedBytes = new byte[16];
System.arraycopy(plainBytes, 0, paddedBytes, 0, plainBytes.length);

assert paddedBytes.length == 16;
assert paddedBytes[12] == (byte) 0x00;
assert paddedBytes[13] == (byte) 0x00;
assert paddedBytes[14] == (byte) 0x00;
assert paddedBytes[15] == (byte) 0x00;

如果转换回字符串,生成的字节数组将如下所示。

This is text    | <-- There will be four "unprintable character" indicators because 0x00 is not a printable character in UTF-8

关于Java:用 ASCII 0 (NULL) 将字符串填充为 16 字节的倍数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41882474/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com