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

时间:2013-11-21 11:34:56

标签: java format bouncycastle pkcs#8

我正在编写一个java程序,用于从文件系统中的文件导入私钥,并使用java创建私钥对象... 我可以用.pem格式的文件来做,但是,使用.der格式,我不知道该怎么做,因为我无法首先检测用于生成密钥的算法。 在.pem个文件中,我可以从PKCS#1的标题中确定算法,该标题的标题为
        -----BEGIN RSA PRIVATE KEY----
格式并使用bouncycastle pem读者用于PKCS#8中具有标题的人 -----BEGIN PRIVATE KEY----- 但对于.der格式的人不知道:(
如果有人对.key格式有所了解,请告诉我 thanx

2 个答案:

答案 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
            }

代码现在运作良好