【问题标题】:Cipher with AES/ECB128/PKCS5Padding keeps throwing "No such algorithm" exception带有 AES/ECB128/PKCS5Padding 的密码不断抛出“没有这样的算法”异常
【发布时间】:2012-05-12 02:37:11
【问题描述】:

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

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

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

【问题讨论】:

  • 您不能在“ECB”之后添加数字,因为该模式仅支持每次加密的完整块。您只能在有意义的模式后面加上数字,例如 CFB、OFB 和 CTR 模式。

标签: java encryption cryptography padding ecb


【解决方案1】:

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's - Java 的 JCE 仅限于处理字节。

【讨论】:

    【解决方案2】:

    在我的类路径中除了股票 JDK 之外什么都没有,我运行了这段代码 sn-p 并在输出中为 AES grepped:

    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,您无法指定块大小,至少对于此处可用的内容。不确定这对您是否足够。

    【讨论】:

    • 谢谢。但是我查看了 JDK 文档,他们说附加的数字应该是 IN BYTES 的长度。所以我猜ECB16 应该可以工作。
    • @OneTwoThree 虽然 JCA Cipher transformations 文档说 您可以选择通过将此数字附加到模式名称来指定一次要处理的位数,但不是全部模式支持它。请参阅 JCA Standard Algorithm Name Documentation 的 Cipher Algorithm Modes 部分。
    • @一二三,您知道,CBC 比 ECB 更安全。虽然您必须处理初始化向量。
    【解决方案3】:

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

    【讨论】:

    • 我实际上从未使用过除 Sun JCE 之外的任何提供程序。所以如果我想使用 BoycyCastle。我应该把他们的名字放在 ctor 中吗?
    • 要添加提供程序,您可以将其添加到您的 java.security 文件中,也可以通过编程方式添加它。以下是 bouncycastle.org 网站上的说明:bouncycastle.org/wiki/display/JA1/Provider+Installation。此外,您应该在 oracle 的网站上查看有关 JCA/JCE 的 oracles 文档以了解详细信息。
    猜你喜欢
    • 1970-01-01
    • 2021-09-23
    • 2021-11-23
    • 1970-01-01
    • 2015-05-16
    • 2018-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多