RSA/ECB/OAEPWithSHA-256AndMGF1Padding但使用SHA-256的MGF1?

11

我曾经吃过亏,发现在 Oracle 的 Java 标准加密提供程序中

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

使用实例化为SHA-1的MFG1; 在实践中,仅用于哈希标签的是SHA-256(通常为空)。我发现实际使用SHA-256在MFG1中唯一的解决方案是使用Cipher.init的一种替代形式(由答案评论提供帮助):

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

问题:是否存在一种变换Cipher.getInstance会识别,并具有类似于"RSA/ECB/OAEPWithSHA-256AndMGF1Padding"的效果,但其中MGF1使用SHA-256?


1
请注意,这仅适用于Java7u55及以上版本(请参见https://bugs.java.com/bugdatabase/view_bug.do?bug_id=8058549)。以前的Java版本使用所描述的方式会抛出异常。 - Heri
1个回答

11

没有,不存在。

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

com.sun.crypto.provider.RSACipherinit方法中,它读取:

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

我已经检查过到OpenJDK的Java 8更新60版本。如您所见,您需要使用算法参数。


令人信服的演示,谢谢。在我看来,这是一个严重的疏忽。Java标准加密提供程序复杂性的正当理由之一是允许以统一的方式指定“转换”,如在Cipher规范中隐含地说明:““转换”是描述要对给定输入执行的操作(或一组操作)以产生某些输出的字符串。” - fgrieu
3
我同意这个观点,它也妨碍了例如RSA/PKCS1或OAEP用SHA-256替换的进程。类似的疏忽还有很多,比如AES没有“SecretKeyFactory”,这在与HSM(硬件安全模块)一起使用时是必需的。GCM也没有得到很好的处理。不过,这依然是最好的API之一。 - Maarten Bodewes
1
虽然这是一篇旧帖子,但仅供参考,Java 8现在似乎可以从转换字符串中解析MD了:http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/8u40-b25/com/sun/crypto/provider/RSACipher.java/#147 - eckes
@eckes:我没有看到你提到选择MGF1哈希的代码行周围的代码。而且,如果有的话,肯定会有规范文件吧? - fgrieu
@fgrieu 我原以为是 oaepHashAlgorithm,但也许我错了(它可能是标签哈希)。顺便说一句:我怀疑它没有被指定,因为它不是 JCE 标准,而是为 JSSE 实现的,但我可能错了。 - eckes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接