我需要解析ASN.1 DER编码的RSA 2048私钥以获取模数,指数等不同的组件。当我查看密钥时,发现某些组件具有前导零。是否应该跳过这些零?如果是,我如何区分作为组件一部分的零与这些前导零。对于我的特定情况,私有指数字段的长度为256,第一个字节为0.这是指数的一部分还是应该被跳过。对于RSA 2048密钥,私有指数是否总是大小为256字节?
[更新]似乎ASN.1 DER编码值以big endian排序。因此,要求前导零作为组件的一部分并且它应该被跳过是没有意义的。所以问题仅限于私人指数的大小。我有一个RSA 2048密钥,私有指数大小是255字节。我解析了不同的私钥组件,并填充在'RSAParameters'的对象上。尝试使用 RSACryptoServiceProvider.ImportParameters()导入此内容会抛出 CryptographicException ,并显示错误消息“Bad Data”。 ImportParameters()是否期望指数大小也是256字节?是否有任何工具可以验证不同的关键组件是否正确?
答案 0 :(得分:1)
在BER和DER中,整数被编码为2s-补数。这意味着正数的第一位必须为零。这有时需要在开头添加额外的零字节。注意,将整数值的前9位编码为全零是无效的BER / DER。添加额外的零字节只是为了防止非零的第一位被解释为负数。
答案 1 :(得分:0)
PKCS#1关键组件使用ASN.1有符号整数进行编码(ASN.1不知道无符号整数作为数据类型)。
因此,如果正数是以字节为单位的密钥大小,则第一位需要以无符号表示法为1。因此,带符号的表示法需要将额外的字节设置为00h,以使其成为正的有符号数。请注意,私有指数仅限于模数值,但有时可能比模数小更小。
由于模数必须是精确的密钥大小,并且由于密钥大小几乎总是8的倍数,因此总是需要00h填充。
如果数字是位中的密钥大小,那么根据定义,必须打开第一位。例如。如果您有一个8位数字,那么您必须将其表示为1XXX XXXX
。这意味着该数字的范围从2 ^ 7到2 ^ 8(不包括)。现在请记住,RSA密钥大小通常可以除以8(512,1024,2048,你知道得分)。这意味着与键大小相同的数字将始终设置其第一位。因此,作为带符号的数字,它需要有一个填充字节。
答案 2 :(得分:0)