我正在编写一个java程序,用于从文件系统中的文件导入私钥,并使用java创建私钥对象...
我可以用.pem
格式的文件来做,但是,使用.der格式,我不知道该怎么做,因为我无法首先检测用于生成密钥的算法。
在.pem
个文件中,我可以从PKCS#1
的标题中确定算法,该标题的标题为
-----BEGIN RSA PRIVATE KEY----
格式并使用bouncycastle pem
读者用于PKCS#8中具有标题的人
-----BEGIN PRIVATE KEY-----
但对于.der格式的人不知道:(
如果有人对.key
格式有所了解,请告诉我
thanx
答案 0 :(得分:3)
如果您的DER文件是PKCS#8格式,您可以使用Java KeyFactory并执行以下操作:
// Read file to a byte array.
String privateKeyFileName = "C:\\myPrivateKey.der";
Path path = Paths.get(privateKeyFileName);
byte[] privKeyByteArray = Files.readAllBytes(path);
PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(privKeyByteArray);
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
PrivateKey myPrivKey = keyFactory.generatePrivate(keySpec);
System.out.println("Algorithm: " + myPrivKey.getAlgorithm());
您提到您可能不知道密钥使用的算法。我确信有一个比这更优雅的解决方案,但你可以创建几个KeyFactory
个对象(每个可能的算法一个)并在每个对象上尝试generatePrivate()
,直到你没有得到InvalidKeySpecException
1}}。
答案 1 :(得分:1)
感谢@gtrig使用您的想法并编辑如下代码:
PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(KeyBytes);
try
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
privateKey = keyFactory.generatePrivate(keySpec);
algorithm = keyFactory.getAlgorithm();
//algorithm = "RSA";
//publicKey = keyFactory.generatePublic(keySpec);
} catch (InvalidKeySpecException excep1) {
try {
KeyFactory keyFactory = KeyFactory.getInstance("DSA");
privateKey = keyFactory.generatePrivate(keySpec);
algorithm = keyFactory.getAlgorithm();
//publicKey = keyFactory.generatePublic(keySpec);
} catch (InvalidKeySpecException excep2) {
KeyFactory keyFactory = KeyFactory.getInstance("EC");
privateKey = keyFactory.generatePrivate(keySpec);
} // inner catch
}
代码现在运作良好