【问题标题】:Openssl RSA key sizeOpenssl RSA 密钥大小
【发布时间】:2016-03-24 09:23:33
【问题描述】:

我已经通过这个命令生成了一个 RSA 密钥:

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

我将密钥导出为 DER 格式,即二进制形式。关键是超过 2k 位。为了测试,我将公钥导出为 DER 格式,略大于 2k 位。

那么问题来了,什么是 2048 位?如何从生成的文件中获取原始位?

谢谢, 列弗

【问题讨论】:

标签: ssl openssl key


【解决方案1】:

为了使用 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 格式,这种格式很容易生成。站着愚蠢,为噪音感到抱歉。
【解决方案2】:

编辑 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... 错误。
  • 没错,这就是为什么第一步是复制密钥;)所以我们仍然有一个正确的 pem 文件供以后使用。
  • 如果我使用 DER 格式,这样做会得到相同的结果。仍然不是 2048 位。我想将密钥存储在 MCU 的内存中。
  • @Lev 我已经更新了答案。它应该付出一些努力。我认为一定有更简单的方法,但找不到。
猜你喜欢
  • 2020-04-07
  • 1970-01-01
  • 2011-12-10
  • 1970-01-01
  • 2012-06-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-11
相关资源
最近更新 更多