有谁知道这段代码有什么问题?
Cipher cipher = Cipher.getInstance("AES/ECB128/PKCS5Padding", "SunJCE");
- 算法:AES
- 操作模式:ECB(附加128指定块大小)
- 填充方案:PKCS5Padding
这对我来说似乎是正确的,但它在实例化过程中不断抛出“没有这样的算法”异常。
有谁知道这段代码有什么问题?
Cipher cipher = Cipher.getInstance("AES/ECB128/PKCS5Padding", "SunJCE");
这对我来说似乎是正确的,但它在实例化过程中不断抛出“没有这样的算法”异常。
在我的类路径中除了股票 JDK 之外什么都没有,我运行了这个代码片段并在输出中为 AES 进行了 grep:
for (Provider provider: Security.getProviders()) {
System.out.println(provider.getName());
for (String key: provider.stringPropertyNames())
System.out.println("\t" + key + "\t" + provider.getProperty(key));
}
我看到了这一行:
Cipher.AES SupportedPaddings NOPADDING|PKCS5PADDING|ISO10126PADDING
这向我表明您的填充是受支持的。
我也看到了这一行:
Cipher.AES SupportedModes ECB|CBC|PCBC|CTR|CTS|CFB|OFB|CFB8|CFB16|CFB24|CFB32|CFB40|CFB48|CFB56|CFB64|OFB8|OFB16|OFB24|OFB32|OFB40|OFB48|OFB56|OFB64|CFB72|CFB80|CFB88|CFB96|CFB104|CFB112|CFB120|CFB128|OFB72|OFB80|OFB88|OFB96|OFB104|OFB112|OFB120|OFB128
我注意到这里出现了 ECB,但 ECB128 没有出现,所以我想知道这是否是问题所在。我要承认我不知道这些信息是否在正确的轨道上。
编辑添加:我可以使用 ECB 而不是 ECB128 调用 Cipher.getAlgorithm("AES/ECB/PKCS5Padding")。在我看来,对于 ECB,您无法指定块大小,至少对于此处可用的内容。不确定这对您是否足够。
AES 具有 128 位(或 16 字节)的静态块大小。Rijndael,用于创建 AES 的密码确实有多个块大小。在调用方法期间配置密钥时,会自动获取密钥大小init
。
模式后面的位不用于配置密码的块大小。它们更用于配置密码反馈 (CFB) 操作模式的反馈大小。不过,这现在是一种相当模糊的模式,尤其是在没有使用块加密的所有位的情况下。尽管它们也可以正式用于 OFB 模式,但在指定较小的反馈大小时可能会出现安全问题。可能应该保留这两种模式以提供对遗留协议的支持。
"CFB"
如果使用,或字符串后面的值"OFB"
应大于 0,并且不大于块大小,增量为 8。该数字指定为反馈位数,并且 - 与大多数加密 API 一样 - Java 的 JCE 仅限于处理字节.
Sun JCE 提供程序有些受限。尝试改用 BouncyCastle JCE 提供程序 (http://www.bouncycastle.org/)。