1

有谁知道这段代码有什么问题?

Cipher cipher = Cipher.getInstance("AES/ECB128/PKCS5Padding", "SunJCE");
  • 算法:AES
  • 操作模式:ECB(附加128指定块大小)
  • 填充方案:PKCS5Padding

这对我来说似乎是正确的,但它在实例化过程中不断抛出“没有这样的算法”异常。

4

3 回答 3

5

在我的类路径中除了股票 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,您无法指定块大小,至少对于此处可用的内容。不确定这对您是否足够。

于 2012-05-02T16:09:52.820 回答
3

AES 具有 128 位(或 16 字节)的静态块大小。Rijndael,用于创建 AES 的密码确实有多个块大小。在调用方法期间配置密钥时,会自动获取密钥大小init

模式后面的位不用于配置密码的块大小。它们更用于配置密码反馈 (CFB) 操作模式的反馈大小。不过,这现在是一种相当模糊的模式,尤其是在没有使用块加密的所有位的情况下。尽管它们也可以正式用于 OFB 模式,但在指定较小的反馈大小时可能会出现安全问题。可能应该保留这两种模式以提供对遗留协议的支持。

"CFB"如果使用,或字符串后面的值"OFB"应大于 0,并且不大于块大小,增量为 8。该数字指定为反馈位数,并且 - 与大多数加密 API 一样 - Java 的 JCE 仅限于处理字节.

于 2012-05-02T19:51:24.337 回答
1

Sun JCE 提供程序有些受限。尝试改用 BouncyCastle JCE 提供程序 (http://www.bouncycastle.org/)。

于 2012-05-02T15:31:26.673 回答