【问题标题】:How to modify a DER file如何修改 DER 文件
【发布时间】:2015-02-05 21:21:12
【问题描述】:

感谢 openssl asn1parse,我解析了一个 .pem 文件。

现在我想更改一些值,如何将其恢复为.pem 文件?

【问题讨论】:

    标签: asn.1 pem der


    【解决方案1】:

    如果使用“手动”路线,需要考虑以下几点:

    1. ASN.1 的DER(和BER)编码使用标签-长度-值格式。 Tag 描述了项目,而 Lenght 提供了值的运行时间。
    2. 标签项目是否构造(即值是否是另一个ASN.1)。这是标签第一个字节的第 6 位。
    3. 标签通常是一个字节,但如果标签值大于 30,它可以扩展到多个字节。
    4. Length 可以编码为一个或多个字节。如果长度 127,则第一个字节将设置第 8 位,它将包含表示长度所需的字节数。

    手动解码

    所以为了快速解码,请使用以下规则:

    找到标签。如果第一个字节是:

    • 0x[13579bdf]f。然后它是一个多字节标签。继续阅读,直到找到一个
    • 其他。然后是单字节标签。转到下一个字节

    记下第一个字节的第 6 位(即第一个半字节的 0x[2367abef])。这是构造的位。

    现在是长度。如果第一个字节是:

    • byte > 0x7f:那么就是多字节长度。之后要读取的字节数被编码在第一个字节中。阅读长度
    • byte

    现在是价值。读取长度指示的字节数。

    考虑我们在标签上找到的 constructed 位,以决定是否需要为值字节重新启动进程。

    继续这样做,直到用完字节。

    手工编码

    • 如果您正在修改,则无需担心标签,您只需要担心值和长度。

    • 修改值以满足您的需要。

    • 向上修改封闭类型的长度。

    • 注意127的长度限制。如果您的封闭类型之一超过它,请将其替换为 81 LL(其中 LL 是您现在的 255 最大长度)...在这种情况下,请记住您必须考虑长度编码中长度的字节数的增加的封闭类型。

    • 如果你跳过 255、65535、16777215 等,可能会发生类似的事情......长度:必须增加字节数来编码长度(0x82、0x83...)并使用它们来编码新长度。

    示例

    我将使用此消息。

    62 6a 48 04 01 00 00 00 6b 1e 28 1c 06 07 00 11
    86 05 01 01 01 a0 11 60 0f 80 02 07 80 a1 09 06
    07 04 00 00 00 00 00 09 6c 42 a1 40 02 01 01 02
    01 00 30 38 80 01 61 82 07 83 10 19 33 50 71 05
    83 07 83 13 19 78 97 21 04 88 01 80 89 01 04 af
    11 30 0f 02 01 21 a1 0a 80 08 13 12 f1 01 ab 01
    5d 68 bb 05 80 03 80 90 a3 9c 01 0c
    

    这是来自不同的应用程序域,与证书无关,但我相信它可以说明。

    62 是单字节标签,6a 是单字节长度 (106)。因为我在第一个半字节中有 0x6,所以我知道它是一个 constructed 类型。

    next 是 48,这是一个单字节标记,一个 ASN.1 类型的开始,包含在 62 中。我知道它不是构造的。我可以读取它的长度 0x04(单字节长度)和它的值(另外 4 个字节:0x01000000)

    所以我可以继续……

    62 6a 
       48 04 : 01 00 00 00 
       6b 1e
          28 1c 
             06 07 : 00 11 86 05 01 01 01 
             a0 11
                60 0f 
                   80 02 : 07 80 
                   a1 09 
                      06 07 04 00 00 00 00 00 09 
       6c 42 
          a1 40 
             02 01 : 01 
             02 01 : 00 
             30 38 
                80 01 : 61 
                82 07 : 83 10 19 33 50 71 05 
                83 07 : 83 13 19 78 97 21 04 
                88 01 : 80 
                89 01 : 04 
                af 11 
                   30 0f 
                      02 01 : 21 
                      a1 0a 
                         80 08 : 13 12 f1 01 ab 01 5d 68 
                bb 05 
                   80 03 : 80 90 a3 
                9c 01 : 0c
    

    如果我要修改例如第一个值(在 0x48 标签中)为 0x1234567890

    我可以这样做,

    62 6a 
       48 04 : 01 00 00 00 
    

    成为:

    62 6a 
       48 04 : _12 34 56 78 90_ 
    

    但现在我需要增加长度:

    62 6a 
       48 _05_ : 12 34 56 78 90 
    

    以及封闭类型的长度:

    62 _6b_ 
       48 05 : 12 34 56 78 90 
    

    新消息是:

    62 _6b_ 48 _05_ _12_ _34_ _56_ _78_ _90_ 
    6b 1e 28 1c 06 07 00 11
    86 05 01 01 01 a0 11 60 0f 80 02 07 80 a1 09 06
    07 04 00 00 00 00 00 09 6c 42 a1 40 02 01 01 02
    01 00 30 38 80 01 61 82 07 83 10 19 33 50 71 05
    83 07 83 13 19 78 97 21 04 88 01 80 89 01 04 af
    11 30 0f 02 01 21 a1 0a 80 08 13 12 f1 01 ab 01
    5d 68 bb 05 80 03 80 90 a3 9c 01 0c
    

    【讨论】:

      【解决方案2】:

      修改值和更改长度并不总是那么容易。内容项是 DER 编码的,因此除非它是文本字段,否则需要一些专业知识才能进入二进制形式。并且长度可能是嵌套的,因此您可能需要在不同级别更改长度。

      http://www.obj-sys.com/products/asn1ve/index.php 提供了一个可以执行此操作的工具。

      【讨论】:

        【解决方案3】:

        手动修改它实际上很容易。只需打开它,修改我要修改的值,如果长度发生变化,则更改“长度”。这是我刚刚更改之前的字节。

        DER 的工作方式如下:TLV(标签、长度、值)

        example: 02 02 00 aa (02: integer, 02: size of payload, 00 aa payload (整数必须以0开头,否则为负整数,所以这里我们必须多加一个字节到有效载荷)

        如果你的有效载荷的长度超过 127 位,你必须写两次大小(至少这是我的理解)。

        如果你改变了某个值的长度,你也必须改变头部的全局长度。

        【讨论】:

          猜你喜欢
          • 2022-01-10
          • 2019-08-17
          • 2010-09-12
          • 1970-01-01
          • 1970-01-01
          • 2011-11-15
          • 2012-06-30
          • 2018-08-21
          相关资源
          最近更新 更多