【问题标题】:RSA/ECB/OAEPWithSHA-256AndMGF1Padding but with MGF1 using SHA-256?RSA/ECB/OAEPWithSHA-256AndMGF1Padding 但 MGF1 使用 SHA-256?
【发布时间】:2015-11-06 18:03:04
【问题描述】:

我发现在 Oracle 的 Java 标准加密提供程序中遇到的困难

Cipher cipher = Cipher.getInstance("RSA/ECB/OAEPWithSHA-256AndMGF1Padding");

使用通过 SHA-1 实例化的 MFG1; SHA-256 仅用于散列标签(实际上是空的)。我发现在 MFG1 中实际使用 SHA-256 的唯一解决方案(在 answercomment 的帮助下)是使用 Cipher.init 的替代形式:

cipher.init(Cipher.DECRYPT_MODE, privKey, new OAEPParameterSpec(
    "SHA-256", "MGF1", MGF1ParameterSpec.SHA256, PSource.PSpecified.DEFAULT
));

问题:是否存在Cipher.getInstance 可以识别的转换,其效果类似于"RSA/ECB/OAEPWithSHA-256AndMGF1Padding",除了使用SHA-256 的MGF1 之外?

【问题讨论】:

标签: java cryptography


【解决方案1】:

不,没有。

Java 是开源的。如果不确定,您可以查看 OpenJDK 的源代码。

com.sun.crypto.provider.RSACipherinit 方法中显示:

            spec = new OAEPParameterSpec(oaepHashAlgorithm, "MGF1",
                MGF1ParameterSpec.SHA1, PSource.PSpecified.DEFAULT);

我已经检查了 OpenJDK 的 Java 8 update 60。可以看到,需要用到算法参数。

【讨论】:

  • 令人信服的演示,谢谢。这是一个严重的疏忽恕我直言。 Java 标准加密提供程序的复杂性的一个理由是允许以统一的方式指定 transformation,正如 specification of Cipher 中所隐含的那样:“A transformation 是一个字符串,描述要对给定输入执行的操作(或一组操作),以产生一些输出。"
  • 我同意这一点,这也妨碍了替换例如使用 SHA-256 的 RSA/PKCS1 或 OAEP。有更多这样的疏忽,例如 AES 没有SecretKeyFactory,这将需要用于例如HSM 的。 GCM 也没有得到很好的处理。仍然是最好的 API 之一。
  • 老帖子,但只是为了记录,现在看起来 Java 8 从转换字符串中解析了 MD:grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/…
  • @eckes:我没有看到你提到的为 MGF1 选择哈希值的代码。另外,如果有的话,一定有一个规范,对吧?
  • @fgrieu 我以为是oaepHashAlgorithm,但也许我错了(可能是标签哈希)。顺便说一句:我怀疑它没有指定,因为它不是 JCE 标准,而是为 JSSE 实现的,但我可能是错的。
猜你喜欢
  • 2015-11-16
  • 2020-03-17
  • 1970-01-01
  • 2019-05-27
  • 2021-11-16
  • 2015-08-31
  • 2015-03-27
  • 1970-01-01
  • 2014-07-13
相关资源
最近更新 更多