如何通过 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 转换为公钥 的相关文章

  • 将加密从 C++ (crypto++) 匹配到 C#

    我正在尝试使用 crypto 和 c 来匹配 c 上的加密方案 但似乎无法在两者上获得相同的结果 它们都对自己起作用 但不是从一个到另一个 任何帮助都会很棒 使用 Crypto 的 C 代码 std string key 012865678
  • xampp openssl 调用 openssl_pkey_new() 时出错;

    所以我试图让 openssl 在我的 Windows 安装的 xampp 1 7 3 上工作 它是用 OpenSSL 0 9 8l 构建的 这只是我第二次在 amp 安装上安装 openssl 但第一次进展顺利 这是在同一台机器上的 wam
  • 可以挂载未加密的 obb 但出现加密错误 21

    这与 kitkat bug 无关 我正在 4 4 2 中测试 我可以毫无问题地挂载 obb 文件 问题是当尝试对加密的 obb 执行相同操作时 我在 Windows 中使用 jobb 如下 jobb d my folder o exp ob
  • 如何向数据添加填充以使其可以接受 pycrypto 库中的 AES256 加密算法

    有人可以告诉我如何向数据添加填充 使其可以接受 pycrypto 库 Python 中的 AES256 加密算法 提前非常感谢 看着文档 http www dlitz net software pycrypto doc 看来要由图书馆用户自
  • 如何使用 python-gnupg 加密大型数据集而不占用所有内存?

    我的磁盘上有一个非常大的文本文件 假设它是 1 GB 或更多 还假设该文件中的数据有 n每 120 个字符一个字符 我在用python gnupg https pythonhosted org python gnupg 对此文件进行加密 由
  • iPhone 公钥加密 SecKeyEncrypt 返回错误 9809 (errSSLCrypto)

    我试图使用 iPhone 的 PKI 库来加密一个短字符串 12345678 但每当我尝试使用 SecKeyEncrypt 时 我总是收到错误 9809 即 errSSLCrypto SecureTransport h 头文件将此错误简单地
  • C# AES Rijndael - 检测无效密码

    我正在使用 Rijndael 加密程序中的一些敏感数据 当用户输入错误的密码时 大多数情况下CryptographicException抛出消息 填充无效且无法删除 然而 CryptStream 不会抛出密码错误的异常 而是返回错误解密的流
  • 使用 Java 进行 AES 加密并使用 Javascript 进行解密

    我正在制作一个需要基于 Java 的 AES 加密和基于 JavaScript 的解密的应用程序 我使用以下代码作为基本形式进行加密 public class AESencrp private static final String ALG
  • 用于加密的 Webauthn

    我们有一个 PWA 项目 我们想要实现客户端加密 我们希望将 Webauthn 用作与密码结合的第二因素 在后台我们使用随机生成的密钥来加密 解密数据库 该密钥与密码对称加密存储在服务器上 然而 我正在努力寻找一种使用 webauthn 向
  • iPhone 和服务器上的 3DES 加密不同

    我有以下代码用于加密发送到服务器的请求 服务器上的解码由 NET 完成 在 iPhone 上 我使用带有以下代码的安全框架 NSString doCipher NSString plainText CCOperation encryptOr
  • 从 DER 格式的字符串 base64 编码创建 PrivateKey 和 PublicKey

    我的私钥和公钥位于 base64 的字符串中 使用 ANS1 DER 进行编码 我尝试创建 java 的实例PrivateKey and PublicKey byte llave2 DatatypeConverter parseBase64
  • 使用 OpenSSL 1.1 的 SHA256 HMAC 未编译

    下面的代码使用 HMAC SHA256 生成签名哈希 此代码在 Debian Jessie 和 Ubuntu 16 04 OpenSSL 1 0 2g 2016 年 3 月 1 日 上编译并运行良好 include
  • 证书中的“-----BEGIN TRUSTED CERTIFICATE-----”是什么意思?

    我获得了一个 CA 证书 如下所示 据我所知 证书应该以 BEGIN CERTIFICATE 开头 那么 BEGIN TRUSTED CERTIFICATE 部分是什么意思 我检查了 OpenSSL 文档 它说 可信 部分是可信设置 但我想
  • 将大数字转换为字母(然后再转换回来)

    是否有一个术语来描述将大数字存储为字母的想法 例如 假设我有 相对较小的 数字 138201162401719 并且我想将字符数缩小到尽可能少的字符数 我知道这无助于节省磁盘空间 英文字母表中有 26 个字母 但我将它们算作 25 个 因为
  • 在 SQLite 中加密数据

    如何加密我的数据 就我研究的解决方案而言 有两种方法 使用android提供的算法加密数据 我使用android提供的 Cipher 来加密我的数据 但我在检索大量记录的数据时遇到问题 导致应用程序的性能显着降低 我对整个数据库进行了编码
  • HTTPS 和 SSL3_GET_SERVER_CERTIFICATE:证书验证失败,CA 正常

    我在用XAMPP http www apachefriends org为发展 最近我将 xampp 的安装从旧版本升级到 1 7 3 现在 当我卷曲启用 HTTPS 的网站时 出现以下异常 致命错误 未捕获异常 RequestCore Ex
  • 恢复 SQL Server 数据库 - 主密钥未打开

    我必须制作远程 SQL Server 数据库的本地副本 我通过使用 Management Studio 中的 任务 gt 备份 来完成此操作 然后 我在本地恢复了备份 该备份似乎包含了所有内容 表 用户 对称密钥和证书 当我尝试执行需要打开
  • python 和 android 中通过 AES 算法加密和解密

    我有用于 AES 加密的 python 和 android 代码 当我在android中加密文本时 它在python上成功解密 但无法在android端解密 有人有想法吗 Python代码 import base64 import hash
  • 为什么这个字符串用AesCryptoServiceProvider第二次解密时不相等?

    我在 C VS2012 NET 4 5 中的文本加密和解密方面遇到问题 具体来说 当我加密并随后解密字符串时 输出与输入不同 然而 奇怪的是 如果我复制加密的输出并将其硬编码为字符串文字 解密就会起作用 以下代码示例说明了该问题 我究竟做错
  • 使用 PHP 的 openssl_pkcs7_sign 签署 pdf 时出错

    我正在使用 TCPDF 生成 pdf 文档并对其进行签名 TCPDF 本身只是调用 PHP 的openssl pkcs7 sign函数 在我看来 它正在调用 C 的PKCS7 sign函数基于源代码 https github com php

随机推荐