当前位置: 首页 > 知识库问答 >
问题:

如何转换原始模数

罗昕
2023-03-14

我有模量

目前,我正在提取完整的260个字节(指数为4个字节,模数为256个字节)并编码为base 64。我使用以下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=

现在,当我拿钥匙的时候。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编码的密钥数据实际上存在于从密钥中提取的有效公钥数据的数据中。pem使用openssl。然而,开头有45个字符,我自己提取的数据没有-

MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA

最后8个字符也不同。

ZwIDAQAB

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

(目标是在bash脚本中实现这一点,而不是像我看到的许多人建议的那样使用python或C。)

共有2个答案

明利
2023-03-14

你可以用蟒蛇3

from Crypto.PublicKey import RSA
e = int('your exponent', 16)
n = int('your modules', 16)
# Construct a `RSAobj` with only ( n, e ), thus with only PublicKey
RSA.construct( ( n, e ) ).publickey().exportKey()

参考我有一个RSA公钥指数和模。如何使用Python加密字符串?

堵龙野
2023-03-14

您使用的命令,openssl rsa-in密钥。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

(您可以在pubkey.pem或使用在线ASN.1解码器中看到带有openssl asn1parse-的结构)。

内容包括:

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

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

  1. “02”表示整数

如果您的模数是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

 类似资料:
  • 问题内容: 我有一个和一帮在里面。我想把它变成一个数组,但是打电话 返回。除了手动遍历每个元素,还有更好的方法将其转换为其他数组吗?我想将数组传递给 即使我尝试将其像强制转换那样也不会接受Object []数组 问题答案: Apache的ArrayUtils具有以下功能(它仍在幕后进行迭代): 它们始终是检查此类事情的好地方。

  • 我在Java中有一个tiff图像的INT[2048][2048]原始数据数组。我想把那个数组转换回BufferedImage。我该如何进行?

  • 问题内容: 我需要一种将结构/接口动态转换回其原始对象的方法。我可以在其中添加方法/函数。基本上我需要这样的东西: 在最后一次转换时,除了该结构内部的内容外,我对原始结构一无所知,所以我不能只是这样: 问题答案: 否:如本主题所述 Go既不是协变也不是协变。类型 相等 或不 相等 。 您必须将结构拆开并处理碎片,或者使用反射。 类型断言只是“ 断言 ”,而不是任何类型的“强制”。 另请参阅此线程,

  • 当对象相加 obj1 + obj2,相减 obj1 - obj2,或者使用 alert(obj) 打印时会发生什么? 在这种情况下,对象会被自动转换为原始值,然后执行操作。 在 类型转换 一章中,我们已经看到了数值,字符串和布尔转换的规则。但是我们没有讲对象的转换规则。现在我们已经掌握了方法(method)和 symbol 的相关知识,可以开始学习对象原始值转换了。 所有的对象在布尔上下文(con

  • 我有一个文件包。crd。伊滕是这样的 我需要将其导入到以下格式的excel文件中。 我试过这个代码,但不起作用 请帮忙

  • 问题内容: 我试图理解Java中日益缩小的原始转换概念。这是JLS 5.1.3 所说的: 关于原始类型的22种特定转换称为“缩小原始转换”: 短字节或字符 字符到字节或短 从int到byte,short或char 长到字节,短,字符或整数 浮点到字节,short,char,int或long 双精度字节,短整数,字符,整数,长整数或浮点数 由于是隐式转换转换到,我们可以写出下面的代码: 演示 但这是