Java RSAPublicKey 工厂异常

use*_*721 2 java rsa exception public-key

将Java升级到1.8.0_171后,我在RSA公钥撰写过程中总是遇到以下异常:

java.security.InvalidKeyException: exponent is larger than modulus
Run Code Online (Sandbox Code Playgroud)

升级前它可以工作,有人知道该怎么办吗?

RSAPublicKeySpec publicSpec = new RSAPublicKeySpec(new BigInteger(modulus), new BigInteger(exponent));
KeyFactory factory = KeyFactory.getInstance("RSA");
PublicKey pub = factory.generatePublic(publicSpec); <----- EXCEPTION
Run Code Online (Sandbox Code Playgroud)

use*_*721 5

我发现JDK-8174756 引用的Java 1.8.0_161发生了变化:

security-libs/javax.crypto RSA 公钥验证

在 8u161 中,SunRsaSign 提供程序中的 RSA 实现将拒绝任何指数不在 PKCS#1 版本 2.2 定义的有效范围内的 RSA 公钥。此更改将影响 JSSE 连接以及基于 JCE 构建的应用程序。

JDK-8174756(非公开)

这基本上意味着模数不应该为负。在这种情况下,重要的是要BigInteger以下列方式进行积极的构建:

BigInteger(1, modulus)
BigInteger(1, exponent)
Run Code Online (Sandbox Code Playgroud)

更改后,它再次起作用。