如何在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
答案 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
}
}