如何通过 openssl 将 jwk 转换为公钥

2023-12-25

我有一个 JWE,标头中有一个临时公钥。 所以我有坐标X和Y。

我在 shell 模式下的问题是如何将 JWK 转换为 pem 格式的 ECC 公钥。

例如,这里有一个 jwk

{"epk":{"kty":"EC","crv":"P-256","x":"GCl--lQHb7NKYU3jXpKVI_BYaTlALT5JFPdl3sbB9mY","y":"ADRX25PBSlZJE79drET0ARtRqZAkUIMNt9aa2bbjBYY"}}

当我这样做之后

> # I convert the x coordonate from base64url to base64
> echo -n -e "GCl++lQHb7NKYU3jXpKVI/BYaTlALT5JFPdl3sbB9mY" | base64 -d | hexdump

0000000 2918 fa7e 0754 b36f 614a e34d 925e 2395
0000010 58f0 3969 2d40 493e f714 de65 c1c6 66f6
0000020

> echo -n -e "ADRX25PBSlZJE79drET0ARtRqZAkUIMNt9aa2bbjBYY" | base64 -d | hexdump

0000000 3400 db57 c193 564a 1349 5dbf 44ac 01f4
0000010 511b 90a9 5024 0d83 d6b7 d99a e3b6 8605
0000020

所以公钥是 04 2918 FA7E 0754 B36F 614A E34D 925E 2395 58f0 3969 2d40 493e f714 de65 c1c6 66f6 3400 db57 c193 564a 1349 5dbf 44ac 01f4 511b 90a9 5024 0d83 d6b7 d99a e3b6 8605

但是我有曲线、公钥,我想知道如何生成pem?

换句话说,

我有一个文件 mykey.pub 其中包含以下内容:

-----BEGIN PUBLIC KEY-----
MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAETGUwowNEfqQ0LtHiMXJPY+Os5pXc
lsYCRPOi3F6K0n4k1RjJ7PGp/9RhZy3XS1yn1Qlu4hoCClHcc9rPXPn4fQ==
-----END PUBLIC KEY-----

我执行此命令来显示公钥:

> openssl ec -in mykey.pub -pubin -text -noout
read EC key
Public-Key: (256 bit)
pub:
    04:4c:65:30:a3:03:44:7e:a4:34:2e:d1:e2:31:72:
    4f:63:e3:ac:e6:95:dc:96:c6:02:44:f3:a2:dc:5e:
    8a:d2:7e:24:d5:18:c9:ec:f1:a9:ff:d4:61:67:2d:
    d7:4b:5c:a7:d5:09:6e:e2:1a:02:0a:51:dc:73:da:
    cf:5c:f9:f8:7d
ASN1 OID: prime256v1
NIST CURVE: P-256

所以我的问题是我是否有这些数据

> openssl ec -in mykey.pub -pubin -text -noout
read EC key
Public-Key: (256 bit)
pub:
    04:4c:65:30:a3:03:44:7e:a4:34:2e:d1:e2:31:72:
    4f:63:e3:ac:e6:95:dc:96:c6:02:44:f3:a2:dc:5e:
    8a:d2:7e:24:d5:18:c9:ec:f1:a9:ff:d4:61:67:2d:
    d7:4b:5c:a7:d5:09:6e:e2:1a:02:0a:51:dc:73:da:
    cf:5c:f9:f8:7d
ASN1 OID: prime256v1
NIST CURVE: P-256

如何在 shell 模式下检索它

-----BEGIN PUBLIC KEY-----
MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAETGUwowNEfqQ0LtHiMXJPY+Os5pXc
lsYCRPOi3F6K0n4k1RjJ7PGp/9RhZy3XS1yn1Qlu4hoCClHcc9rPXPn4fQ==
-----END PUBLIC KEY-----

首先让我简要描述一下您的目标格式。您想要获取的是 PEM 编码的SubjectPublicKeyInfo (SPKI) 文件。 PEM 编码本质上是 DER 编码(这是一种二进制格式),然后使用页眉和页脚进行 Base64 编码。 SPKI 结构在 RFC5280 中定义(参见第 4.1 节):

https://www.rfc-editor.org/rfc/rfc5280#section-4.1 https://www.rfc-editor.org/rfc/rfc5280#section-4.1

   SubjectPublicKeyInfo  ::=  SEQUENCE  {
        algorithm            AlgorithmIdentifier,
        subjectPublicKey     BIT STRING  }

因此,二进制 DER 编码中的第一个字节块包含一个标头,用于标识所使用的算法(其中一部分包括曲线)。最后一个字节是原始公钥(它是曲线上编码的 x 和 y 坐标)。

由于您的示例密钥与您要创建的密钥相同的曲线,因此它将具有相同的 AlgorithmIdentifier 标头字节。我们可以将您的 mykey.pub 文件转换为二进制 DER 格式:

$ openssl ec -in mykey.pub -pubin -outform DER -out key.der

我们来看一下内容:

$ hexdump -C key.der
00000000  30 59 30 13 06 07 2a 86  48 ce 3d 02 01 06 08 2a  |0Y0...*.H.=....*|
00000010  86 48 ce 3d 03 01 07 03  42 00 04 4c 65 30 a3 03  |.H.=....B..Le0..|
00000020  44 7e a4 34 2e d1 e2 31  72 4f 63 e3 ac e6 95 dc  |D~.4...1rOc.....|
00000030  96 c6 02 44 f3 a2 dc 5e  8a d2 7e 24 d5 18 c9 ec  |...D...^..~$....|
00000040  f1 a9 ff d4 61 67 2d d7  4b 5c a7 d5 09 6e e2 1a  |....ag-.K\...n..|
00000050  02 0a 51 dc 73 da cf 5c  f9 f8 7d                 |..Q.s..\..}|
0000005b

您可以看到上面打印出的公钥的第一个字节,从偏移量 0x1a 开始(即 26 个字节):04 4c 65 30 ...。原始公钥数据一直延伸到文件末尾,长度为 65 个字节。它由前导 0x04 字节组成,后跟 32 字节的 x 坐标和 32 字节的 y 坐标。前导 0x04 告诉我们坐标是如何表示的。 0x04 意味着“未压缩”——这很方便,因为这对我们来说是最简单的处理方式。我们还将使用未压缩的格式作为目标密钥。因此,我们需要从示例密钥中获取标头的前 26 个字节加上 0x04 字节(总共 27 个字节):

$ head -c 27 key.der >key.head

只是为了检查我们是否得到了我们所期望的:

$ hexdump -C key.head
00000000  30 59 30 13 06 07 2a 86  48 ce 3d 02 01 06 08 2a  |0Y0...*.H.=....*|
00000010  86 48 ce 3d 03 01 07 03  42 00 04                 |.H.=....B..|
0000001b

现在我们创建坐标的 x 和 y 元素,您已经这样做了:

$ echo -n "GCl++lQHb7NKYU3jXpKVI/BYaTlALT5JFPdl3sbB9mY=" | base64 -d >key.x
$ echo -n "ADRX25PBSlZJE79drET0ARtRqZAkUIMNt9aa2bbjBYY=" | base64 -d >key.y

然后将所有元素放在一起:

cat key.head key.x key.y >keynew.der

我们可以将 DER 格式的新密钥转换为 PEM 格式:

$ openssl ec -in keynew.der -inform DER -pubin -out keynew.pem

这给了我们:

-----BEGIN PUBLIC KEY-----
MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEGCl++lQHb7NKYU3jXpKVI/BYaTlA
LT5JFPdl3sbB9mYANFfbk8FKVkkTv12sRPQBG1GpkCRQgw231prZtuMFhg==
-----END PUBLIC KEY-----

只是为了检查它看起来是否正常:

$ openssl ec -in keynew.pem -pubin -noout -text
read EC key
Public-Key: (256 bit)
pub:
    04:18:29:7e:fa:54:07:6f:b3:4a:61:4d:e3:5e:92:
    95:23:f0:58:69:39:40:2d:3e:49:14:f7:65:de:c6:
    c1:f6:66:00:34:57:db:93:c1:4a:56:49:13:bf:5d:
    ac:44:f4:01:1b:51:a9:90:24:50:83:0d:b7:d6:9a:
    d9:b6:e3:05:86
ASN1 OID: prime256v1
NIST CURVE: P-256
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何通过 openssl 将 jwk 转换为公钥 的相关文章

  • OpenSSL DH 密钥太小错误

    我正在尝试使用简单的 PERL 脚本连接到封闭的服务器 空调 usr bin perl use 5 10 1 use warnings use strict use IO Socket SSL use IO Socket SSL qw de
  • BadPaddingException:无效的密文

    我需要一些帮助 因为这是我第一次编写加密代码 加密代码似乎工作正常 但解密会引发错误 我得到的错误是 de flexiprovider api exceptions BadPaddingException 无效的密文 in the 解密函数
  • iPhone 和加密库

    我想我必须在我的 iPhone 应用程序中使用加密库 我想问你有关苹果公司实施的加密货币出口政策的影响 我需要做一些额外的事情吗 例如填写表格等 1 如果我使用 MD5 进行哈希处理 2 如果我使用对称加密 Thanks EDIT 2009
  • 握手失败(40) 和 TLS_EMPTY_RENEGOTIATION_INFO_SCSV

    安装在 jBOSS 上的客户端正在尝试访问在 DataPower 上配置的安全网站xi50v6 0 0 2器具 SSL 握手时连接失败 我在 DataPower 上进行了数据包捕获 发现 SSL 握手失败 并显示以下错误 Descripti
  • RSACryptoServiceProvider 使用自己的公钥和私钥进行加密和解密

    据我所知 对于非对称加密 您可以使用公钥加密明文并使用私钥解密 所以我尝试了以下方法 static void Main string args RSACryptoServiceProvider rsa new RSACryptoServic
  • 如何从秘密字符串中制作 HMAC_SHA256 密钥以在 jose4j 中与 JWT 一起使用?

    我想生成 JWT 并使用 HMAC SHA256 对其进行签名 对于该任务我必须使用jose4j https bitbucket org b c jose4j wiki Home 我尝试根据秘密生成密钥 SecretKeySpec key
  • 使用 CryptoJS 更改密钥 [重复]

    这个问题在这里已经有答案了 我正在使用 CryptoJS 来加密和解密文本 在这里 我只是获取消息并显示加密和解密消息 我使用DES算法进行加密和解密 这是我的 HTML 文件
  • 直接使用从密钥库加载的 SecretKey 时,密钥用户未经过身份验证

    我正在尝试使用 Cipher 和在 KeyStore 中加载的 SecretKey 来加密数据 但总是收到此错误 导致 android security KeyStoreException 关键用户未经过身份验证 我尝试自己创建 Secre
  • 使用ssl和socket的python客户端身份验证

    我有一个 python 服务器 需要客户端使用证书进行身份验证 我如何制作一个客户端脚本 使用客户端证书由 python 中的服务器使用 ssl 和套接字模块进行身份验证 有没有仅使用套接字和 ssl 而不扭曲的示例 from OpenSS
  • 我应该存储密码的哈希值吗?

    用户系统和密码 我正在查看 MD5 内容 我想知道密码的正常 良好做法是什么 现在 我认为人们对密码进行超级加密并存储哈希值 如果是这样 密码检查如何工作 我只是让输入的密码再次经过加密过程 然后用存储的哈希值检查哈希值 对吗 这个问题可能
  • OpenSSL 真的需要 openssl.conf 的路径吗?

    我想在 PHP 5 x 中创建自签名证书 使用我自己的 替代 openssl 配置 该配置应该由我的 PHP 代码定义 PHP 脚本将在不同的环境 共享托管网络服务器 上运行 官方PHP手册 http php net manual en f
  • 数据未保存为加密数据 django

    到目前为止 我尝试了超过 6 个插件 但现在很沮丧 现在用的是这个密码学 https pypi org project django cryptography 一切都很好并相应地完成 但是当我像这样在模型管理器中保存数据时 def crea
  • javascript 中的 RSA 不再支持 ASCII/字节数组

    我正在使用 rsa js v1 0http www cs students stanford edu tjw jsbn http www cs students stanford edu tjw jsbn 在浏览器中加密 ASCII 字符串
  • 如何显示证书的主题备用名称?

    我发现的最接近的答案是使用 grep gt openssl x509 text noout in cert pem grep DNS 有更好的方法吗 我只喜欢命令行 Thanks 较新版本的 openssl 有一个 ext 选项 允许您仅打
  • 在 python 2.7 中更新 openssl

    想知道是否有人可以解释 openssl 在 python2 7 中如何工作 我不确定 python 是否有自己的 openssl 或者从本地机器 env 中获取它 让我解释 如果我在Python中这样做 gt gt gt import ss
  • 如何使 RSACryptoServiceProvider 在没有填充(nopadding)的情况下工作?

    我需要使 C 应用程序与 Java 应用程序兼容 Java 应用程序使用Cipher getInstance RSA ECB nopadding 初始化器使密码 ECB 和无填充 但是 在 C 中 您有 2 个填充选项 OAEP 填充或 P
  • 穷人序列号生成方案

    我想得到一些简单的方案 算法 用于根据一些唯一的硬件ID CPU ID或以太网MAC地址或硬盘序列号 生成序列号 我希望方案仅在一个方向上工作 因此客户端计算机上的应用程序可以验证序列号但不能生成序列号 所以破解起来并不简单 现在很可能大多
  • 如何解密 BigQuery 中的列?

    我在 BigQuery 中有一些加密列 我想使用 BigQuery 函数对其进行解密 用于加密它们的机制是 AES 256 使用的向量以 UTF8 编码 生成的数据采用 Base64 加密 我想要做的是使用函数解密 BigQuery 中传递
  • 使用公钥时出现 InvalidKeySpecException

    我正在拼命尝试在 Android 上使用非对称公钥 私钥加密技术来加密消息 我在 Windows 上 使用 puttygen 生成了公钥和私钥 我不确定它有什么区别 但我选择了 SSH 2 RSA 这是公钥 AAAAB3NzaC1yc2EA
  • 解密 TLS 1.2 AES-GCM 数据包

    我正在开发一个 Java 程序来解密TLS 1 2正在使用的会话TLS RSA WITH AES 128 GCM SHA256密码 我使用wireshark 录制了一个测试会话 这大师秘密是已知的 No Time Protocol Leng

随机推荐