首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何修改DER文件

如何修改DER文件
EN

Stack Overflow用户
提问于 2015-02-06 05:21:12
回答 3查看 1.4K关注 0票数 1

多亏了openssl asn1parse,我已经解析了一个.pem文件。

现在我想更改一些值,如何将其转换回.pem文件?

EN

回答 3

Stack Overflow用户

发布于 2015-02-11 18:33:52

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

and.1的

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

手工解码

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

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

  • 0x13579bdff.那么它就是一个多字节的标签。继续阅读,直到找到一个< 0x7f的字节。这将是最后一个字节。转到next byte
  • Other。那么它就是单字节标签。转到next byte

记下第一个字节的位6(即第一个半字节上的0x2367abf)。这是构造的比特。

现在我们来看一下长度。如果第一个字节是:

  • byte > 0x7f:则为多字节长度。之后要读取的字节数编码在第一个字节中。Read the length
  • byte <= 0x7f: the the length

byte<=0x7f:the is the length.

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

考虑我们在标记上找到的构造位,以决定是否需要重新开始对值字节的处理。

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

手工编码

  • 如果你正在修改,你不需要担心标签,你只需要担心值和lengths.
  • Modify值来满足你的需要。

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

  • 注意127的长度限制。如果您的封闭类型之一超过它,请将其替换为81 LL (其中LL是您现在的最大长度为255 )...在这种情况下,记住你必须考虑增加字节数的长度编码在封闭的types.
  • Similar的长度上可能发生的事情如果你跳过255,65535,16777215,etc....lengths:必须增加字节数来编码长度(0x82,0x83...)并使用它们对新长度进行编码。

示例

我将使用此消息。

代码语言:javascript
复制
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,所以我知道它是一个构造类型。

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

所以我可以继续..。

代码语言:javascript
复制
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

我可以这么做,

代码语言:javascript
复制
62 6a 
   48 04 : 01 00 00 00 

目标为:

代码语言:javascript
复制
62 6a 
   48 04 : _12 34 56 78 90_ 

但现在我需要增加长度:

代码语言:javascript
复制
62 6a 
   48 _05_ : 12 34 56 78 90 

和封闭类型的长度:

代码语言:javascript
复制
62 _6b_ 
   48 05 : 12 34 56 78 90 

新的消息是:

代码语言:javascript
复制
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
票数 3
EN

Stack Overflow用户

发布于 2015-02-06 06:12:52

实际上,手动修改它非常容易。只需打开它,修改我想要修改的值,如果长度已更改,则更改" length“。它就是我刚刚更改的内容之前的字节。

DER是这样工作的: TLV (标签,长度,值)

示例: 02: 00 aa ( 02 :整数,02 :有效负载大小,00 aa有效负载(整数必须以0开头作为第一位,否则为负整数,因此我们必须在有效负载中再添加一个字节)

另外,如果您的有效负载的长度超过127位,则必须写入两次大小(至少我是这样理解的)。

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

票数 -1
EN

Stack Overflow用户

发布于 2015-02-07 05:24:30

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

我们在http://www.obj-sys.com/products/asn1ve/index.php上有一个可以做到这一点的工具。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28354239

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档