DER编码规则详解

概念:
DER是BER的子集,它为每一个ASN.1类型定义一种唯一的编码方案。

DER与BER的区别:
DER在BER的基础上增加了如下限制:
长度小于等于127,必须使用短型长度表示法。
长度大于127,必须使用长型长度表示法,并且要尽可能的短。
对于简单的string类型以及在其基础上隐性标签生成的类型使用简单定长表示法。
对于结构化类型以及在其基础上隐性标签生成的类型以及所有的显示类型使用结构化定长表示法。
简单定长表示法和结构化类型表示法的区别是在TLV的T中bit6是0还是1。

DER的组成:
无论什么类型它的DER编码都是有四部分组成:
类型字段tag  长度字段length   值字段value   结束表示字段
即T L V


类型字段:
由一个字节(即八个二进制位)组成。
bit8 bit7用来表示tag类型,universal是00  application是01  context-specific是10   private是11
bit6表示结构化位,0代表简单类型,1代表结构类型
bit5-bit1表示tag值,tag值可以查表获得。

长度字段(以字节为计算单位):
长度字段分为两种:小于等于127和大于127
小于等于127:用一个字节表示。bit8=0,bit7-bit1表示长度值。
例子:38表示为00100110

大于127:由多个字节组成
第一个字节:bit8=1,bit7-bit1表示存放长度所占字节数(通俗的讲就是后面还有几个字节)
其余字节:存放长度值
例如:201表示为10000001 11001001

长度值不定:用0x80表示。

值字段:
不同的类型其值不同,但归根结底类型都是二进制,或十进制,或十六进制 ,或者是ASCLL字符,将他们转换为16进制表示出来即可。

结束标识字段(不在TLV之中):
两个字节,只有在长度值不定时才会出现。表示为0x000x00


完!


  • 8
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: DER 编码是一种二进制编码方式,用于将证书、证书请求和其他证书相关数据进行编码。 Java 中可以使用 Bouncy Castle 库来实现 DER 编码。以下是一个示例代码: ``` import org.bouncycastle.asn1.DEROutputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; public class DEREncoder { public static byte[] encode(byte[] data) throws IOException { ByteArrayOutputStream baos = new ByteArrayOutputStream(); DEROutputStream dos = new DEROutputStream(baos); dos.writeObject(data); return baos.toByteArray(); } } ``` 在上面的代码中,我们将数据作为字节数组传递给 encode 方法,然后使用 DEROutputStream 对数据进行 DER 编码,最后将编码后的数据返回。 ### 回答2: Der编码是一种用于编码和解码数据结构的格式。它通常用于X.509证书和LDAP目录中的数据表示。 在Java中,可以使用Bouncy Castle库来实现Der编码。Bouncy Castle是一个广泛使用的加密库,其中包含了许多用于加密和解密的算法以及DER编码和解码的工具。 要使用Bouncy Castle库进行Der编码,首先需要在项目中添加Bouncy Castle库的引用。具体方式可以在Maven或Gradle的项目配置文件中添加相应的依赖项,或者下载Bouncy Castle库的JAR文件并手动导入。 Bouncy Castle库提供了一个ASN.1包,其中包含了编码和解码Der数据的类。下面是一个简单的示例,演示如何使用Bouncy Castle库进行Der编码: ```java import org.bouncycastle.asn1.*; import java.io.IOException; public class DerEncoder { public static void main(String[] args) throws IOException { // 创建一个Der编码器 ASN1EncodableVector vector = new ASN1EncodableVector(); // 添加Der数据 vector.add(new DERInteger(123456)); vector.add(new DERUTF8String("Hello, world!")); // 对Der数据进行编码 DERSequence derSeq = new DERSequence(vector); byte[] derEncodedData = derSeq.getEncoded(); // 打印编码后的Der数据 for (byte b : derEncodedData) { System.out.printf("%02x ", b); } } } ``` 上述代码创建了一个Der编码器,并添加了一个整数和一个UTF-8字符串作为Der数据。然后,使用`getEncoded()`方法将Der数据编码成字节数组,并使用循环打印编码后的Der数据。 这只是一个简单的例子,实际应用中可能会涉及到更复杂的Der数据结构和编码操作。使用Bouncy Castle库的Der编码功能可以方便地实现Der数据的编码和解码。 ### 回答3: DER编码(Distinguished Encoding Rules)是一种常用于ASN.1(Abstract Syntax Notation One)编码规则,用于将数据结构序列化为字节流。在Java中,可以使用Bouncy Castle库来实现DER编码。 首先,需要导入Bouncy Castle库的相关包。可以从官方网站(https://www.bouncycastle.org/latest_releases.html)下载并安装bcprov-jdk15on.jar文件。 接下来,创建一个Java类,并导入Bouncy Castle库的相关类。代码如下: import org.bouncycastle.asn1.ASN1InputStream; import org.bouncycastle.asn1.ASN1OutputStream; import org.bouncycastle.asn1.ASN1Primitive; import org.bouncycastle.util.encoders.Hex; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; public class DEREncoder { public static void main(String[] args) throws IOException { // 示例数据 byte[] data = Hex.decode("0123456789ABCDEF"); // 使用ASN1Primitive.fromByteArray方法将字节数组解码为ASN1对象 ASN1Primitive asn1Object = ASN1Primitive.fromByteArray(data); // 创建一个ByteArrayOutputStream对象,用于存放DER编码后的字节流 ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); // 使用ASN1OutputStream对象将ASN1对象编码DER字节流,并写入ByteArrayOutputStream中 ASN1OutputStream asn1Output = new ASN1OutputStream(outputStream); asn1Output.writeObject(asn1Object); asn1Output.close(); // 从ByteArrayOutputStream中获取DER编码后的字节数组 byte[] derEncodedData = outputStream.toByteArray(); // 打印DER编码后的字节流 System.out.println("DER编码后的数据: " + Hex.toHexString(derEncodedData)); } } 以上代码中,首先定义了一个示例数据,然后使用ASN1Primitive.fromByteArray方法将字节数组解码为ASN1对象。接下来,创建一个ByteArrayOutputStream对象,用于存放DER编码后的字节流。然后,使用ASN1OutputStream对象将ASN1对象编码DER字节流,并写入ByteArrayOutputStream中。最后,将DER编码后的字节数组打印出来。 需要注意的是,以上代码仅仅是一个简单的示例,实际使用时,可能需要根据具体的需求进行相应的修改和适配。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值