私钥生成
public PrivateKey getStoredPrivateKey(String filePath) {
PrivateKey privateKey = null;
byte[] keydata = getKeyData(filePath);
PKCS8EncodedKeySpec encodedPrivateKey = new PKCS8EncodedKeySpec(keydata);
KeyFactory keyFactory = null;
try {
keyFactory = KeyFactory.getInstance("RSA");
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
try {
System.out.println("hello");
privateKey = keyFactory.generatePrivate(encodedPrivateKey);
} catch (InvalidKeySpecException e) {
e.printStackTrace();
}
return privateKey;
}
我在这里使用
PrivateKey privateKey = new KryptoUtil().getStoredPrivateKey(privateKeyFilePath);
但显示错误
hello
java.security.spec.InvalidKeySpecException:
java.security.InvalidKeyException: IOException : version mismatch: (supported: 00, parsed: 03
at sun.security.rsa.RSAKeyFactory.engineGeneratePrivate(Unknown Source)
我在getStoredPrivateKey(String filePath)函数中传递(.p12)文件。
为什么给出错误?
答案 0 :(得分:1)
P12是密钥库类型,其中可以存储多个密钥和证书,并且可以使用密码来保护它们。您可以在Internet上搜索P12(PKCS12)。您的文件是P12文件,因此很可能是PKCS12格式文件。
要从P12文件获取私钥,请使用下面的代码。在调用此代码之前,您需要以下内容。
<强>文件路径即可。 P12文件的字符串路径(绝对值)。
<强> filePassword 即可。这是一个char []。代表p12文件的密码。
<强> keyPassword 即可。这是一个char []。表示私钥的密码。最 可能与filePassword相同。
<强>别名即可。一个字符串。表示存储在P12中的私钥的别名 存档/密钥库。
要检查私钥的别名,可以使用以下命令
keytool -list -v -keystore <yourfile>.p12 -storetype pkcs12
它会要求输入密码然后打印多行。寻找
Entry Type: PrivatKeyEntry
在那里你会找到别名。
初始化这些变量,然后使用下面的代码获取私钥。您还可以获得与此密钥关联的证书/公钥。寻找PrivateKeyEntry的API
KeyStore keyStore = KeyStore.getInstance("PKCS12");
keyStore.load(new FileInputStream(filePath), filePassword);
PrivateKeyEntry keyEntry = (PrivateKeyEntry) ks.getEntry(alias, new KeyStore.PasswordProtection(keyPassword));
PrivateKey key = privateKeyEntry.getPrivateKey();