加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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

发布时间:2020-12-15 22:45:58 所属栏目:安全 来源:网络整理
导读:我有模数嵌入到二进制文件中的RSA公钥的指数,我试图提取整个blob并创建一个可用的.pem公钥. 目前,我正在提取完整的260个字节(指数为4个字节,模数为256个字节) 和编码为base64.我使用以下shell命令执行此操作: tail -c $((filesize - start_of_key_data)) fi
我有模数&嵌入到二进制文件中的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密钥对时,模数& exponent最初是从中提取出来的,并且像这样显示公共部分

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 -poutout -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或使用online ASN.1 decoder查看结构).

它的内容:

>一个固定的标题(包含所有字节,指定的编码)
整个序列加上模数的编码)
>模量
>标头,指定指数的编码
>指数

如果正确收集了模数和指数字节,则可以通过连接这四个内容来构造OpenSSL可以理解的表单中的公钥.你已经有了第一个更长的标题. “中间标题”是’02 03’:

>’02’表示整数
>整数本身的长度是3个字节(65537 = 01 00 01)

如果你的模数是2048字节和指数3字节(这样长度字段保持有效),可以通过连接这四个来生成PEM文件:

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

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

总而言之,您可以像这样生成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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读