java - 在 Java 中使用 .pfx 证书解密文件
问题描述
我有一个 .pfx 文件和该文件的密码。
我想使用 Java 解密 RSA 加密文件。基本上与此处(c#)相同的方法,但在java中: https ://stackoverflow.com/a/37894914/13329087
这可能吗?
到目前为止我的方法:
byte[] file = Files.readAllBytes(Paths.get("C:/file.fileinfo"));
String pfxPassword = "pwd";
String keyAlias = "pvktmp:1ce254e5-4620-4abf-9a12-fbbda5b97fa0";
KeyStore keystore = KeyStore.getInstance("PKCS12");
keystore.load(new FileInputStream("/keystore.pfx"), pfxPassword.toCharArray());
PrivateKey key = (PrivateKey)keystore.getKey(keyAlias, pfxPassword.toCharArray());
Cipher cipher = Cipher.getInstance(key.getAlgorithm());
cipher.init(Cipher.DECRYPT_MODE, key);
System.out.println(new String(cipher.doFinal(file)));
这会产生一个错误:
Exception in thread "main" javax.crypto.BadPaddingException: Decryption error
at sun.security.rsa.RSAPadding.unpadV15(RSAPadding.java:379)
at sun.security.rsa.RSAPadding.unpad(RSAPadding.java:290)
at com.sun.crypto.provider.RSACipher.doFinal(RSACipher.java:365)
at com.sun.crypto.provider.RSACipher.engineDoFinal(RSACipher.java:391)
at javax.crypto.Cipher.doFinal(Cipher.java:2168)
解决方案
不幸的是,您没有提供密钥库 *pfx-file 和加密文件,所以我不得不设置自己的文件。如果您想使用我的文件运行我的示例,您可以在此处获取它们:
https://github.com/java-crypto/Stackoverflow/tree/master/Decrypt_using_pfx_certificate_in_Java
您的源代码未显示 inputStream-value
keystore.load(inputStream, pfxPassword.toCharArray());
我使用了直接加载密钥库:
keystore.load(new FileInputStream("keystore.pfx"), pfxPassword.toCharArray());
使用我的实现,我可以使用此控制台输出成功解密加密文件(“fileinfo”):
https://stackoverflow.com/questions/62769422/decrypt-using-pfx-certificate-in-java?noredirect=1#comment111047725_62769422
RSA decryption using a pfx keystore
The quick brown fox jumps over the lazy dog
回答您的问题:是的,可以使用 pfx-keystore 解密 RSA 加密文件。您在实现中看到的错误似乎导致用于加密的密钥(对)(证书中的公钥)在此期间发生了变化,并且您正在尝试使用(可能是新生成的)其他私钥解密(具有相同的别名)。要检查这一点,您需要提供密钥库和加密文件...
这是我正在使用的实现(我刚刚编辑了 inputStream-line):
import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;
import java.io.FileInputStream;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.security.*;
import java.security.cert.CertificateException;
public class MainSo {
public static void main(String[] args) throws IOException, KeyStoreException, UnrecoverableKeyException, NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, BadPaddingException, IllegalBlockSizeException, CertificateException {
System.out.println("https://stackoverflow.com/questions/62769422/decrypt-using-pfx-certificate-in-java?noredirect=1#comment111047725_62769422");
System.out.println("RSA decryption using a pfx keystore");
//byte[] file = Files.readAllBytes(Paths.get("C:/file.fileinfo"));
byte[] file = Files.readAllBytes(Paths.get("fileinfo"));
// password for keystore access and private key + certificate access
String pfxPassword = "pwd";
String keyAlias = "pvktmp:1ce254e5-4620-4abf-9a12-fbbda5b97fa0";
// load keystore
KeyStore keystore = KeyStore.getInstance("PKCS12");
//keystore.load(inputStream, pfxPassword.toCharArray());
keystore.load(new FileInputStream("keystore.pfx"), pfxPassword.toCharArray());
PrivateKey key = (PrivateKey) keystore.getKey(keyAlias, pfxPassword.toCharArray());
Cipher cipher = Cipher.getInstance(key.getAlgorithm());
cipher.init(Cipher.DECRYPT_MODE, key);
System.out.println(new String(cipher.doFinal(file)));
}
}
推荐阅读
- time - Unix 时间说明
- python - 如何检查字符是否不是字符串中数字或 URL 的一部分?
- google-chrome - Chrome扩展开发,几个JS文件,互相访问全局,怎么办?
- c++ - 在 Azerothcore 中从 c++ 代码添加自定义战利品
- c# - 如何将 OpenXML 从模板创建的 Word 文档转换为 MemoryStream?
- vsto - 在 VSTO 清单中设置 VSTO 加载项 FriendlyName 和描述
- .net-core - 将 AspNetCore 内部 WebHost 请求重写为 https
- ruby-on-rails - 在 Alpine Linux 上使用无头 Chrome/Chromium 的 Rspec
- web-component - 如何为 HTMLElement 的任何实例定义影子 DOM?
- scala - 如何找到多列的最大值?