1

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

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

4

3 回答 3

1

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

于 2012-10-15T15:52:32.133 回答
0

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

于 2012-10-13T15:07:50.720 回答
0

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

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

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


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

于 2012-10-12T23:13:05.243 回答