0

私钥生成

          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) 文件。

为什么它给出错误?

4

1 回答 1

1

P12 是密钥库类型,可以存储多个密钥和证书,并且可以使用密码来保护它们。您可以在 Internet 上搜索有关 P12 (PKCS12) 的信息。您的文件是 P12 文件,因此很可能是 PKCS12 格式的文件。

要从 P12 文件中获取私钥,请使用以下代码。在调用此代码之前,您需要以下内容。

文件路径。P12 文件的字符串路径(绝对)。

文件密码。它是一个字符 []。表示 p12 文件的密码。

密钥密码。它是一个字符 []。表示私钥的密码。很可能与 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();
于 2016-06-10T10:28:04.907 回答