我将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解码器查看结构)。
内容:
如果正确收集了模数和指数字节,则可以通过串联这四样来构造OpenSSL可以理解的形式的公钥。您已经有了第一个较长的标题。“中间标题”是“ 02 03”:
如果您的模数是2048位(256字节),指数是3个字节(以便长度字段保持有效),则可以通过将以下四个串联来生成PEM文件:
<header> <modulus> 0x02 0x03 <exponent>
这就是为什么二进制转储中的最后一个字节与OpenSSL输出不同的原因:提取的260个字节不包含02 03
,而是将65537记录为00 01 00 01
(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
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句