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

wvmv3b1j  于 2021-07-03  发布在  Java
关注(0)|答案(2)|浏览(657)

我如何在两者之间切换 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` 
piok6c0g

piok6c0g1#

正如@zaph已经提到的,只要提供一个256位的键作为输入,它就可以工作(不管使用什么模式(例如cbc)或填充)。
另外,正如@kevino所提到的,您可能需要安装无限强度策略文件(这里是针对java8)来支持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
    }
}
qnakjoqk

qnakjoqk2#

库根据所提供密钥的长度决定aes密钥长度。草率的,明确的指定会更清楚。确保提供的密钥长度正确,不要依赖于密钥填充。
填充与键大小没有关系。如果纯文本输入数据长度并非总是(或先验地)块大小的精确倍数(aes为16字节),则需要填充。
注意@kevino关于使用正确的.jar文件的注解。

相关问题