Java如何使用私钥文件而不是PEM来解密?

Java如何使用私钥文件而不是PEM来解密?,java,encryption,cryptography,bouncycastle,pem,Java,Encryption,Cryptography,Bouncycastle,Pem,使用Java和Bouncy Castle 1.52,我可以使用以下代码通过PEM证书加载私钥。我还有一个相同的PKCS8格式的private.key文件。直接使用private.key文件而不是PEM的代码是什么 String keyPath = "C:\\RSA7\\privatenopass.pem"; BufferedReader br = new BufferedReader(new FileReader(keyPath)); PEMParser pp = new PEMParser(b

使用Java和Bouncy Castle 1.52,我可以使用以下代码通过PEM证书加载私钥。我还有一个相同的PKCS8格式的private.key文件。直接使用private.key文件而不是PEM的代码是什么

String keyPath = "C:\\RSA7\\privatenopass.pem";
BufferedReader br = new BufferedReader(new FileReader(keyPath));
PEMParser pp = new PEMParser(br);
PEMKeyPair pemKeyPair = (PEMKeyPair) pp.readObject();
KeyPair kp = new JcaPEMKeyConverter().getKeyPair(pemKeyPair);
pp.close();
cipher.init(Cipher.DECRYPT_MODE, kp.getPrivate());

这很简单,因为Java本身已经使用PKCS#8编码来编码RSA私钥

请注意,此示例仅使用PKCS#8的内部编码。PKCS#8密钥实际上由一个分层结构组成(内部编码表示密钥类型,它被包装,外部编码表示使用的包装机制)

它还使用一些来自Java7/8的方便方法从文件中读取字节。您可以将其替换为任何代码来读取文件中的所有字节

Path path = (new File("privatenopass.pkcs8")).toPath();
byte[] pkcs8Data = Files.readAllBytes(path);
KeyFactory kf = KeyFactory.getInstance("RSA");
PKCS8EncodedKeySpec keyspec = new PKCS8EncodedKeySpec(pkcs8Data);
RSAPrivateKey pk = (RSAPrivateKey) kf.generatePrivate(keyspec);

您直接将文件读取器交给Bouncy Castle解码PEM。但是,在这种情况下,您必须自己执行流处理。

已解决。以下几点对我有用

File mypkfile = new File("C:\\myfolder\\private.key");
byte[] myPK = fullyReadFile(mypkfile);
PKCS8EncodedKeySpec privateKeySpec = new PKCS8EncodedKeySpec(myPK);
KeyFactory kf = KeyFactory.getInstance("RSA");
PrivateKey privKey = kf.generatePrivate(privateKeySpec);
cipher.init(Cipher.DECRYPT_MODE, privKey);
fullyReadFIle方法:

public static byte[] fullyReadFile(File file) throws IOException
{
            DataInputStream dis = new DataInputStream(new FileInputStream(file));
            byte[] bytesOfFile = new byte[(int) file.length()];
            dis.readFully(bytesOfFile);
            dis.close();
            return bytesOfFile;
}

根据此答案,您应该检查
PemParser
返回的对象是什么,它很可能是
PKCS8EncryptedPrivateKeyInfo
。您好,感谢您的回复。private.key未加密,它位于磁盘上,可以使用。我知道它是PKCS8格式,我只想使用它(?)有人建议PEM文件中的密钥已经以PKCS#8格式存储,因此如果它没有使用密码加密,您只需删除头(----BEGIN RSA PRIVATE key-----),Base64解码输入,并获得所需的字节。但是肯定有标准化的代码来做这件事吗?pem解析器用它做什么?请尝试是否可以创建某种类型的对象,或者是否必须手动创建。请使用常用标记。我不是一直在扫描所有与密码相关的标签。