bash – 如何将原始模数和指数转换为RSA公钥(.pem格式)
我有模数&嵌入到二进制文件中的RSA公钥的指数,我试图提取整个blob并创建一个可用的.pem公钥.
目前,我正在提取完整的260个字节(指数为4个字节,模数为256个字节) 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编码的关键数据 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’表示整数 如果你的模数是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 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |