有谁知道这段代码有什么问题?
Cipher cipher = Cipher.getInstance("AES/ECB128/PKCS5Padding", "SunJCE");
这对我来说似乎是正确的,但它在实例化过程中不断抛出“No such algorithm”异常。
答案 0 :(得分:5)
除了我的类路径中的JDK库存之外,我运行了这段代码片段并在输出中使用了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一样,您无法指定块大小,至少可以使用此处提供的内容。不确定这是否足够你。
答案 1 :(得分:3)
AES的静态块大小为128位(或16字节)。 Rijndael,用于创建AES的密码确实具有多个块大小。在调用init
方法期间配置密钥时,会自动选择密钥大小。
模式后面的位不用于配置密码的块大小。它们更用于配置Cipher Feedback (CFB) mode of operation的反馈大小。现在这是一个相当模糊的模式,特别是如果不是所有的块加密都被使用。虽然它们也可以正式用于OFB模式may be security issues when specifying smaller feedback sizes。应该保留这两种模式以提供对传统协议的支持。
如果使用,"CFB"
或"OFB"
字符串后面的值应大于0且不大于块大小,增量为8.该数字指定为反馈位数和 - 像大多数加密API一样 - Java的JCE仅限于处理字节。
答案 2 :(得分:1)
Sun JCE提供商有限。请尝试使用BouncyCastle JCE提供程序(http://www.bouncycastle.org/)。