gpt4 book ai didi

java - 我使用 AES 算法加密 32 字节长度的数据,结果(密文)是 64 字节长度,这有效吗?

转载 作者:行者123 更新时间:2023-12-01 18:58:19 27 4
gpt4 key购买 nike

我通过 java 、 BouncyCaSTLe Provider 实现这个使用 block 模式 = ECB 和填充模式 = PKCS7Padding

我注意到,如果我加密32字节长度的数据(例如61626162616261626162616261626162,这是ababababababababab的十六进制值),我会得到64字节长度的密文(f21ee0564ebd5274e10bf4590594b1e16a19592b917 b19ee106f71d41d165289) 这个密文有效吗?从我读到的内容来看,如果您加密小于 32 字节长度的数据,算法会将其填充到 32 字节长度并生成 32 字节长度的密文,但如果您输入正好 32 字节长度的数据,您不应该收到 32字节长度密文,如果我输入长度超过32字节的数据,它会正确填充为64字节密文

这就是我的代码:

    public static byte[] encrypt(byte[] plainText, byte[] keyBytes)
throws GeneralSecurityException {

SecretKeySpec key = new SecretKeySpec(keyBytes, "AES");

Cipher cipher = Cipher.getInstance("AES/ECB/PKCS7Padding", "BC");
cipher.init(Cipher.ENCRYPT_MODE, key);

byte[] cipherText = cipher.doFinal(plainText);

return cipherText;
}

感谢您的回复

最佳答案

您混淆了十六进制字符和字节。可以使用两个十六进制字符来表示单个字节。所以你的输入可能是 16 个字节,然后你的输出变成 32 个字节。 AES 是一种 128 位 = 16 字节分组密码。

PKCS#7 填充被定义为填充 16 字节 block 密码。为了确保纯文本的最后一个字节不会被误认为是填充,PKCS#7 填充始终会进行填充。这意味着,在纯文本可被 16 整除的不幸情况下,它将添加整个填充 block 。填充由一串字节组成,指示每个字节中字符串的长度,因此对于您的情况,填充由以下字节组成,以十六进制表示:10101010101010101010101010101010

请注意,Java 的默认提供程序使用 "PKCS5Padding" 而不是 "PKCS7Padding"。两者是相同的,尽管 PKCS#5 填充正式仅适用于 64 位 = 8 字节 block 密码。 Bouncy CaSTLe 也会接受该字符串,因此为了兼容性,最好指定 "PKCS5Padding"

没有为 AES 指定使用 32 字节的填充,因为它只是 16 字节的分组密码。这对于 32 字节分组密码 Rijndael-256 来说是有意义的,但该算法尚未被 NIST 标准化,因此应该避免。

关于java - 我使用 AES 算法加密 32 字节长度的数据,结果(密文)是 64 字节长度,这有效吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13248851/

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