Java 构造EncryptedPrivateKeyInfo时发生异常

Java 构造EncryptedPrivateKeyInfo时发生异常,java,encryption,openssl,ssl-certificate,private-key,Java,Encryption,Openssl,Ssl Certificate,Private Key,我已经生成了一个私钥,并用密码对其进行了加密。现在我想把它加载到EncryptedPrivateKeyInfo,这样我就可以构造它并将它导出到PEM格式的文件中。下面是我使用的代码 final CertAndKeyGen keypair = new CertAndKeyGen("RSA", "SHA1WithRSA", null); final X500Name x500Name = new X500Name("IN", "AP", "HYD", "TEST", "TEST_ORG",

我已经生成了一个私钥,并用密码对其进行了加密。现在我想把它加载到EncryptedPrivateKeyInfo,这样我就可以构造它并将它导出到PEM格式的文件中。下面是我使用的代码

final CertAndKeyGen keypair = new CertAndKeyGen("RSA", "SHA1WithRSA", null);
final X500Name x500Name =
    new X500Name("IN", "AP", "HYD", "TEST", "TEST_ORG", "test@xyz.com");
keypair.generate(1024);
final PrivateKey privKey = keypair.getPrivateKey();
final X509Certificate[] chain = new X509Certificate[1];
long validity = 123;
chain[0] = keypair.getSelfCertificate(x500Name, new Date(), 
    validity * 24 * 60 * 60);
Key key =  new SecretKeySpec(password.getBytes(), ALGO);
Cipher c = Cipher.getInstance(ALGO);
c.init(Cipher.ENCRYPT_MODE, key);
byte[] encVal = c.doFinal(privKey.getEncoded());
AlgorithmParameters params = AlgorithmParameters.getInstance("DES");
params.init(encVal); // <--- exception thrown here
EncryptedPrivateKeyInfo encinfo = new EncryptedPrivateKeyInfo(params, encVal);

// displaying encrypting value
String encryptedValue = Base64.encodeBase64String(encinfo.getEncoded());
System.out.println(encryptedValue);
params.init(encVal)行中。我从异常中看不出哪里出了问题。任何帮助或建议都将不胜感激。提前感谢。

包含加密私钥的PKCS#8文件具有以下ASN.1结构:

EncryptedPrivateKeyInfo ::= SEQUENCE {
  encryptionAlgorithm EncryptionAlgorithmIdentifier,
  encryptedData EncryptedData }
请注意,加密数据只是整个数据包的一部分。您需要将此数据与加密算法标识符一起包含在序列中。上面的代码只生成
encryptedData
部分


我建议你考虑使用蹦蹦跳跳。看起来他们可能有。下面是一些示例代码:

KeyPairGenerator generator = KeyPairGenerator.getInstance("RSA");
KeyPair keyPair = generator.generateKeyPair();

final PrivateKey privKey = keyPair.getPrivate();

JceOpenSSLPKCS8EncryptorBuilder builder =
    new JceOpenSSLPKCS8EncryptorBuilder(PKCS8Generator.PBE_SHA1_3DES);

builder.setIterationCount(10000);
builder.setPasssword("Hello, World!".toCharArray());

OutputEncryptor outputEncryptor = builder.build();    
PKCS8Generator pkcs8Generator =
    new JcaPKCS8Generator(privKey, outputEncryptor);

try (PemWriter writer = new PemWriter(new PrintWriter(System.out))) {
  writer.writeObject(pkcs8Generator);
}
这将输出加密的私钥:

-----BEGIN ENCRYPTED PRIVATE KEY----- MIICrjAoBgoqhkiG9w0BDAEDMBoEFM1kXgdc0vzEhCwQG5G2wAaSA7POAgInEASC AoAkBPjKkNVpt9O9+Q63WMscX0eEiGyD6/kFwI+ZgH4/s98uKDHxWTB0fQ+HA+Iy gQC1b+QhT2HVR0DIB6lfhou4FrcJXBAqf4h0ybkfmE4xTfVQcCpgKm4uUC/FYjks dgTMajN9NHL06nUjd/0uVsM2bzbJHXlDmPRB0LdfvuxzcGN0Vvn13IJrjRnGwTGR nv6ZyE3gbjCRanINhMtCDMtg9Ydm7+DHC53YOeqbbhgO9/aJHpRzX/H6zLYp/oa0 GpHM6NzsTfABS8QyqR+EaoFad/XHvC9nKUDqm8LVjmKdlXrLDmpHQ4kxZqMIbijE /Pu2IfHB0jYYa93F2i0fKkIaeve4oo3/izBn0amXVnsPMnkyrIoUUaLzI/gb/419 vp+1kmAKsEFCRIDQlDCiR9CyuePOaR0d7EckVMDU0uR9MXYAV73Y3VRXe1votrQ/ 5Wi8ueio9TBDYj9wYYoYmRpz454HqJ/71k0xr5IJugJIJkUzNN9VkjK9rhgT0Vz5 wY/E1yZZepqCR1xrYgDuu/n4t63EERMo+BgkpKBMnWliU3QdQT2r4qBnma+c9lq8 IWb3y3Phl4LsX3DnLed1rUIOcQKiN2T9/yl+7eEtk8APkKuLK5DDDytgAcOQ1MIF 7Ie2939OG1c3mAwrdeOk20zf0SSbpX17MDmUoMwKsP9u8bqHahNoucjtuVSRtjSe 94xntc0fHkiIueApffxjErJOd2pmjGxJ7D2lkjV4G3AEg3vqFXk6E8nPIqIZL4qI 9KzmAFv88+QDIVTM5fheIOxZpeBkXtq2e19gCijiysqLDWL2CLuN4LVzhKCkJF6x QGN1FcLk95ikvhI/LEn6qrih -----END ENCRYPTED PRIVATE KEY----- -----开始加密私钥----- MIICrjAoBgoqhkiG9w0BDAEDMBoEFM1kXgdc0vzEhCwQG5G2wAaSA7POAgInEASC AOAKBPJKNVPT9O9+Q63WMscX0eEiGyD6/kFwI+ZgH4/s98uKDHxWTB0fQ+HA+Iy gQC1b+QhT2HVR0DIB6lfhou4FrcJXBAqf4h0ybkfmE4xTfVQcCpgKm4uUC/FYjks dgTMajN9NHL06nUjd/0UVSM2BZBJHXLDMPRB0LDFVUXCGN0VVN13IJRJRNGWTGR nv6ZyE3gbjCRanINhMtCDMtg9Ydm7+DHC53YOeqbbhgO9/aJHpRzX/H6zLYp/oa0 GPHM6NZSTFAS8QYQR+EaoFad/XHVC9NKUDQM8LVJMKDLXRLDMPHQ4KZQMIBIJE /Pu2IfHB0jYYa93F2i0fKkIaeve4oo3/IZBN0AMXVNSPmnKyriouuUALZI/gb/419 vp+1kmAKsEFCRIDQlDCiR9CyuePOaR0d7EckVMDU0uR9MXYAV73Y3VRXe1votrQ/ 5Wi8ueio9TBDYj9wYYoYmRpz454HqJ/71k0xr5IJugJIJkUzNN9VkjK9rhgT0Vz5 wY/E1yZZepqCR1xrYgDuu/n4t63EERMo+BgkpKBMnWliU3QdQT2r4qBnma+c9lq8 IWb3y3Phl4LsX3DnLed1rUIOcQKiN2T9/yl+7EETK8APKKULK5DDDYTGACQ1MIF 7Ie2939OG1c3mAwrdeOk20zf0SSbpX17MDmUoMwKsP9u8bqHahNoucjtuVSRtjSe 94xNTC0FHKIIUEAPFXJERJOD2PMJGXJ7D2LKJV4G3AEG3VQFXK6E8NPIQIZL4QI 9KzmAFv88+QDIVTM5fheIOxZpeBkXtq2e19gCijiysqLDWL2CLuN4LVzhKCkJF6x QGN1FcLk95ikvhI/LEn6qrih -----结束加密私钥----- 包含加密私钥的PKCS#8文件具有以下ASN.1结构:

EncryptedPrivateKeyInfo ::= SEQUENCE {
  encryptionAlgorithm EncryptionAlgorithmIdentifier,
  encryptedData EncryptedData }
请注意,加密数据只是整个数据包的一部分。您需要将此数据与加密算法标识符一起包含在序列中。上面的代码只生成
encryptedData
部分


我建议你考虑使用蹦蹦跳跳。看起来他们可能有。下面是一些示例代码:

KeyPairGenerator generator = KeyPairGenerator.getInstance("RSA");
KeyPair keyPair = generator.generateKeyPair();

final PrivateKey privKey = keyPair.getPrivate();

JceOpenSSLPKCS8EncryptorBuilder builder =
    new JceOpenSSLPKCS8EncryptorBuilder(PKCS8Generator.PBE_SHA1_3DES);

builder.setIterationCount(10000);
builder.setPasssword("Hello, World!".toCharArray());

OutputEncryptor outputEncryptor = builder.build();    
PKCS8Generator pkcs8Generator =
    new JcaPKCS8Generator(privKey, outputEncryptor);

try (PemWriter writer = new PemWriter(new PrintWriter(System.out))) {
  writer.writeObject(pkcs8Generator);
}
这将输出加密的私钥:

-----BEGIN ENCRYPTED PRIVATE KEY----- MIICrjAoBgoqhkiG9w0BDAEDMBoEFM1kXgdc0vzEhCwQG5G2wAaSA7POAgInEASC AoAkBPjKkNVpt9O9+Q63WMscX0eEiGyD6/kFwI+ZgH4/s98uKDHxWTB0fQ+HA+Iy gQC1b+QhT2HVR0DIB6lfhou4FrcJXBAqf4h0ybkfmE4xTfVQcCpgKm4uUC/FYjks dgTMajN9NHL06nUjd/0uVsM2bzbJHXlDmPRB0LdfvuxzcGN0Vvn13IJrjRnGwTGR nv6ZyE3gbjCRanINhMtCDMtg9Ydm7+DHC53YOeqbbhgO9/aJHpRzX/H6zLYp/oa0 GpHM6NzsTfABS8QyqR+EaoFad/XHvC9nKUDqm8LVjmKdlXrLDmpHQ4kxZqMIbijE /Pu2IfHB0jYYa93F2i0fKkIaeve4oo3/izBn0amXVnsPMnkyrIoUUaLzI/gb/419 vp+1kmAKsEFCRIDQlDCiR9CyuePOaR0d7EckVMDU0uR9MXYAV73Y3VRXe1votrQ/ 5Wi8ueio9TBDYj9wYYoYmRpz454HqJ/71k0xr5IJugJIJkUzNN9VkjK9rhgT0Vz5 wY/E1yZZepqCR1xrYgDuu/n4t63EERMo+BgkpKBMnWliU3QdQT2r4qBnma+c9lq8 IWb3y3Phl4LsX3DnLed1rUIOcQKiN2T9/yl+7eEtk8APkKuLK5DDDytgAcOQ1MIF 7Ie2939OG1c3mAwrdeOk20zf0SSbpX17MDmUoMwKsP9u8bqHahNoucjtuVSRtjSe 94xntc0fHkiIueApffxjErJOd2pmjGxJ7D2lkjV4G3AEg3vqFXk6E8nPIqIZL4qI 9KzmAFv88+QDIVTM5fheIOxZpeBkXtq2e19gCijiysqLDWL2CLuN4LVzhKCkJF6x QGN1FcLk95ikvhI/LEn6qrih -----END ENCRYPTED PRIVATE KEY----- -----开始加密私钥----- MIICrjAoBgoqhkiG9w0BDAEDMBoEFM1kXgdc0vzEhCwQG5G2wAaSA7POAgInEASC AOAKBPJKNVPT9O9+Q63WMscX0eEiGyD6/kFwI+ZgH4/s98uKDHxWTB0fQ+HA+Iy gQC1b+QhT2HVR0DIB6lfhou4FrcJXBAqf4h0ybkfmE4xTfVQcCpgKm4uUC/FYjks dgTMajN9NHL06nUjd/0UVSM2BZBJHXLDMPRB0LDFVUXCGN0VVN13IJRJRNGWTGR nv6ZyE3gbjCRanINhMtCDMtg9Ydm7+DHC53YOeqbbhgO9/aJHpRzX/H6zLYp/oa0 GPHM6NZSTFAS8QYQR+EaoFad/XHVC9NKUDQM8LVJMKDLXRLDMPHQ4KZQMIBIJE /Pu2IfHB0jYYa93F2i0fKkIaeve4oo3/IZBN0AMXVNSPmnKyriouuUALZI/gb/419 vp+1kmAKsEFCRIDQlDCiR9CyuePOaR0d7EckVMDU0uR9MXYAV73Y3VRXe1votrQ/ 5Wi8ueio9TBDYj9wYYoYmRpz454HqJ/71k0xr5IJugJIJkUzNN9VkjK9rhgT0Vz5 wY/E1yZZepqCR1xrYgDuu/n4t63EERMo+BgkpKBMnWliU3QdQT2r4qBnma+c9lq8 IWb3y3Phl4LsX3DnLed1rUIOcQKiN2T9/yl+7EETK8APKKULK5DDDYTGACQ1MIF 7Ie2939OG1c3mAwrdeOk20zf0SSbpX17MDmUoMwKsP9u8bqHahNoucjtuVSRtjSe 94xNTC0FHKIIUEAPFXJERJOD2PMJGXJ7D2LKJV4G3AEG3VQFXK6E8NPIQIZL4QI 9KzmAFv88+QDIVTM5fheIOxZpeBkXtq2e19gCijiysqLDWL2CLuN4LVzhKCkJF6x QGN1FcLk95ikvhI/LEn6qrih -----结束加密私钥-----
您不应该在自己的代码中使用
sun.security.x509.*
类。也许你应该改用BouncyCastle之类的东西?请在上面的代码中为
ALGO
提供一个值,这样我就可以试着重现。@Duncan Jones:谢谢你的时间。ALGO的值为“DES”。您不应该在自己的代码中使用
sun.security.x509.*
类。也许你应该改用BouncyCastle之类的东西?请在上面的代码中为
ALGO
提供一个值,这样我就可以试着重现。@Duncan Jones:谢谢你的时间。ALGO的值为“DES”。PKCS8Generator现在已弃用-您可以使用JcaPKCS8Generator和JceOpenSSLPKCS8EncryptorBuilder来设置密码保护。PKCS8Generator现在已弃用-您可以使用JcaPKCS8Generator和JceOpenSSLPKCS8EncryptorBuilder来设置密码保护。