【问题标题】:ASN.1 DER formatted private keyASN.1 DER 格式的私钥
【发布时间】:2011-08-23 21:30:36
【问题描述】:

为什么用前导零填充模数?我正在阅读 PKCS#1 和 PKCS#8,但没有找到任何相关信息。 在 c# 中必须删除前导零,有人知道为什么吗?

http://etherhack.co.uk/asymmetric/docs/rsa_key_breakdown.html,您可以看到模数和指数有前导零。问题是他们为什么拥有它,我还没有找到任何解释。

【问题讨论】:

    标签: asn.1 pkcs#8 pkcs#1


    【解决方案1】:

    私钥值被编码为 ASN.1 INTEGER,它们是二进制补码格式的有符号值。当设置(无符号)RSA 密钥值的 MSB 时,前导零字节是必需的。没有前导零字节的 MSB 集将意味着负值。

    ASN.1 规范是免费的,链接自 Wikipedia。这里的相关部分在 X.690,“8.3 Encoding of an integer value”中。

    我将在此处提供一个示例,以防链接页面消失。

    如果你有openssl,你可以生成测试密钥:

    openssl genrsa -out test.pem 512
    openssl rsa -in test.pem -out test.der -outform der
    

    这是来自 test.der 的示例数据:

    30 82 01 3b
    ASN.1 SEQUENCE,长度0x13b,内容跟随

    02 01 00
    版本:ASN.1 INTEGER,存储长度 1,值 0

    02 41 00 c0 8e ...(65 个数据字节)
    模数:ASN.1 INTEGER,存储长度 65,值 0xc08e...(需要前导零字节,因为模数 > 2^511)

    02 03 01 00 01
    公共指数:0x10001(不需要前导零字节,因为指数

    02 41 00 b5 87 ...(65 个数据字节)
    私有指数:0xb587...

    02 21 00 e7 18 ...(33 个数据字节)
    素数1:0xe718...

    02 21 00 d5 43 ...(33 个数据字节)
    素数2:0xd543...

    02 20 75 67 a1 ...(32 个数据字节)
    exponent1: 0x7567...(不需要前导零字节,因为指数

    02 20 0a f6 3f ...(32 个数据字节)
    指数2:0x0af6...

    02 21 00 c7 13 ...(33 个数据字节)
    系数:0xc713...

    【讨论】:

    • 你的答案解释得很好。使用 openssl 来演示解释很有帮助。
    • 请注意,整数 ASN.1 DER 样本可以使用 openssl 很好地生成,例如:x=128; openssl asn1parse -genstr "INTEGER:$x" -noout -out data && hexdump -C data
    猜你喜欢
    • 2011-07-20
    • 1970-01-01
    • 2021-06-22
    • 1970-01-01
    • 2010-11-19
    • 2012-01-17
    • 1970-01-01
    • 2022-01-22
    • 1970-01-01
    相关资源
    最近更新 更多