如何将原始模数和指数转换为 RSA 公钥(.pem 格式)

2024-04-14

我将 RSA 公钥的模数和指数嵌入到二进制文件中,并且我正在尝试提取整个 blob 并创建可用的 .pem 公钥。

目前,我正在提取完整的 260 个字节(4 个字节用于指数,256 个字节用于模数) 并编码为base64。我正在使用以下 shell 命令来执行此操作:

tail -c $((filesize - start_of_key_data)) filename | head -c $size_of_key_data | base64 > outkey

这给了我以下字符串:

<<<<<< modulus & exponent extracted from binary file, base64-encoded >>>>>>

tZyrQA6cZFJfVm6FyXwtZaLQYg8EecuO+ObrHTwc8JO+XrgnpNAdmlhbAEPxSNnjwhNnbYGYGL4F
vzmnZXzZU71Key42HQPh1k2Zx1UDbrH5ciODKx1ZbuEx8K24SHnL1nY/H75hwhT/ZRRVGQDvYDT+
sgzw2vmV66+dflw1Zs8BLhqjLjczdHvjeVXsDRJ9Mvvd/dhFH8UlTf4JpLGya9nsNIfNBBIf1Lll
RWwCTiEIbaOMgWcLjLV/2tk/j5Dra/oQnVf/2hVsEF/hXEx41YjeEW/warweoDVG7zaxrHEc/k/r
ZCUCZKxf8nBKdqax/gRICvkG6e5xg2GQw0W/ZwABAAE=

现在,当我获取最初从中提取模数和指数的 key.pem 密钥对时,并像这样显示公共部分

openssl rsa -in key.pem -pubout -out pubkey.pem

我得到这个字符串(我省略了页眉和页脚行:

<<<<<<<<< valid public key data extracted from keypair >>>>>>>>>

MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtZyrQA6cZFJfVm6FyXwt
ZaLQYg8EecuO+ObrHTwc8JO+XrgnpNAdmlhbAEPxSNnjwhNnbYGYGL4FvzmnZXzZ
U71Key42HQPh1k2Zx1UDbrH5ciODKx1ZbuEx8K24SHnL1nY/H75hwhT/ZRRVGQDv
YDT+sgzw2vmV66+dflw1Zs8BLhqjLjczdHvjeVXsDRJ9Mvvd/dhFH8UlTf4JpLGy
a9nsNIfNBBIf1LllRWwCTiEIbaOMgWcLjLV/2tk/j5Dra/oQnVf/2hVsEF/hXEx4
1YjeEW/warweoDVG7zaxrHEc/k/rZCUCZKxf8nBKdqax/gRICvkG6e5xg2GQw0W/
ZwIDAQAB

可以看到我自己提取并base64编码的关键数据是 实际上存在于使用 openssl 从 key.pem 中提取的有效公钥数据的数据中。 然而开头有 45 个字符,我自己提取的数据没有 -

MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA

最后 8 个字符也不同。

ZwIDAQAB

有人可以就如何将模数和指数转换为可用的公钥提供一些建议吗?

(目标是在 bash 脚本中执行此操作,而不是像我看到的许多人建议的那样使用 python 或 C。)


您使用的命令,openssl rsa -in key.pem -pubout -out pubkey.pem,生成如下所示的 ASN.1 结构:

SEQUENCE(2 elem)
  SEQUENCE(2 elem)
    OBJECT IDENTIFIER 1.2.840.113549.1.1.1
    NULL
  BIT STRING(1 elem)
    SEQUENCE(2 elem)
      INTEGER(2048 bit) 229263895356027367204242482830890190076375310244080661230946245232688…
      INTEGER 65537

(你可以看到结构openssl asn1parse -in pubkey.pem,或使用在线 ASN.1 解码器 http://lapo.it/asn1js).

其内容:

  1. 固定标头(包含所有字节,指定编码 整个序列加上模数的编码)
  2. modulus
  3. header,指定指数的编码
  4. exponent

如果您正确收集了模数和指数字节,则可以通过连接这四件事以 OpenSSL 可以理解的形式构造公钥。您已经有了第一个较长的标题。 “中间标头”是“02 03”:

  1. '02' 为整数
  2. 整数本身的长度为 3 个字节 (65537 = 01 00 01)

如果您的模数为 2048 位(256 字节)且指数为 3 字节(以便长度字段保持有效),则可以通过连接这四个来生成 PEM 文件:

<header> <modulus> 0x02 0x03 <exponent>

这就是二进制转储的最后一个字节与 OpenSSL 输出不同的原因:提取的 260 字节不包含02 03,而是将 65537 记录为00 01 00 01 (not 01 00 01如 ASN.1 编码)。

总而言之,您可以像这样生成 PEM 文件:

将提取的模数+指数从 base64 转换回并提取它们(注意257字节偏移量以跳过 65537 的前导零字节!):

echo 'tZyrQA6cZFJfVm6FyXwtZaLQYg8EecuO+ObrHTwc8JO+XrgnpNAdmlhbAEPxSNnjwhNnbYGYGL4FvzmnZXzZU71Key42HQPh1k2Zx1UDbrH5ciODKx1ZbuEx8K24SHnL1nY/H75hwhT/ZRRVGQDvYDT+sgzw2vmV66+dflw1Zs8BLhqjLjczdHvjeVXsDRJ9Mvvd/dhFH8UlTf4JpLGya9nsNIfNBBIf1LllRWwCTiEIbaOMgWcLjLV/2tk/j5Dra/oQnVf/2hVsEF/hXEx41YjeEW/warweoDVG7zaxrHEc/k/rZCUCZKxf8nBKdqax/gRICvkG6e5xg2GQw0W/ZwABAAE=' | base64 -d > modulus-exp.bin
dd if=modulus-exp.bin of=modulus.bin bs=1 count=256
dd if=modulus-exp.bin of=exponent.bin bs=1 skip=257 count=3

创建标题:

echo 'MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA' | base64 -d > header.bin
echo '02 03' | xxd -r -p > mid-header.bin

将它们连接在一起:

cat header.bin modulus.bin mid-header.bin exponent.bin > key.der

转换为 PEM:

openssl pkey -inform der -outform pem -pubin -in key.der -out key.pem

测试您是否获得工作密钥 - 通过使用 ASN.1 解码器检查它,或者通过

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

如何将原始模数和指数转换为 RSA 公钥(.pem 格式) 的相关文章

  • Bash:在新终端中执行带有参数的命令[重复]

    这个问题在这里已经有答案了 所以我想在 bash 中打开一个新终端并执行带参数的命令 只要我只采取类似的东西ls作为命令它工作正常 但是当我采取类似的东西时route n 所以带参数的命令不起作用 代码 gnome terminal win
  • Bash 脚本 Mysql 警告:在命令行界面上使用密码可能不安全

    你好 我有一个脚本来对一些 mysql 数据库进行分区 我们正在从 5 5 升级到 5 6 在测试脚本时 我注意到新的 5 6 版本 mysql 返回Warning Using a password on the command line
  • 为什么 rm 不能按我的预期工作?

    我只想做一件简单的事 我在目录中得到了以下文件 AppInterface h baa PEMsg h PluginInterface h 然后我发出命令 ls grep v h rm rf 令我非常沮丧的是 baa不会被删除 但是这个 ls
  • 如何在 awk 或 sed 中编写查找所有函数(使用正则表达式)

    我有运行 python 的 bash 函数 它从标准输入返回所有找到的正则表达式 function find all python c import re import sys print n join re findall 1 sys s
  • 由于参数中有空格,Bash 脚本因未知选项而失败

    我正在尝试运行 aws create lambda 函数 事情的经过如下 eval aws lambda create function function name FUNCTION NAME runtime RUNTIME role RO
  • Bash或Python,当打印字符到终端时,如何更改固定位置的字符?

    我想知道的事情应该是非常 基本 的 但这是我脑海中很长一段时间的问题 不知道窍门在哪里 假设在一个耗时的程序中 或者bash or Python 我必须打印出运行时的进度百分比 基本上我想打印1 一段时间后 我打印2 等等 我想要 2 完全
  • 健全性检查 SSH 公钥? [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我已要求用户提供他们的公共 id rsa pub ssh 密钥 然后将其放入 home theiraccount ssh authorized key
  • 混淆 bash 中存储的密码

    我有一个 bash 脚本 我需要编写密码才能运行程序 其他人可以看到它 有没有办法把密码写得不太明显 即使他可以在 bash 中执行相同的命令并获取密码 他也无法读取文本形式的密码 今天我这样做 PASSWORD 1234567 progr
  • 为所有图像添加前缀(递归)

    我有一个包含 5000 多张图像的文件夹 全部带有 JPG 扩展名 我想要做的就是递归地向所有图像添加 thumb 前缀 我发现了一个类似的问题 重命名文件和目录 添加前缀 https stackoverflow com questions
  • 将文本文件转换为逗号分隔的字符串

    我似乎没有找到与这个问题完全匹配的问题 我有一个文本文件 每行有一个文本标记 没有任何逗号 制表符或引号 我想根据文件内容创建一个逗号分隔的字符串 Input one two three Output one two three 我正在使用
  • bash while 循环线程

    我有一个 while 循环读取来自 a 的行 hosts while read line do ip line check done lt hosts 我的问题是我可以使用某种方法来加快速度 或者一次在 10 个主机上运行检查 每个检查都在
  • 将 erlang shell 作为守护进程/服务运行

    显然 我有一个在 Erlang shell 中运行的 Erlang 程序 我想监视它 这就是我要的 当机器启动时 Erlang shell 应该随之启动 并且在 shell 中运行的程序也应该随之启动 如果 Erlang shell 由于某
  • Bash 脚本:语法错误:意外的文件结尾[重复]

    这个问题在这里已经有答案了 我有以下文件 并且该文件上有 chmod a x 当我尝试运行它时 出现第 75 行 语法错误 意外的文件结尾 我的脚本有什么错误 我需要做什么来修复它 bin sh log directory for ascp
  • 安全地记住 bash 脚本中的 ssh 凭据[重复]

    这个问题在这里已经有答案了 假设我有一个 bash 脚本 它通过 ssh 在远程计算机上执行命令 Do something here ssh otheruser host command1 Do something else ssh oth
  • $PATH 中 /usr/bin 和 /usr/local/bin 等的顺序

    在我的 Mac 上 我经常使用 bash 对于我的环境设置 我添加了 usr bin and usr local bin into PATH就像我平常做的那样 虽然我知道什么 usr bin and usr local bin关于 我很好奇
  • Gradle 环境变量。从文件加载

    我是 Gradle 新手 目前我有这个任务 task fooTask doLast exec environment FOO KEY 1234567 Load from file here commandLine fooScript sh
  • 如何替换带引号的多单词字符串作为参数?

    我正在尝试替换包含多个带引号的单词的字符串变量作为命令的参数 因此 给出以下示例脚本 请注意 shebang 中的 x 这会导致输出被记录到 stderr bin bash x myArg hello world echo string i
  • 使用 GitHub 时防止将大文本文件添加到提交

    我们想要防止 非常大的文本文件 每个文件 gt 50MB 被提交到git代替git lfs 因为它们夸大了 git 历史 问题是 其中 99 大小差异的原因 这些是 YAML 文件 它们支持通过 Base64 编码进行二进制序列化 我们无法
  • 如何摆脱每个新终端会话上运行的某些内容?

    我正在使用狮子 我在每个新的终端会话上都会输出一个错误 bash rvm add to path command not found 这是一个几乎全新的用户帐户 RVM 安装在计算机上的另一个帐户上 bashrc 和 bash profil
  • envsubst 不能进行就地替换吗?

    我有一个配置文件 其中包含一些 ENV VARIABLE 样式的变量 This is my file It might contain EXAMPLES of text 现在我希望将该变量替换为保存在实际环境变量中的值 所以我正在尝试这个

随机推荐

  • JavaScript - myArray.forEach 与 for 循环的细微差别

    我看到很多建议使用的问题 for var i 0 i lt myArray length i 代替 for var i in myArray 对于数组 由于迭代不一致 see here https stackoverflow com que
  • 在汇编程序中将十进制转换为二进制

    我的第一个汇编程序需要帮助 我必须将用户输入的值从十进制转换为二进制 我不知道如何将值显示为小数 以及下一步应该做什么 谁能一步一步指导我下一步做什么 model small stack 100h data txt1 db Enter bi
  • 使用 zeep / python 创建 XML 序列

    我正在使用 zeep Python 3 6 与 SOAP API 进行交互 并使用包含此部分的 WSDL 架构
  • 如何从元组列表中提取第 n 个元素

    我正在尝试从元组列表中获取第 n 个元素 我有类似的东西 elements 1 1 1 2 3 7 3 5 10 我希望仅将每个元组的第二个元素提取到列表中 seconds 1 3 5 我知道这可以通过for循环 但我想知道是否还有另一种方
  • 如何使用 xamarin 以编程方式制作按钮?

    我正在尝试使用 xamarin ide c 以编程方式创建按钮 我需要什么代码来创建按钮 设置其大小 设置其文本 设置其背景颜色以及设置其约束 有没有办法将按钮定义为屏幕宽度的 1 4 提前致谢 首先创建按钮 UIButton button
  • JavaScript 中的循环函数

    我是 Javascript 新手 我正在寻找一个循环函数 这是Clojure 的实现 http clojuredocs org clojure core clojure core cycle我试图找到一个循环函数 可以无限循环 递归数组的值
  • Android,通过WLAN通话音频流

    我正计划为 Android 开发我的特定 VoIP 应用程序 这是场景 当接到电话时 我想通过本地电脑扬声器听到打电话的人的声音 并且我想通过我自己的电脑麦克风 耳机与他通话 所以我需要通过无线局域网发送我和我正在通话的人的音频流 像这样的
  • RFC 4648(Base[16,32,64])在 Matlab 中的实现

    有没有任何实施RFC4648 https tools ietf org html rfc4648 Base16 Base32 和 Base64 数据编码 Matlab 中 在 MATLAB 中您可以轻松使用嵌入式Java 功能 http w
  • Kubernetes Node 中的内核内存使用率较高

    我非常绝望地寻找解决方案 我正在 AWS 上运行 Kubernetes 集群 v1 16 7 节点规格为 它是一个亚马逊 EC2 t3 medium实例与4GB RAM和 AMI k8s 1 11 debian stretch amd64
  • YAP Prolog 中的正向链接?

    我需要在某些 Prolog 问题中使用前向链接器 我想避免使用普通元解释器从头开始实现它 但如果没有其他选项可用 这就是我必须要做的 因为使用元解释器执行此操作会很慢 而且我我确信应该有一些好的实现 有人知道 YAP 或 SWI Prolo
  • 通过 TCP 客户端套接字接收数据时出现问题

    我正在尝试用 C 语言编写一个 TCP 客户端程序 客户端将在其中启动 连接到服务器 然后它会发送一些信息 然后监听它收到的信息并做出相应的反应 我遇到麻烦的部分是持续聆听 这是我所拥有的 while 1 numbytes recv soc
  • Addon SDK方式制作对话框

    使用 SDK 制作对话框的正确方法是什么 该对话框不是锚定到附加栏等 而是显示在屏幕中央 似乎没有任何 API 可以实现这一重要功能 我确实看到了windows utils has open但我有两个问题 打开对话框似乎需要 chrome
  • 如何检查当前分支是否有任何内容需要提交?

    目标是获得可以在 shell 命令中评估的明确状态 I tried git status但它总是返回 0 即使有项目需要提交 git status echo this is always 0 我有一个想法 但我认为这是一个坏主意 if gi
  • 是否可以自动化即点即用应用程序?

    我有一个小型应用程序 可以通过 COM OLE 自动化实现 Microsoft Word 的自动化 不幸的是 这不适用于虚拟化的即点即用版本的 Word 因为它们在注册表中没有所需的密钥 至少不是预期的位置 换句话说 CreateObjec
  • Apache FOP 1.1 带有 zxing 的 QRCodes

    好的 我在使用 Barcode4j 2 1 和 zxing 0 1 2 在 FOP 1 1 中生成 QR 码时遇到问题 我目前有一个 FOP 1 0 实现正常工作 通过添加
  • html 中颜色选择的效率。 RGB、十六进制、名称

    浏览器解析颜色的速度有差异吗 例如 红色 我可以使用以下CSS red color red color ff0000 color rgb 255 0 0 这些都会产生相同的结果 文本颜色为红色 但从效率的角度来看 什么是最好的搭配 我意识到
  • 如何将 WMF 文件转换为 SVG 文件?

    如何将 WMF 文件转换为 SVG 我有大约 550 个 WMF 文件需要转换为 SVG 格式 对于一个文件 我在 Visio 中打开 WMF 文件并将其另存为 SVG 格式 但转换大约 550 个文件是一个繁琐的过程 实际上 这些WMF文
  • 在特定列上设置 ANSI_PADDING(同一表的不同列中 ANSI_PADDING ON 和 OFF)

    是否可以 使用单个 CREATE TABLE 脚本 设置特定的varbinary列ANSI PADDING ON但其他人ANSI PADDING OFF e g CREATE TABLE PaddingX ColumnA varbinary
  • 可绘制为字节[]

    我有一张来自网络的图像ImageView 它非常小 一个图标 我想将它存储在我的 SQLite 数据库中 我可以得到一个Drawable from mImageView getDrawable 但我不知道下一步该做什么 我不完全理解Draw
  • 如何将原始模数和指数转换为 RSA 公钥(.pem 格式)

    我将 RSA 公钥的模数和指数嵌入到二进制文件中 并且我正在尝试提取整个 blob 并创建可用的 pem 公钥 目前 我正在提取完整的 260 个字节 4 个字节用于指数 256 个字节用于模数 并编码为base64 我正在使用以下 she