【问题标题】:Java how to use private key file instead of PEM to decrypt?Java如何使用私钥文件而不是PEM来解密?
【发布时间】:2015-07-31 08:37:43
【问题描述】:

使用 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());

【问题讨论】:

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

标签: java encryption cryptography bouncycastle pem


【解决方案1】:

已解决。以下对我有用。

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;
}

【讨论】:

    【解决方案2】:

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

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

    它还使用 Java 7/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。但是,在这种情况下,您必须自己执行流处理。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-05-18
      • 1970-01-01
      • 2018-11-25
      • 1970-01-01
      • 2010-11-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多