如何将.der文件中的私钥加载到java私钥对象中

如何将.der文件中的私钥加载到java私钥对象中,java,format,bouncycastle,pkcs#8,Java,Format,Bouncycastle,Pkcs#8,我正在编写一个java程序,使用java从文件系统中的文件导入私钥,并生成一个私钥对象。。。 我可以对.pem格式的文件执行此操作,但对于.der格式的文件,我不知道该怎么做,因为我无法首先检测用于生成密钥的算法。 在.pem文件中,我可以从PKCS#1的头确定算法,该头类似 ----开始RSA私钥--- 格式化并使用bouncycastlepemreader,用于PKCS#8中具有标题的内容 ----开始私钥------ 但是对于那些采用.der格式的文件,我不知道:( 另外,如果有人对.ke

我正在编写一个java程序,使用java从文件系统中的文件导入私钥,并生成一个私钥对象。。。 我可以对
.pem
格式的文件执行此操作,但对于.der格式的文件,我不知道该怎么做,因为我无法首先检测用于生成密钥的算法。 在
.pem
文件中,我可以从
PKCS#1
的头确定算法,该头类似
----开始RSA私钥---

格式化并使用bouncycastle
pem
reader,用于PKCS#8中具有标题的内容
----开始私钥------
但是对于那些采用.der格式的文件,我不知道:(
另外,如果有人对
.key
格式有任何想法,请告诉我

thanx

如果您的DER文件是PKCS#8格式的,您可以使用Java执行以下操作:

// 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

感谢@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
            }

代码现在运行良好

谢谢我知道我可以使用它,但我希望它适用于所有类型的键,我对某个特定的key@monim,这就是为什么我提到可以实例化多个KeyFactories…可能的每种类型的键一个,然后捕获不可能的异常为其工作。它为之工作的将为您提供正确的PrivateKey object.hmmmm,如果PKCS#1中的DER文件,该策略将不起作用。如果密钥为PKCS#1格式,则该策略将不起作用。为了同时读取PKCS#1和PKCS#8 PEM/DER文件,我使用Apache JMeter的源代码。我如何使用源代码@JulienKronegg?您可以吗在单独的答案中发布一个示例?@arik:PrivateKey pk=(新的PrivateKeyReader(“/path/to/myfile.der”)).getPrivateKey();