如何将私钥从 .der 文件加载到 java 私钥对象中
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/20119874/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
how to load the private key from a .der file into java private key object
提问by monim
I'm writing a java program to import private keys from files within the file system and make a private key object, using java...
I could do it for files in .pem
format but, with .der format, I had no idea what to do, since I couldnt firstly detect the algorithm used to generate the keys.
within .pem
files I could determine the algorithm from the header for PKCS#1
which have a header like-----BEGIN RSA PRIVATE KEY----
formats and used the bouncycastle pem
reader for those in PKCS#8 which have a header-----BEGIN PRIVATE KEY-----
but with those in .der format no idea :(
also if anyone have an idea about .key
format tell me
thanx
我正在编写一个 java 程序来从文件系统中的文件中导入私钥并使用 java 创建一个私钥对象...我可以对.pem
格式的文件执行此操作,但是使用 .der 格式,我不知道该做什么做,因为我无法首先检测用于生成密钥的算法。在.pem
文件中,我可以从PKCS#1
具有标题-----BEGIN RSA PRIVATE KEY----
格式的标题中确定算法,并使用 bouncycastlepem
阅读器用于 PKCS#8 中的那些有标题-----BEGIN PRIVATE KEY-----
但 .der 格式的人不知道:(
如果有人知道.key
格式告诉我
thanx
采纳答案by gtrig
If your DER files are in PKCS#8 format, you can use the Java KeyFactoryand do something like this:
如果您的 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());
You mentioned that you may not know what algorithm the key is using. I'm sure there is a more elegant solution than this, but you could create several KeyFactory
objects (one for each possible algorithm) and try to generatePrivate()
on each one until you do not get an InvalidKeySpecException
.
您提到您可能不知道密钥使用的是什么算法。我确信有比这更优雅的解决方案,但是您可以创建多个KeyFactory
对象(每个可能的算法一个)并尝试generatePrivate()
对每个对象进行操作,直到您没有得到InvalidKeySpecException
.
回答by monim
thanks @gtrig using ur idea and editing the code like this :
感谢@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
}
the code is working well now
代码现在运行良好