如何在 AES-128、AES-192 和 AES-256 之间切换
How to switch between AES-128, AES-192 and AES-256
如何在 AES-128
、AES-192
和 AES-256
之间切换。我目前的实现仅使用 AES-128
Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding");
IvParameterSpec ivspec = new IvParameterSpec(initialztnVector);
cipher.init(Cipher.ENCRYPT_MODE, key, ivspec);
byte[] enc = cipher.doFinal(toEncrypt);
更改为 Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
它会让 AES-256
成为可能吗?我应该怎么做才能拥有AES-192
库根据提供的密钥长度决定 AES 密钥长度。马虎,明确指定会更清楚。请确保提供的密钥完全长度正确,不要依赖密钥填充。
填充与密钥大小无关。如果纯文本输入数据长度并不总是(或先验)块大小的精确倍数(AES 为 16 字节),则需要填充。
请注意@KevinO 关于使用正确的 .jar 文件的评论。
正如@zaph 已经提到的,只需提供一个 256 位密钥作为输入,它就可以工作(无论使用何种模式(例如 CBC)或填充)。
此外,如@KevinO 所述,您可能必须安装无限强度策略文件(here for Java 8)以支持 256 位 AES 安全。
但是有时,尤其是当您需要分发软件时,并不总是可以更改客户端计算机上的策略文件。 虽然不推荐,因为您可能会违反 Java 许可协议,但您可以使用反射来绕过限制,而无需更改默认策略文件。
从此 link 移植而来,只需使用此代码段即可 运行 在 class 加载期间。然后,您可以使用任何受支持的密钥大小。
static {
try {
Field field = Class.forName("javax.crypto.JceSecurity").getDeclaredField("isRestricted");
field.setAccessible(true);
field.set(null, java.lang.Boolean.FALSE);
} catch (Exception ex) {
//Report the exception
}
}
如何在 AES-128
、AES-192
和 AES-256
之间切换。我目前的实现仅使用 AES-128
Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding");
IvParameterSpec ivspec = new IvParameterSpec(initialztnVector);
cipher.init(Cipher.ENCRYPT_MODE, key, ivspec);
byte[] enc = cipher.doFinal(toEncrypt);
更改为 Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
它会让 AES-256
成为可能吗?我应该怎么做才能拥有AES-192
库根据提供的密钥长度决定 AES 密钥长度。马虎,明确指定会更清楚。请确保提供的密钥完全长度正确,不要依赖密钥填充。
填充与密钥大小无关。如果纯文本输入数据长度并不总是(或先验)块大小的精确倍数(AES 为 16 字节),则需要填充。
请注意@KevinO 关于使用正确的 .jar 文件的评论。
正如@zaph 已经提到的,只需提供一个 256 位密钥作为输入,它就可以工作(无论使用何种模式(例如 CBC)或填充)。
此外,如@KevinO 所述,您可能必须安装无限强度策略文件(here for Java 8)以支持 256 位 AES 安全。
但是有时,尤其是当您需要分发软件时,并不总是可以更改客户端计算机上的策略文件。 虽然不推荐,因为您可能会违反 Java 许可协议,但您可以使用反射来绕过限制,而无需更改默认策略文件。 从此 link 移植而来,只需使用此代码段即可 运行 在 class 加载期间。然后,您可以使用任何受支持的密钥大小。
static {
try {
Field field = Class.forName("javax.crypto.JceSecurity").getDeclaredField("isRestricted");
field.setAccessible(true);
field.set(null, java.lang.Boolean.FALSE);
} catch (Exception ex) {
//Report the exception
}
}