OpenSSL RSA密钥大小

4

我通过以下命令生成了一个RSA密钥:

openssl genpkey -algorithm RSA -out private_key.pem -pkeyopt rsa_keygen_bits:2048

我将密钥导出为DER格式,这是二进制形式。该密钥有超过2k位。为了测试,我将公钥导出为稍微超过2k位的DER格式。
所以问题是,2048位是什么?我如何从生成的文件中获取原始位?
谢谢, Lev

你想从哪里获取原始位?你想使用哪种语言或工具? - user2807083
Stack Overflow是一个关于编程和开发问题的网站。这个问题似乎不属于编程或开发范畴。请参阅帮助中心中的我可以在这里问什么样的问题。也许超级用户信息安全堆栈交换会更适合提问。此外,还有我应该在哪里发布Dev Ops相关的问题? - jww
我想将密钥写入CPU的FLASH中。CPU将使用该密钥加密/解密消息,并通过无线接口发送它。 - Lev
2个回答

4
为了使用RSA密钥进行加密和解密,您需要模数、私钥和公钥指数。
通常使用(模数,公钥指数)进行加密,使用(模数,私钥指数)进行解密。
现在,在某些实现中(如嵌入式设备),公钥指数默认设置为称为F4的数字,即0x10001或65537十进制数。
使用2048位RSA密钥时,私钥指数和模数均为2048位。
可以通过执行一些字符串操作以二进制格式获取私钥指数:
openssl rsa -in key.der -inform der -text -noout | awk '/^[^ ]/{if($1 == "privateExponent:") {dump=1} else {dump=0}} /^ /{if(dump==1){gsub(":","");printf "%s", $1}}END{print ""}' | xxd -ps -r -c256 > pr_key.bin

通过替换awk命令中的字符串,您也可以获得模数。

简而言之,要存储2048位的私钥,您需要4096位(512字节)。要存储公钥,您需要2048位(256字节)。


谢谢,这就是我想要的。然而,事实证明我们正在使用的库需要DER格式,这很容易生成。感到愚蠢,并为制造噪音道歉。 - Lev

1

编辑3/4:

我还没有找到一个方便的方法来做到这一点。无论如何,你可以尝试以下操作:

openssl rsa -in <yourfile> -noout -text

它将显示有关私钥的更多信息。查看wikipedia以了解如何使用给定的信息计算密钥。

旧解决方案(无效,请忽略)

是为了自动化流程还是仅仅为了教育目的?

一个手动的方法可能是以下步骤(假设您是linux用户):

  • 复制密钥文件

  • 用vi(m)打开您的pem文件并删除第一行和最后一行(BEGIN/END PRIVATE KEY)

  • 删除换行符(例如::%s/\n//g)

  • 保存文件

  • 现在对文件进行base64解码(base64 -d [your file name here] > [destination]

但很可能openssl提供了更方便的方法来实现这个目标。
编辑1:如果pem / der存储密钥以外的其他信息,则可能是错误的。
编辑2:此外,我从未见过提取私钥的理由(或者甚至以你所做的方式生成私钥)。你想要实现什么目标?

“删除换行符...” - 如果您删除预封装和后封装标头(-----BEGIN X----------END X-----)的换行符,则密钥可能无法解析,您可能会收到***PEM_read_bio:no start...***错误。 - jww
没错,这就是为什么第一步是要复制密钥的原因;) 这样我们以后还能使用正确的pem文件进行工作。 - Code Monkey
这样做将会得到与使用DER格式相同的结果。仍然不是2048位。我想把密钥存储在MCU的内存中。 - Lev
@Lev 我已经更新了答案。它应该可以工作,但需要一些努力。我认为可能有更简单的方法,但是我没有找到。 - Code Monkey

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接