从 RSA .pem 文件获取私钥 [重复]

2024-01-15

鉴于这种.pem文件(使用 openssl 生成并使用密码加密):

-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: DES-EDE3-CBC,AC009672952033EB

2wegzxf3MtncXS1CY3c.....
....
....
-----END RSA PRIVATE KEY-----

我如何获得PrivateKeyJava 中的对象?我编写了以下代码,但我找不到正确的方法来获取KeySpec:

PrivateKey readFromPem(File keyFile, String password){
    PemReader r = new PemReader(new InputStreamReader(new FileInputStream(keyFile)));
    PemObject pemObject = r.readPemObject();
    byte[] encodedKey = pemObject.getContent();

    KeySpec keySpec = ???? // how to get this?

    KeyFactory keyFactory = KeyFactory.getInstance("RSA");
    PrivateKey key = keyFactory.generatePrivate(keySpec);
    return key;
}

我想我应该建立一个RSAPrivateKeySpec,但我不知道怎么做。我尝试了以下方法这个答案 https://stackoverflow.com/a/20748064/3202887 and 这个另一个答案 https://stackoverflow.com/a/30929175/3202887,但它们都会在解析字节数组时导致错误。


我在用着充气城堡 1.57(bcprov-jdk15on、bcmail-jdk15on 和 bcpkix-jdk15on)和Java 7.

您可以使用以下命令读取私钥JcaPEMKeyConverter班级。 下面的代码适用于带密码和不带密码的密钥:

import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.bouncycastle.openssl.PEMDecryptorProvider;
import org.bouncycastle.openssl.PEMEncryptedKeyPair;
import org.bouncycastle.openssl.PEMKeyPair;
import org.bouncycastle.openssl.PEMParser;
import org.bouncycastle.openssl.jcajce.JcaPEMKeyConverter;
import org.bouncycastle.openssl.jcajce.JcePEMDecryptorProviderBuilder;

// don't forget to add the provider
Security.addProvider(new BouncyCastleProvider());
String password = "your password";

// reads your key file
PEMParser pemParser = new PEMParser(new FileReader(keyFile));
Object object = pemParser.readObject();
JcaPEMKeyConverter converter = new JcaPEMKeyConverter().setProvider("BC");

KeyPair kp;
if (object instanceof PEMEncryptedKeyPair) {
    // Encrypted key - we will use provided password
    PEMEncryptedKeyPair ckp = (PEMEncryptedKeyPair) object;
    // uses the password to decrypt the key
    PEMDecryptorProvider decProv = new JcePEMDecryptorProviderBuilder().build(password.toCharArray());
    kp = converter.getKeyPair(ckp.decryptKeyPair(decProv));
} else {
    // Unencrypted key - no password needed
    PEMKeyPair ukp = (PEMKeyPair) object;
    kp = converter.getKeyPair(ukp);
}

// RSA
KeyFactory keyFac = KeyFactory.getInstance("RSA");
RSAPrivateCrtKeySpec privateKey = keyFac.getKeySpec(kp.getPrivate(), RSAPrivateCrtKeySpec.class);

System.out.println(privateKey.getClass());

The privateKey的班级将是java.security.spec.RSAPrivateCrtKeySpec(这延伸了RSAPrivateKeySpec).

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从 RSA .pem 文件获取私钥 [重复] 的相关文章

随机推荐

  • 如何设置音频时长

    我正在尝试使用音频的 HTML DOM 持续时间属性设置音频标签的持续时间 我已尝试以下方法 但似乎不起作用 audio 0 duration 1 我已经浏览了其他答案 但我看不到任何使用持续时间属性的答案 如果持续时间属性是只读的 它还给
  • 无法在 Symfony 3 中找到模板

    我知道有很多类似的主题 但我没有找到解决方案 我有这个问题 无法找到模板 CoreBundle index html twig 查看 var www html MyProject vendor symfony symfony src Sym
  • 无法删除动态添加的脚本

    我正在附加一个子元素 其中引用了 javascript 和样式表 但我想在不再使用它时再次删除它 var head document getElementsByTagName head 0 We create the style var s
  • 为什么我收到未定义的方法“cookies”?

    我正在尝试为我的 Rails 后端应用程序设置 Authlogic 和 single access token 我正在使用rails api gem 我正在遵循这个例子 http blog centresource com 2013 06
  • PHP 中舍入的最佳方法

    我有一个表格 当用户填写他们拥有的瓶子总数时 它会插入数据库 然后总结有多少箱 例如 在葡萄酒中 有 12 个瓶箱 如果用户放入 100 个瓶子 则应将其除以 12 得出总和 8 33333333 bottles 100 将其四舍五入为数字
  • 如何确定mxgraph中连接的哪一侧已连接

    我遇到这样的问题 一个决定有 3 个方面Input Yes No 我想确定箭头连接到其中的哪一个 这是我要连接的方式 从 是 连接 问题 如何知道连接是否已连接Input Yes No sides Note 如果问题可以通过内置菱形解决 那
  • 无法从 Firebase 检索图像

    我正在尝试构建一个信使类型的应用程序 为此 我将手机中的图像上传到 Firebase 该图像已成功存储在 Firebase 存储中 我正在尝试在手机上显示图像 我使用 Picasso 和 Glide 从 Firebase 检索图像 但我的照
  • 如何在java中用普通矩形轮廓绘制圆角矩形

    对于我的 java 应用程序 我需要一个圆角矩形 其轮廓看起来像普通矩形 如下所示 我知道你可以通过在其中绘制一个普通矩形和一个 RoundRect 来实现这一点 但我不想在其中绘制一个 RoundRect 因为我想在其中绘制其他内容 所以
  • 暂停和恢复 ScheduledExecutorService

    我正在写一个俄罗斯方块克隆 我想让碎片每 60 秒落下得更快一点 为此我使用了预定执行服务 http docs oracle com javase 7 docs api java util concurrent ScheduledExecu
  • 创建运行时确定类型实例的最佳方法[重复]

    这个问题在这里已经有答案了 创建运行时确定的类型实例的最佳方法 在 NET 4 中 是什么 我有一个实例方法 虽然作用于 BaseClass 对象 但可以由其派生类的实例调用 我需要创建另一个相同类型的实例this方法内 为每个派生类重载方
  • 使用 ToArray() 将列表转换为数组

    我创建了一个名为 listItem 的类和以下列表 List
  • 重新申报错误

    我已经理解声明和定义之间的区别 当我遇到疑问时 我正在练习一些问题 下面的代码要求我列出代码片段中的错误 f int a int b int a a 20 return a 为什么这会给出重新声明错误a 它不应该给出多重定义吗a因为在 f
  • 使用 APIController 补充 [FromUri] 序列化

    我们有多个 API 控制器接受 GET 请求 如下所示 FooController public IHttpActionResult Get FromUri Foo f BarController public IHttpActionRes
  • “未使用的导入警告”和 pylint

    因此 我正在使用 Python 开发一个项目 并尝试使其符合 pylint 以及一般情况下的标准 所以 我有一个源文件 我们将其称为 a py a py import loggingsetup def foo log info This i
  • C 堆栈中的递归[关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 这是合并排序中分区的代码 我实际上无法理解 reusrion 在其中是如何工作的 合并排序分区 void partition int arr
  • 7z 命令行压缩文件夹

    我正在尝试使用 7zG exe 的命令行来压缩 7z 文件夹 我的代码适用于文件 但不适用于文件夹 有人可以告诉我使用 7z 命令行压缩文件夹的正确方法吗 以下是仅适用于文件的示例代码 每当我尝试运行此代码时 7zip 都会显示一个消息框
  • 如何在matlab中编写指标函数

    我是 matlab 的新用户 我想解决以下问题 我想构造一个分段常数函数f f应该是一个匿名函数 例如f t 1 0 0 25 t 然而 分段常数函数的区间数一般不固定 相反 分段间隔取决于用户输入 例如 如果输入4 则分段间隔变为 0 0
  • WooCommerce 在订单状态完成时触发功能

    我试图在订单完成时触发一个功能 我正在使用这段代码 add action woocommerce order status completed array this payment complete 1 然后这个函数 public func
  • 异步等待进度报告不起作用

    我有一个 C WPF 程序 它打开一个文件 逐行读取它 操作每一行 然后将该行写入另一个文件 那部分工作得很好 我想添加一些进度报告 因此我将方法设为异步 并将 wait 与进度报告结合使用 进度报告非常简单 只需更新屏幕上的标签即可 这是
  • 从 RSA .pem 文件获取私钥 [重复]

    这个问题在这里已经有答案了 鉴于这种 pem文件 使用 openssl 生成并使用密码加密 BEGIN RSA PRIVATE KEY Proc Type 4 ENCRYPTED DEK Info DES EDE3 CBC AC009672