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

Java 如何在AES-128、AES-192和AES-256之间切换,java,encryption,cryptography,aes,Java,Encryption,Cryptography,Aes,如何在AES-128、AES-192和AES-256之间切换。我目前的实现仅使用AES-128 更改为Cipher Cipher=Cipher.getInstanceAES/CBC/PKCS5Padding 它会使AES-256成为可能吗?如何使AES-192库根据提供的密钥长度决定AES密钥长度。草率的、明确的指定将更加清晰。请确保提供的密钥长度正确,不要依赖密钥填充 填充与键大小没有关系。如果纯文本输入数据长度不总是AES块大小16字节的精确倍数,则需要填充 请注意@KevinO关于使用正确

如何在AES-128、AES-192和AES-256之间切换。我目前的实现仅使用AES-128

更改为Cipher Cipher=Cipher.getInstanceAES/CBC/PKCS5Padding


它会使AES-256成为可能吗?如何使AES-192

库根据提供的密钥长度决定AES密钥长度。草率的、明确的指定将更加清晰。请确保提供的密钥长度正确,不要依赖密钥填充

填充与键大小没有关系。如果纯文本输入数据长度不总是AES块大小16字节的精确倍数,则需要填充


请注意@KevinO关于使用正确的.jar文件的评论。

库根据提供的密钥长度决定AES密钥长度。草率的、明确的指定将更加清晰。请确保提供的密钥长度正确,不要依赖密钥填充

填充与键大小没有关系。如果纯文本输入数据长度不总是AES块大小16字节的精确倍数,则需要填充


请注意@KevinO关于使用正确的.jar文件的评论。

正如@zaph已经提到的,只需提供一个256bit键作为输入,它就可以工作,而不管使用何种模式,例如CBC或Padding

此外,正如@KevinO所提到的,您可能必须安装针对Java 8的无限强度策略文件,以支持256位AES安全性

但是,有时,特别是当您需要分发软件时,并不总是能够更改客户端计算机上的策略文件。尽管不建议您这样做,因为您可能会违反Java许可协议,但您可以使用反射绕过这些限制,而无需更改默认策略文件。 从这里移植过来,只需使用这个将在类加载期间运行的代码段。然后,您可以使用任何支持的密钥大小

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
    }
}

正如@zaph已经提到的,只要提供一个256bit的键作为输入,它就可以工作,而不管使用的模式是CBC还是Padding

此外,正如@KevinO所提到的,您可能必须安装针对Java 8的无限强度策略文件,以支持256位AES安全性

但是,有时,特别是当您需要分发软件时,并不总是能够更改客户端计算机上的策略文件。尽管不建议您这样做,因为您可能会违反Java许可协议,但您可以使用反射绕过这些限制,而无需更改默认策略文件。 从这里移植过来,只需使用这个将在类加载期间运行的代码段。然后,您可以使用任何支持的密钥大小

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-256,您还必须在$JAVA_HOME/jre/lib/security中拥有正确的.jar文件。除了修改密码,对于AES-256,您还必须在$JAVA_HOME/jre/lib/security中拥有正确的.jar文件。