无法从 java 中的 xml 创建 public 关键对象
Unable to create public key object from xml in java
我无法从 java 中的 xml 文件转换我的 public 密钥。经过一些研究,似乎 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)
我不确定密钥格式有什么问题。会不会是输入被转换成字符串导致它丢失一些重要的密钥数据的问题?
您正在使用 DSA KeyFactory
构建 RSA 密钥,并在使用 base64
编码的模数和指数时使用 X509EncodedKeySpec
试试这个:
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 中的 xml 文件转换我的 public 密钥。经过一些研究,似乎 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)
我不确定密钥格式有什么问题。会不会是输入被转换成字符串导致它丢失一些重要的密钥数据的问题?
您正在使用 DSA KeyFactory
构建 RSA 密钥,并在使用 base64
X509EncodedKeySpec
试试这个:
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部分