RSA 密钥私有指数大小

Posted

技术标签:

【中文标题】RSA 密钥私有指数大小【英文标题】:RSA key private exponent size 【发布时间】:2012-10-12 15:37:53 【问题描述】:

我需要解析 ASN.1 DER 编码的 RSA 2048 私钥以获取不同的组件,例如模数、指数等。当我浏览密钥时,发现一些组件具有前导零。这些零应该被跳过吗?如果是,我如何区分作为组件一部分的零与这些前导零。对于我的具体情况,私有指数字段的长度为 256,第一个字节为 0。这是指数的一部分还是应该被跳过。对于 RSA 2048 密钥,私有指数是否总是 256 字节?

[更新] 似乎 ASN.1 DER 编码值是按大端排序的。因此,要求作为组件的一部分出现前导零是没有意义的,它应该被跳过。所以问题仅限于私人指数的大小。我有一个 RSA 2048 密钥,私有指数大小为 255 字节。我已经解析了不同的私钥组件并填充了 'RSAParameters' 的对象。尝试使用 RSACryptoServiceProvider.ImportParameters() 导入它会引发 CryptographicException 并带有错误消息“Bad Data”。 ImportParameters() 是否期望指数大小也为 256 字节?是否有任何工具可以用来验证不同的关键组件是否正确?

【问题讨论】:

你看过我的回答了吗?缺少什么? 作为对更新中附加问题的回答,您可以使用openssl asn1parse -inform DER -dump -in <file> 来检查密钥。如果其中有任何负数,则不正确,因为 RSA 仅适用于正数。 【参考方案1】:

在 BER 和 DER 中,整数被编码为 2s 补码。这意味着正数的第一位必须为零。这有时需要在开头有一个额外的零字节。请注意,将整数值的前 9 位全部编码为零是无效的 BER/DER。添加额外的零字节只是为了防止非零第一位被解释为负数。

【讨论】:

【参考方案2】:

Microsoft 的实施没有大多数人那么宽容。这里已经有几个问题(和答案):

Parsing bug in RSACryptoServiceProvider.ImportParameters with zero-byte-prefix elimination? read pem file, get 63 bytes in DQ parameter Microsoft RSA CSP key size

【讨论】:

因此 ImportParameters() 期望 RSA 2048 密钥的私有指数大小为 256 字节。使用零字节(使其为 256 字节)为指数添加前缀是有效的。谢谢...【参考方案3】:

PKCS#1 关键组件使用 ASN.1 有符号整数进行编码(ASN.1 不知道无符号整数作为数据类型)。

因此,如果一个正数是以字节为单位的密钥大小,那么第一位需要为无符号表示法中的 1。因此,有符号表示法需要一个额外的字节设置为 00h 以使其成为一个正的有符号数。请注意,私有指数仅限于模数的值,但有时可能比模数几个字节。

由于模数需要是精确的密钥大小,并且密钥大小几乎总是 8 的倍数,因此它总是需要 00h 填充。


如果数字是 bits 中的密钥大小,则根据定义,必须打开第一位。例如。如果你有一个八位数字,那么你必须将它表示为1XXX XXXX。这意味着数字范围从 2^7 到 2^8(不包括)。现在请记住,RSA 密钥大小通常可以除以 8(512、1024、2048,你知道分数)。这意味着与密钥大小相同的数字将始终设置其第一位。因此,作为有符号数,它需要有一个填充字节。

【讨论】:

感谢您的回复。但我不清楚你的回答。我的理解是,如果正数的第一个字节的 MSB 是“1”,而不是数字是密钥大小(以字节为单位),则插入前导零。

以上是关于RSA 密钥私有指数大小的主要内容,如果未能解决你的问题,请参考以下文章

RSA的公钥、私钥

PHP使用RSA(非对称算法)加解密详解

Java使用非对称数据加密RSA加密解密

如何使用 RTMP 和 Flowplayer 从 Cloudfront 运行私有内容视频

急求!!“1024位的RSA 公开密钥加密算法 ”数据结构课程设计!高手解答啊!!

使用标准库的 Python 中的私有/公共加密