RSA密钥专用指数大小



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

[UPDATE]ASN.1 DER编码的值似乎是以big-endian排序的。因此,要求前导零作为组件的一部分是没有意义的,应该跳过它。因此,问题仅限于私人指数的大小。我有一个RSA 2048密钥,私有指数大小是255字节。我已经解析了不同的私钥组件,并在'RSAParameters'的对象上填充。正在尝试使用RSACryptoServiceProvider导入此服务。ImportParameters()引发CryptographicException,并返回错误消息"Bad Data"。ImportParameters()是否也期望指数大小为256字节?有没有什么工具可以让我验证不同的关键部件是否正确?

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

Microsoft的实现不如大多数实现宽容。这里已经有一些关于这个的问题(和答案):

  • RSACryptoServiceProvider中的解析错误。删除零字节前缀的ImportParameters
  • 读取pem文件,在DQ参数中获取63字节
  • Microsoft RSA CSP密钥大小

PKCS#1关键组件的编码方式与ASN.1有符号整数相同(ASN.1不知道无符号整数是数据类型)。

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

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


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

最新更新