我在从 java 中的 xml 文件转换我的公钥时遇到问题。经过一些研究,X509 编码似乎是最流行的格式。
我有一个如下所示的 xml 文件:
<RSAKeyValue>
<Modulus>hkjhvgkjewrlhfelwrkjvhwerkjlrkwjvbrvkjrbvkwjlvbwekvjbekvbwkbrkvbwrwebrvvbrlkvbklvrbkvlreb</Modulus>
<Exponent>AQAB</Exponent>
</RSAKeyValue>
(这不是我的实际键值)
这是我尝试过的代码示例:
File fXmlFile = new File(".....\\...\\...\\file.xml"); //Path to xml file
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
Document doc = dBuilder.parse(fXmlFile);
doc.getDocumentElement().normalize();
NodeList nList = doc.getElementsByTagName("Modulus");
Node n = nList.item(0);
byte[] encKey = Base64.getEncoder().encode(n.getTextContent().getBytes());
X509EncodedKeySpec pubKeySpec = new X509EncodedKeySpec(encKey);
KeyFactory keyFactory = KeyFactory.getInstance("DSA", "SUN");
PublicKey pubKey = keyFactory.generatePublic(pubKeySpec);
在最后一行,我得到一个如下所示的异常:
java.security.spec.InvalidKeySpecException: Inappropriate key specification: invalid key format
at sun.security.provider.DSAKeyFactory.engineGeneratePublic(DSAKeyFactory.java:119)
at java.security.KeyFactory.generatePublic(KeyFactory.java:328)
at XmlReader.main(XmlReader.java:41)
我不确定 key 格式有什么问题。是否是输入转换为字符串时出现问题导致丢失了 key 的一些重要数据?
最佳答案
您正在使用 DSA KeyFactory
构建 RSA key ,并使用 X509EncodedKeySpec
,同时您具有以 Base64 编码的模数和指数
试试这个:
BigInteger modulus = new BigInteger(Base64.getDecoder().decode(modulusAsString));
BigInteger exponent = new BigInteger(Base64.getDecoder().decode(exponentAsString));
RSAPublicKeySpec keySpec = new RSAPublicKeySpec(modulus, exponent);
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
PublicKey pubKey =keyFactory.generatePublic(keySpec);
我省略了 XML 部分
关于java - 无法在java中从xml创建公钥对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46220932/