gpt4 book ai didi

java - 我应该如何让 AES 处理 Java 中任意长度的字符串?

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

过去 2 小时我一直在阅读 AES,这是到目前为止我所要展示的内容:

static String decrypt(byte[] encrypted){
try{
Key aesKey = new SecretKeySpec(System.getenv("CRYPTO_KEY").getBytes(), "AES");
// The key is 32 bytes long.
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.DECRYPT_MODE, aesKey);
return new String(cipher.doFinal(encrypted));
} catch(Exception e){
System.out.println("decrypt() failed.");
e.printStackTrace();
return null;
}
}

static byte[] encrypt(String plaintext){
try{
Key aesKey = new SecretKeySpec(System.getenv("CRYPTO_KEY").getBytes(), "AES");
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, aesKey);
return cipher.doFinal(plaintext.getBytes());
} catch(Exception e){
System.out.println("encrypt() failed.");
e.printStackTrace();
return null;
}
}

我知道 AES 在每个 16 字节的 block 上运行,但我认为我不能保证我的输入字符串将是 16 字节或更少。有没有一种简单的方法可以让这个密码适用于任意长度的字符串?或者我是否只需将输入分解为 16 字节 block 并手动运行每个 block ?

最佳答案

“AES/CBC/PKCS5Padding”允许任意长度的数据。问题代码应该正确处理任意长度的数据。

是的,AES 是一种基于 block 的密码,但这并不意味着更高层不能使用它来处理任意长度的数据。在本例中,Cipher 是一个更高级别的实现。

首先,该实现根据需要对底层分组密码进行多次调用,以处理传递给它的整个数据。

第二个填充,例如 PKCS#7(很多时候被错误地称为 PKCS#5),将填充字节添加到最后一个 block ,以使数据达到 block 大小的倍数。

在相同的情况下,这些较高层可以实现多种模式,例如 CBC、ECB、CTS、CTR 等。CTS 和 CTR 是使用另一种处理任意数据长度而不添加填充的方法的示例模式。

关于java - 我应该如何让 AES 处理 Java 中任意长度的字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51090380/

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