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

时间:2016-05-10 12:47:54

标签: java encryption cryptography aes

如何在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

2 个答案:

答案 0 :(得分:3)

库根据提供的密钥长度决定AES密钥长度。草率,明确指定会更清楚。确保提供的密钥完全正确长度,不要依赖密钥填充。

填充与密钥大小无关。如果纯文本输入数据长度不总是(或先验地)是块大小的精确倍数(AES为16字节),则必须填充。

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

答案 1 :(得分:3)

正如@zaph已经提到的那样,只需提供一个256位的密钥作为输入即可使用(无论使用何种模式(例如CBC)或Padding)。

另外,正如@KevinO所提到的,您可能必须安装无限强度策略文件(Java here)以支持256位AES安全性。

但有时候,特别是如果您需要分发软件,则无法始终更改客户端计算机上的策略文件。 虽然不推荐,因为您可能违反了Java许可协议,但您可以使用反射来绕过限制而不更改默认的策略文件。 从此link移植,只需使用将在类加载期间运行的此代码段。然后,您可以使用任何支持的密钥大小。

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