我有一个遗留应用程序,该应用程序已将RSA密钥大小硬编码为384位,并且我需要能够在Java应用程序中验证这些密钥的签名。问题:有没有办法在Java中创建和使用RSA密钥,密钥大小小于512?

(我完全知道有理由限制512位,但是我不能更改旧版应用程序)。

最佳答案

是的,但是您必须为此使用其他提供程序。当您尝试使用384位RSA密钥时,Sun RSAKeyFactoryKeyFactory的基础服务提供商实现)和RSAKeyPairGenerator都将返回异常。

正确安装Bouncy Castle提供程序后,这将起作用:

Security.addProvider(new BouncyCastleProvider());

KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA", "BC");
kpg.initialize(384);
KeyPair kp = kpg.generateKeyPair();
PublicKey genPub = kp.getPublic();

byte[] enc = genPub.getEncoded();

KeyFactory kf = KeyFactory.getInstance("RSA", "BC");
X509EncodedKeySpec ks = new X509EncodedKeySpec(enc);
PublicKey decPub = kf.generatePublic(ks);

Signature sig = Signature.getInstance("SHA1withRSA", "BC");
sig.initVerify(decPub);
byte[] faultySig = new byte[384 / Byte.SIZE];
boolean verifies = sig.verify(faultySig);

System.out.println(verifies + " for " + decPub.getAlgorithm());


请注意,由于KeyFactory生成的密钥的类型,即使未指定initSignature实例的"BC"方法也将静默使用Bouncy Castle提供程序。

09-27 20:19