如何加载椭圆曲线 PEM 编码的私钥? [复制]

2024-05-27

我使用 OpenSSL 生成了椭圆曲线私钥/公钥对。私钥和公钥均采用 PEM 编码。我已经弄清楚如何加载公钥,感谢this. https://stackoverflow.com/a/40439081但是,我无法弄清楚如何加载私钥,因为上述消息最终以 InvalidKeySpecException: key spec not recognize 结束。

然后我发现this https://stackoverflow.com/a/23369629,但它最终也会出现“编码的密钥规范无法识别”。如何加载我的私钥?

private PrivateKey loadPrivateKey(String location) {
    try {
        // Strip the guarding strings
        byte[] bytes = stripGuardLines(location);

        return KeyFactory.getInstance("ECDH").generatePrivate(new PKCS8EncodedKeySpec(bytes));
    } catch (FileNotFoundException e) {
        LoggerFactory.getLogger("Nectar").error("Failed to find Private KEY: " + location);
        System.exit(1);
    } catch (IOException e) {
        LoggerFactory.getLogger("Nectar").error("IOException while loading Private Key!");
        e.printStackTrace();
        System.exit(1);
    } catch (NoSuchAlgorithmException | InvalidKeySpecException e) {
        e.printStackTrace();
        System.exit(1);
    }

    return null;
}

private byte[] stripGuardLines(String location) throws IOException {
    BufferedReader r = new BufferedReader(new FileReader(location));

    String line;
    StringBuilder sb = new StringBuilder();
    while((line = r.readLine()) != null) {
        if(line.contains("EC PRIVATE KEY")) { //Check if guard line
            continue;
        }
        sb.append(line);
    }
    // Guard lines stripped, now decode base64

    return Base64.getDecoder().decode(sb.toString());
}

这是私钥文件:

-----BEGIN EC PRIVATE KEY-----
MIGkAgEBBDD2MFRv6BpJU6/zDI2yBfVbe0oeU1nFAoYMedDGtcdwHyWNJSeiYRBA
pVNzMxPSBLWgBwYFK4EEACKhZANiAAQBttEp/qUGnDlmL+o6KZnVs+RoBnEBEGho
PxSUu1Xfj77QQqfuqHOCRzWXseQA1aZB/h6VQEiFovugtG1G3HaMxxrqLLxb10g2
BMaRcAfZyeqc3O0Ui8XXb1esn0gOrCU=
-----END EC PRIVATE KEY-----

您的代码仅输出密钥本身。它缺少 PKCS#8 编码私钥所需的算法说明符。幸运的是,密钥本身在编码时始终具有相同的大小(它不使用任何 ASN.1 整数,据我所知,它可能具有不同的大小)。

这意味着您可以简单地连接另一个键的标头:

// static header you can put in front
byte[] header = Hex.decode("30 81bf 020100 301006072a8648ce3d020106052b81040022 0481a7");
// your key from the PEM above
byte[] fromPEM = Base64.decode("MIGkAgEBBDD2MFRv6BpJU6/zDI2yBfVbe0oeU1nFAoYMedDGtcdwHyWNJSeiYRBApVNzMxPSBLWgBwYFK4EEACKhZANiAAQBttEp/qUGnDlmL+o6KZnVs+RoBnEBEGhoPxSUu1Xfj77QQqfuqHOCRzWXseQA1aZB/h6VQEiFovugtG1G3HaMxxrqLLxb10g2BMaRcAfZyeqc3O0Ui8XXb1esn0gOrCU=");
byte[] bytes = Arrays.concatenate(header, fromPEM);
PrivateKey ecPrivate = KeyFactory.getInstance("EC").generatePrivate(new PKCS8EncodedKeySpec(bytes));

此代码既与 Bouncy Castle 兼容,又与 Oracle 的 Java JRE 中的默认实现兼容。


请注意,您也可以使用 Oracle 兼容代码来创建密钥对:

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

如何加载椭圆曲线 PEM 编码的私钥? [复制] 的相关文章

  • Grails 3.x bootRun 失败

    我正在尝试在 grails 3 1 11 中运行一个项目 但出现错误 失败 构建失败并出现异常 什么地方出了错 任务 bootRun 执行失败 进程 命令 C Program Files Java jdk1 8 0 111 bin java
  • 控制Android的前置LED灯

    我试图在用户按下某个按钮时在前面的 LED 上实现 1 秒红色闪烁 但我很难找到有关如何访问和使用前置 LED 的文档 教程甚至代码示例 我的意思是位于 自拍 相机和触摸屏附近的 LED 我已经看到了使用手电筒和相机类 已弃用 的示例 但我
  • 列出jshell中所有活动的方法

    是否有任何命令可以打印当前 jshell 会话中所有新创建的方法 类似的东西 list但仅适用于方法 您正在寻找命令 methods all 它会打印所有方法 包括启动 JShell 时添加的方法 以及失败 被覆盖或删除的方法 对于您声明的
  • 反射找不到对象子类型

    我试图通过使用反射来获取包中的所有类 当我使用具体类的代码 本例中为 A 时 它可以工作并打印子类信息 B 扩展 A 因此它打印 B 信息 但是当我将它与对象类一起使用时 它不起作用 我该如何修复它 这段代码的工作原理 Reflection
  • JavaMail 只获取新邮件

    我想知道是否有一种方法可以在javamail中只获取新消息 例如 在初始加载时 获取收件箱中的所有消息并存储它们 然后 每当应用程序再次加载时 仅获取新消息 而不是再次重新加载它们 javamail 可以做到这一点吗 它是如何工作的 一些背
  • 路径中 File.separator 和斜杠之间的区别

    使用有什么区别File separator和一个正常的 在 Java 路径字符串中 与双反斜杠相反 平台独立性似乎不是原因 因为两个版本都可以在 Windows 和 Unix 下运行 public class SlashTest Test
  • 如何在PreferenceActivity中添加工具栏

    我已经使用首选项创建了应用程序设置 但我注意到 我的 PreferenceActivity 中没有工具栏 如何将工具栏添加到我的 PreferenceActivity 中 My code 我的 pref xml
  • 如何为俚语和表情符号构建正则表达式 (regex)

    我需要构建一个正则表达式来匹配俚语 即 lol lmao imo 等 和表情符号 即 P 等 我按照以下示例进行操作http www coderanch com t 497238 java java Regular Expression D
  • Java按日期升序对列表对象进行排序[重复]

    这个问题在这里已经有答案了 我想按一个参数对对象列表进行排序 其日期格式为 YYYY MM DD HH mm 按升序排列 我找不到正确的解决方案 在 python 中使用 lambda 很容易对其进行排序 但在 Java 中我遇到了问题 f
  • 在两个活动之间传输数据[重复]

    这个问题在这里已经有答案了 我正在尝试在两个不同的活动之间发送和接收数据 我在这个网站上看到了一些其他问题 但没有任何问题涉及保留头等舱的状态 例如 如果我想从 A 类发送一个整数 X 到 B 类 然后对整数 X 进行一些操作 然后将其发送
  • 为什么HashMap不能保证map的顺序随着时间的推移保持不变

    我在这里阅读有关 Hashmap 和 Hashtable 之间的区别 http javarevisited blogspot sg 2010 10 difference Between hashmap and html http javar
  • 使用Caliper时如何指定命令行?

    我发现 Google 的微型基准测试项目 Caliper 非常有趣 但文档仍然 除了一些示例 完全不存在 我有两种不同的情况 需要影响 JVM Caliper 启动的命令行 我需要设置一些固定 最好在几个固定值之间交替 D 参数 我需要指定
  • Java Integer CompareTo() - 为什么使用比较与减法?

    我发现java lang Integer实施compareTo方法如下 public int compareTo Integer anotherInteger int thisVal this value int anotherVal an
  • Google App Engine 如何预编译 Java?

    App Engine 对应用程序的 Java 字节码使用 预编译 过程 以增强应用程序在 Java 运行时环境中的性能 预编译代码的功能与原始字节码相同 有没有详细的信息这是做什么的 我在一个中找到了这个谷歌群组消息 http groups
  • 如何在桌面浏览器上使用 webdriver 移动网络

    我正在使用 selenium webdriver 进行 AUT 被测应用程序 的功能测试自动化 AUT 是响应式网络 我几乎完成了桌面浏览器的不同测试用例 现在 相同的测试用例也适用于移动浏览器 因为可以从移动浏览器访问 AUT 由于它是响
  • Firebase 添加新节点

    如何将这些节点放入用户节点中 并创建另一个节点来存储帖子 我的数据库参考 databaseReference child user getUid setValue userInformations 您需要使用以下代码 databaseRef
  • 捕获的图像分辨率太大

    我在做什么 我允许用户捕获图像 将其存储到 SD 卡中并上传到服务器 但捕获图像的分辨率为宽度 4608 像素和高度 2592 像素 现在我想要什么 如何在不影响质量的情况下获得小分辨率图像 例如我可以获取或设置捕获的图像分辨率为原始图像分
  • 使用 JMF 创建 RTP 流时出现问题

    我正处于一个项目的早期阶段 需要使用 RTP 广播DataStream创建自MediaLocation 我正在遵循一些示例代码 该代码目前在rptManager initalize localAddress 出现错误 无法打开本地数据端口
  • java.lang.IllegalStateException:驱动程序可执行文件的路径必须由 webdriver.chrome.driver 系统属性设置 - Similiar 不回答

    尝试学习 Selenium 我打开了类似的问题 但似乎没有任何帮助 我的代码 package seleniumPractice import org openqa selenium WebDriver import org openqa s
  • 节拍匹配算法

    我最近开始尝试创建一个移动应用程序 iOS Android 它将自动击败比赛 http en wikipedia org wiki Beatmatching http en wikipedia org wiki Beatmatching 两

随机推荐

  • Numpy 中矩阵乘以另一个矩阵的每一行

    我有一个大小为 4x4 的齐次变换矩阵和一个大小为 nx3 的轨迹 该轨迹的每一行都是一个向量 我想将齐次变换矩阵乘以轨迹的每一行 下面是代码 append zero column at last trajectory np hstack
  • 无法在 phppgadmin 中编辑或删除数据或行

    当我尝试在 phppgadmin 中编辑数据时 无论哪个表或行 我总是收到以下通知 No unique identifier for this row 并且没有任何更改 保存 我登录的用户对数据库具有完全权限 并且数据库中的所有表都有主键
  • Facebook API 注销我的应用程序,但不注销 Facebook

    如何使用 Facebook 的 api 进行注销 让我退出我的应用程序 网站 但保持登录 facebook com 的状态 这让我登录正常 window fbAsyncInit function FB init appId status t
  • Matplotlib 颤抖比例

    我正在尝试使用 matplotlib 和 quiver 函数绘制一些箭头 但我想使用数组单独选择每个箭头的长度 http matplotlib sourceforge net api pyplot api html matplotlib p
  • Cookie 过期时间格式

    我从谷歌浏览器的 Cookies 文件和其中的一列创建了数据库cookies表是expires utc 该列的格式类似于 13169399213145330 这更像是unix时间 但是当我尝试使用 unix 时间转换器时 它给出了错误的值
  • 接口对象无法扩展 Record

    为什么接口无法扩展Record interface Data a string Data extends Record
  • dplyr 标准评估:summarise_ 以及求和变量的变量名称

    我遇到了很多与我的问题类似的问题 但只解决了我问题的一部分 我使用带有标准评估的 dplyr 来容纳变量名称 这对于管道中的 filter 和 group by 效果很好 但是 为了总结 我无法为我正在求和的指标提供变量名称 一个例子就可以
  • 如何保护 ASP.NET Web API [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我想建立一个RESTful使用 ASP NET Web API 的 Web 服务 第三方开发人员将使用该服务来访问我的应用程序的数据
  • 在 UIPickerView 中选择某些内容时发生某些事情

    我正在致力于创建一个使用 UIPickerView 的应用程序 我制作了视图 但我试图让某个按钮改变它的功能 请帮忙 UIPickerView 和许多其他控件使用委托模式来通知您发生的事件 要使用它添加
  • 使用“class-validator”在 TypeScript 中确认密码

    今天 我试图弄清楚如何在应用程序的后端 NestJS 验证注册表单 我只是想知道是否存在一种验证方法password and passwordConfirm匹配 使用class validator包来构建自定义验证器或利用提供的验证器 我正
  • 会话变量由于某种原因丢失

    我尝试建立一个电子商店 每件物品旁边都有一个asp imagebutton单击此图像按钮时 我正在检查会话变量是否session basket 是否存在 如果不存在 则我将值添加到列表 实体类 中 然后在会话中添加此列表 如果会话不为空 那
  • 在类中设置默认值

    我正在用 Python 创建一个类 但我不确定如何正确设置默认值 我的目标是为所有类实例设置默认值 也可以通过类方法对其进行修改 但是 我希望在调用方法后恢复初始默认值 我已经能够使用下面所示的代码使其工作 它不是很 漂亮 所以我怀疑这是解
  • Ruby 中实现的所有设计模式的备忘单?

    我想知道是否有针对 Ruby 中实现的所有设计模式的备忘单 这样您就不必重新发明轮子 设计模式对于组织大量代码非常有用 因为您不需要像在 verbose algol derivitive language 中那样编写那么多代码来在 ruby
  • 为什么 LED 保持亮起而不是闪烁?

    这是使用 pic16f676 中的 TIMER0 中断使 LED 闪烁的 MPASM 代码 端口 A 的引脚 0 RA0 未切换至关闭位置 请帮忙 我是图片组装的新手 我想掌握图片 有没有高手帮我学习一下 我需要以 1 秒的间隔眨眼 代码是
  • SimpleDateFormat 无法正确处理 DD

    我正在尝试获得这样的格式 2013 06 15 17 45 我在代码中执行以下操作 Date d new Date SimpleDateFormat ft new SimpleDateFormat YYYY MM DD HH mm Stri
  • 最低 DirectX 9.0c 版本以及如何检查它

    我们基于 Windows C Ogre 的游戏即将完成 在我们公开发布之前 我们必须解决这个问题 如果未更新到最新的 Dx9 0c 版本 Ogre 在许多测试计算机上都会崩溃 所有这些计算机都已经安装了 9 0c 但这一定是旧操作系统预安装
  • MSB6003 无法运行指定的任务可执行文件“sgen.exe”。文件名或扩展名太长

    在 Windows 10 上运行 VS 2017 15 5 3 出现此一般错误 无法运行指定的任务可执行文件 sgen exe 文件名或扩展名太长 在Release配置和X64平台上构建项目时 但它在调试配置和任何 CPU 平台上都构建得很
  • 除了推送收据之外,关闭 FireBase 调配还会影响分析吗?

    The Firebase 云消息传递文档 https firebase google com docs cloud messaging ios client说他们混合了一些方法来获取推送通知令牌并记录接收推送通知 在里面FIR 分析文档 h
  • Vimeo 播放器 JS API 在 iOS 中无法运行

    我正在尝试使用 API 来播放视频 但只有在 iOS 中单击播放器中的播放按钮后它才有效 在桌面版和 Android 版 Chrome 中 它运行良好 http codepen io bdougherty pen JgDfm http co
  • 如何加载椭圆曲线 PEM 编码的私钥? [复制]

    这个问题在这里已经有答案了 我使用 OpenSSL 生成了椭圆曲线私钥 公钥对 私钥和公钥均采用 PEM 编码 我已经弄清楚如何加载公钥 感谢this https stackoverflow com a 40439081但是 我无法弄清楚如