Openssl 命令行:如何获取十六进制公钥的 PEM,224 位曲线?

如何解决Openssl 命令行:如何获取十六进制公钥的 PEM,224 位曲线?

我迷失在复杂的 openssl 命令行选项中,似乎都一样...

来自一家芯片公司的公开数据表显示了此公钥用于使用 secp224r1 进行芯片身份验证: 048A9B380AF2EE1B98DC417FECC263F8449C7625CECE82D9B916C992DA209D68 422B81EC20B65A66B5102A61596AF3379200599316A00A1410

我已将其保存为 ascii-hex 和二进制文件。我找不到 openssl 法术将其变成 PEM 公钥以进行签名验证。这些是我最好的失败尝试:

$ openssl ec -in key57.hex -pubin -inform der -pubout -outform pem
read EC key
unable to load Key
34359738384:error:0D07209B:asn1 encoding routines:ASN1_get_object:too long:crypto/asn1/asn1_lib.c:91:
34359738384:error:0D068066:asn1 encoding routines:asn1_check_tlen:bad object header:crypto/asn1/tasn_dec.c:1118:
34359738384:error:0D07803A:asn1 encoding routines:asn1_item_embed_d2i:nested asn1 error:crypto/asn1/tasn_dec.c:290:Type=X509_ALGOR
34359738384:error:0D08303A:asn1 encoding routines:asn1_template_noexp_d2i:nested asn1 error:crypto/asn1/tasn_dec.c:627:Field=algor,Type=X509_PUBKEY
$ openssl ec -in key57.bin -pubin -inform der -pubout -outform pem
read EC key
unable to load Key
34359738384:error:0D07207B:asn1 encoding routines:ASN1_get_object:header too long:crypto/asn1/asn1_lib.c:101:

密钥是 114 个十六进制数字,代表 56 个字节,前缀为 04。正确调用此密钥格式是什么,以及将其转换为可用于以下内容的格式的正确方法是什么: openssl dgst -sha1 -verify public.pem -signature signature.bin test.bin

解决方法

公钥以未压缩格式给出:0x04 + +

适用于 OpenSSL 验证的公钥格式是 X.509/SPKI。据我所知,OpenSSL 无法在两种格式之间进行转换。但是转换可以很容易地手动完成。

X509/SPKI 格式在末尾包含未压缩的密钥,对于某些曲线,例如前部是相同的。 secp224r1:

304e301006072a8648ce3d020106052b81040021033a00 + <your uncompressed key 048a...1410>

然后结果是 Base64 编码的(每 64 个字符后有一个换行符)并添加 X.509/SPKI 密钥的页眉和页脚:

-----BEGIN PUBLIC KEY-----
ME4wEAYHKoZIzj0CAQYFK4EEACEDOgAEips4CvLuG5jcQX/swmP4RJx2Jc7Ogtm5
FsmS2iCdaEIrgewgtlpmtRAqYVlq8zeSAFmTFqAKFBA=
-----END PUBLIC KEY-----

特定于 secp224r1 的序列可以通过使用 secp224r1 的任意 X.509/SPKI 密钥(例如,来自使用 OpenSSL 生成的密钥对)来确定。

您可以在 ASN.1 解码器中验证密钥,例如在线https://lapo.it/asn1js

,

您的密钥只是一个普通的 ECPoint(请参阅 RFC5480 的第 2 节)。为了有用,您需要采用 SubjectPublicKeyInfo 格式。不幸的是,OpenSSL 命令行无法直接读取 ECPoint。您需要进行一些操作以使其具有可读性。

首先将您的十六进制密钥转换为二进制:

$ xxd -r -p key.hex key.bin

接下来,我们将为同一曲线生成另一个公钥以用作模板:

$ openssl ecparam -name secp224r1 -genkey -noout -out tempkey.pem
$ openssl ec -in tempkey.pem -pubout -outform der -out temppub.der
read EC key
writing EC key

看看生成的输出是这样的:

$ hexdump -C temppub.der 
00000000  30 4e 30 10 06 07 2a 86  48 ce 3d 02 01 06 05 2b  |0N0...*.H.=....+|
00000010  81 04 00 21 03 3a 00 04  93 6c be bb be d9 45 23  |...!.:...l....E#|
00000020  96 f6 0c 93 d5 72 ab 33  b5 ea c6 df c4 ac 68 1b  |.....r.3......h.|
00000030  2c e8 10 8d 5f b1 b8 80  7d 54 70 5e 21 cd e6 c6  |,..._...}Tp^!...|
00000040  21 a4 a5 f0 7e 1a 32 9d  75 de 3d fa c3 be 58 b6  |!...~.2.u.=...X.|
00000050

这个公钥由 23 个字节的头部组成,后面是 ECPoint 数据。

要构造您想要的密钥,我们可以采用相同的头 23 个字节并将您的密钥附加到末尾:

$ head -c 23 temppub.der >public-header.der
$ cat public-header.der key.bin >publickey.der

这为我们提供了编码为 DER 的密钥。要将其作为 PEM,我们这样做:

$ openssl ec -in publickey.der -pubin -inform der -out publickey.pem -pubout
read EC key
writing EC key

你可以这样检查:

$ cat publickey.pem
-----BEGIN PUBLIC KEY-----
ME4wEAYHKoZIzj0CAQYFK4EEACEDOgAEips4CvLuG5jcQX/swmP4RJx2Jc7Ogtm5
FsmS2iCdaEIrgewgtlpmtRAqYVlq8zeSAFmTFqAKFBA=
-----END PUBLIC KEY-----
$ openssl ec -pubin -in publickey.pem -noout -text
read EC key
Public-Key: (224 bit)
pub:
    04:8a:9b:38:0a:f2:ee:1b:98:dc:41:7f:ec:c2:63:
    f8:44:9c:76:25:ce:ce:82:d9:b9:16:c9:92:da:20:
    9d:68:42:2b:81:ec:20:b6:5a:66:b5:10:2a:61:59:
    6a:f3:37:92:00:59:93:16:a0:0a:14:10
ASN1 OID: secp224r1
NIST CURVE: P-224

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 &lt;select id=&quot;xxx&quot;&gt; SELECT di.id, di.name, di.work_type, di.updated... &lt;where&gt; &lt;if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 &lt;property name=&quot;dynamic.classpath&quot; value=&quot;tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-