如何在 AES-128、AES-192 和 AES-256 之间切换

How to switch between AES-128, AES-192 and AES-256

如何在 AES-128AES-192AES-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
    }
}