java - 为什么 EncryptedPrivateKeyInfo 无法在 Java 中读取我的 PKCS#8 加密私钥?

标签 java encryption cryptography rsa pkcs#8

我正在尝试用 Java 解密密码加密的私钥,我遇到了这个 previous question ,但是当我尝试同样的操作时,出现以下异常:

Exception in thread "main" java.io.IOException: ObjectIdentifier() -- data isn't an object ID (tag = 48)
at sun.security.util.ObjectIdentifier.<init>(ObjectIdentifier.java:257)
at sun.security.util.DerInputStream.getOID(DerInputStream.java:314)
at com.sun.crypto.provider.PBES2Parameters.engineInit(PBES2Parameters.java:267)
at java.security.AlgorithmParameters.init(AlgorithmParameters.java:293)
at sun.security.x509.AlgorithmId.decodeParams(AlgorithmId.java:132)
at sun.security.x509.AlgorithmId.<init>(AlgorithmId.java:114)
at sun.security.x509.AlgorithmId.parse(AlgorithmId.java:372)
at javax.crypto.EncryptedPrivateKeyInfo.<init>(EncryptedPrivateKeyInfo.java:95)
at TestDecryptKey.main(TestDecryptKey.java:65)

其中 TestDecryptKey.java 是我的测试文件。这是我正在做的事情的片段:

import javax.crypto.EncryptedPrivateKeyInfo;
import javax.crypto.spec.PBEKeySpec;
import java.util.Base64;
import java.security.GeneralSecurityException;
import java.io.IOException;

public class TestDecryptKey {
  public static void main(String[] args) throws GeneralSecurityException, IOException {
    String encryptedBase64PrivateKey = "MII...";
    String password = "...";
    byte[] encryptedPrivateKey = Base64.getDecoder().decode(encryptedBase64PrivateKey.getBytes("UTF-8"));
    PBEKeySpec pbeSpec = new PBEKeySpec(password.toCharArray());
    // Exception is thrown here
    EncryptedPrivateKeyInfo encryptedPrivateKeyInfo = new EncryptedPrivateKeyInfo(encryptedPrivateKey);
 }
}

我假设它声称我提供的加密 key 数据不是有效的加密 key ,但 openssl 不同意。我将带有页眉和页脚“-----BEGIN ENCRYPTED PRIVATE KEY-----”和“-----END ENCRYPTED PRIVATE KEY-----”的Base64字符串保存为文件“pem_key”和使用以下命令和上面的密码:

openssl pkcs8 -inform pem -in pem_key -outform der

我能够输出解密的 key 字节。我哪里错了?

最佳答案

我在为使用 x32 JVM 运行的 Java 应用程序绑定(bind)使用由 x64 JDK 的 keytool 生成的 keystore 时遇到了同样的错误。将 JVM 更改为 x64 有所帮助。

关于java - 为什么 EncryptedPrivateKeyInfo 无法在 Java 中读取我的 PKCS#8 加密私钥?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51883324/

相关文章:

java - java.net.SocketPermission 处理 cname 反向查找时是否存在错误

java - 可序列化对象的 ArrayList 的加密保存和解密加载

c++ - 如何使用 Xenroll 和 CertEnroll 创建在所有版本的窗口上运行的 "Certificate Signing Request"?

php - 对于 OpenSSL ECC,我们可以拥有多个公钥和一个私钥吗?

python - 非对称加密 - 明文大小错误

java - Java2D 中的文本旋转

java - TrueZip 可以用于搜索流吗

java - JENKINS REST API 抛出 403 禁止

java - 在 NetSuite Suitescript 中加密并在 java 应用程序中解密

java - Android NDK中的解密