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

埃里克·奈奎斯特(Erik Nyquist)

我将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。)

康斯坦丁·谢米亚克(Konstantin Shemyak)

您使用的命令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解码器查看结构)。

内容:

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

如果正确收集了模数和指数字节,则可以通过串联这四样来构造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 0101 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

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

将RSA公钥转换为PEM格式

来自分类Dev

将RSA公钥转换为PEM格式

来自分类Dev

如何将SSH公钥从PEM转换为DER格式?

来自分类Dev

如何使用PEM格式的RSA公钥解码JWT令牌?

来自分类Dev

生成 PEM 格式的公钥/私钥对

来自分类Dev

将.pem私钥转换为.key格式

来自分类常见问题

如何以.pem格式保存证书中的公钥

来自分类Dev

将pfx格式化的私钥转换为pem格式

来自分类Dev

.pem证书转换为可读格式

来自分类Dev

(Erlang)以Pem格式从证书中提取公钥

来自分类Dev

PHP OpenSSL无法读取PEM格式的公钥

来自分类Dev

使用.pem格式的公钥在Xcode中进行签名验证

来自分类Dev

如何将Pem私钥转换为可在.NET中使用的Windows的格式

来自分类Dev

如何将二进制私钥文件转换为openssl可接受的pem格式

来自分类Dev

如何将 ObjectHandle 从 Pkcs11Interop 转换为 X509 证书或 Pem 格式?

来自分类Dev

如何将PEM密钥转换为RSA密钥对?

来自分类Dev

如何从PEM获得指数和模数

来自分类Dev

如何将PEM格式的密钥(不是OpenPGP)导入GPG?

来自分类Dev

python将RSA密钥(PEM格式)转换为十六进制字符串

来自分类Dev

从整数加载rsa私钥并在openssl中转换为PEM格式或RSA结构以签名消息

来自分类Dev

从整数加载rsa私钥,并在openssl中转换为PEM格式或RSA结构以签名消息

来自分类Dev

尝试将私钥和公钥转换为字符串格式

来自分类Dev

openssl可以将SSH公钥转换为没有私钥的PEM文件吗?

来自分类Dev

加载密钥“ ec256.pem”:尝试从私钥生成公钥时抛出了无效的格式

来自分类Dev

如何将组织模式表转换为原始选项卡式格式?

来自分类Dev

原始格式为 dd-mm-yyyy 时如何将日期转换为 unixtime

来自分类Dev

如何将这些 PEM 文件(包括链)转换为 KEY 和 CRT 文件?

来自分类Dev

如何从PFX以PEM格式导出CA证书链而没有包属性

来自分类Dev

如何在不需要 NodeJS 中的 PEM 密钥格式的情况下生成 ECDSA 符号?

Related 相关文章

  1. 1

    将RSA公钥转换为PEM格式

  2. 2

    将RSA公钥转换为PEM格式

  3. 3

    如何将SSH公钥从PEM转换为DER格式?

  4. 4

    如何使用PEM格式的RSA公钥解码JWT令牌?

  5. 5

    生成 PEM 格式的公钥/私钥对

  6. 6

    将.pem私钥转换为.key格式

  7. 7

    如何以.pem格式保存证书中的公钥

  8. 8

    将pfx格式化的私钥转换为pem格式

  9. 9

    .pem证书转换为可读格式

  10. 10

    (Erlang)以Pem格式从证书中提取公钥

  11. 11

    PHP OpenSSL无法读取PEM格式的公钥

  12. 12

    使用.pem格式的公钥在Xcode中进行签名验证

  13. 13

    如何将Pem私钥转换为可在.NET中使用的Windows的格式

  14. 14

    如何将二进制私钥文件转换为openssl可接受的pem格式

  15. 15

    如何将 ObjectHandle 从 Pkcs11Interop 转换为 X509 证书或 Pem 格式?

  16. 16

    如何将PEM密钥转换为RSA密钥对?

  17. 17

    如何从PEM获得指数和模数

  18. 18

    如何将PEM格式的密钥(不是OpenPGP)导入GPG?

  19. 19

    python将RSA密钥(PEM格式)转换为十六进制字符串

  20. 20

    从整数加载rsa私钥并在openssl中转换为PEM格式或RSA结构以签名消息

  21. 21

    从整数加载rsa私钥,并在openssl中转换为PEM格式或RSA结构以签名消息

  22. 22

    尝试将私钥和公钥转换为字符串格式

  23. 23

    openssl可以将SSH公钥转换为没有私钥的PEM文件吗?

  24. 24

    加载密钥“ ec256.pem”:尝试从私钥生成公钥时抛出了无效的格式

  25. 25

    如何将组织模式表转换为原始选项卡式格式?

  26. 26

    原始格式为 dd-mm-yyyy 时如何将日期转换为 unixtime

  27. 27

    如何将这些 PEM 文件(包括链)转换为 KEY 和 CRT 文件?

  28. 28

    如何从PFX以PEM格式导出CA证书链而没有包属性

  29. 29

    如何在不需要 NodeJS 中的 PEM 密钥格式的情况下生成 ECDSA 符号?

热门标签

归档