我正在尝试从PKCS#8格式的.pem文件中读取私钥,我遇到的问题是这些文件有这个标题
-----BEGIN PRIVATE KEY-----
所以没有关于用于实例化密钥的算法的信息,我的问题是:
有没有一种方法可以在不解码密钥(即base64)的情况下知道算法并查看算法修饰符,如果有办法知道密钥长度的话。
感谢帮助
答案 0 :(得分:1)
使用Bouncy Castle并修改this answer中的代码,我想出了这个来得到你的答案。
注意:此代码仅适用于未加密的私钥。
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.security.PrivateKey;
import java.security.Security;
import org.bouncycastle.asn1.pkcs.PrivateKeyInfo;
import org.bouncycastle.jcajce.provider.asymmetric.dsa.BCDSAPrivateKey;
import org.bouncycastle.jcajce.provider.asymmetric.ec.BCECPrivateKey;
import org.bouncycastle.jcajce.provider.asymmetric.rsa.BCRSAPrivateKey;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.bouncycastle.openssl.PEMParser;
import org.bouncycastle.openssl.jcajce.JcaPEMKeyConverter;
public class PemKeyInfo
{
/**
* @param args
* @throws IOException
*/
public static void main(String[] args) throws IOException
{
Security.addProvider(new BouncyCastleProvider());
String privateKeyFileName = "C:\\privkeypk8.pem";
File privateKeyFile = new File(privateKeyFileName); // private key file in PEM format
PEMParser pemParser = new PEMParser(new FileReader(privateKeyFile));
Object object = pemParser.readObject();
pemParser.close();
JcaPEMKeyConverter converter = new JcaPEMKeyConverter().setProvider("BC");
PrivateKey privkey = null;
if (object instanceof PrivateKeyInfo)
{
privkey = converter.getPrivateKey((PrivateKeyInfo) object);
}
if (privkey != null)
{
System.out.println("Algorithm: " + privkey.getAlgorithm()); // ex. RSA
System.out.println("Format: " + privkey.getFormat()); // ex. PKCS#8
}
if (privkey instanceof BCRSAPrivateKey)
{
System.out.println("RSA Key Length: " + ((BCRSAPrivateKey)privkey).getModulus().bitLength()); // ex. 2048
}
if (privkey instanceof BCDSAPrivateKey)
{
System.out.println("DSA Key Length: " + ((BCDSAPrivateKey)privkey).getParams().getP().bitLength()); // ex. 2048
}
if (privkey instanceof BCECPrivateKey)
{
System.out.println("EC Key Length: " + ((BCECPrivateKey)privkey).getParams().getOrder().bitLength()); // ex. 256
}
}
}
更新:我编辑了上面的代码,为RSA,DSA和EC密钥提供密钥长度。