我有一个遗留应用程序,该应用程序已将RSA密钥大小硬编码为384位,并且我需要能够在Java应用程序中验证这些密钥的签名。问题:有没有办法在Java中创建和使用RSA密钥,密钥大小小于512?
(我完全知道有理由限制512位,但是我不能更改旧版应用程序)。
最佳答案
是的,但是您必须为此使用其他提供程序。当您尝试使用384位RSA密钥时,Sun RSAKeyFactory
(KeyFactory
的基础服务提供商实现)和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
生成的密钥的类型,即使未指定init
,Signature
实例的"BC"
方法也将静默使用Bouncy Castle提供程序。