本文介绍BC中的ASN1组装和解析,ASN1是什么就不解释了。其实直接使用BC解析ASN1的场景是比较少见的, 因为大多数操作已经对应封装好了。比如说X509解析本身就已经封装好,不需要一步一步的用这些函数解析。但有些场景需要用到自定义的ASN1结构时,自己组装和解析就不可避免了。下面的例子中使用的bcprov-ext-jdk15on-1.51.jar包请自行下载,我所使用的是1.51,其他旧版本基本上一致,应该可以使用。

1.1首先是简单组装

创建一个简单的ASN1格式数据,里面包含Integer和Boolean值。

try{ByteArrayOutputStream outputStream = new ByteArrayOutputStream();//创建ByteArrayOutputStream,用于放置输出的byte流DEROutputStream derOutputStream = new DEROutputStream(outputStream);//创建DEROutputStreamderOutputStream.writeObject(new DERInteger(10));//写入DERInteger数据,10对应的hex为0a。derOutputStream.writeObject(new DERBoolean(false));//写入DERBoolean数据,false对应asn1中的hex为00derOutputStream.flush();System.out.println(StringUtils.Hex(outputStream.toByteArray()));//将输出的bytearray转换为直观显示的Hex格式输出
} catch (Exception e) {e.printStackTrace();
}

输出:02 01 0a 01 01 00
对应解析:

02 : Interger
<span style="white-space:pre"> </span>01 : Len
<span style="white-space:pre"> </span>0a : value(10)
01 : Boolean
<span style="white-space:pre"> </span>01 : len
<span style="white-space:pre"> </span>00 : value(false)

说明:首先是需要创建ASN1OutputStream,然后就能往里面填充输出的数据了。这个例子非常简单,输出中的02 01 0a,02是TAG = Integer,01是后续长度,0a就是Integer的值了。另一个也同理。

1.2序列的组装

在1.1的基础上,加入一个Sequence。

try{ByteArrayOutputStream outputStream = new ByteArrayOutputStream();//创建ByteArrayOutputStream,用于放置输出的byte流DEROutputStream derOutputStream = new DEROutputStream(outputStream);//创建DEROutputStreamderOutputStream.writeObject(new DERInteger(10));//写入DERInteger数据,10对应的hex为0a。derOutputStream.writeObject(new DERBoolean(false));//写入DERBoolean数据,false对应asn1中的hex为00ASN1EncodableVector encodableVector = new ASN1EncodableVector();//创建ASN1EncodableVector,用于放Sequence的数据encodableVector.add(new DERPrintableString("PP"));//encodableVector中写入各种对象encodableVector.add(new DERUTCTime(new Date()));encodableVector.add(new DERNull());DERSequence derSequence = new DERSequence(encodableVector);//ASN1EncodableVector封装为DERSequencederOutputStream.writeObject(derSequence);//写入DERSequence数据。derOutputStream.flush();System.out.println(StringUtils.Hex(outputStream.toByteArray()));//将输出的bytearray转换为直观显示的Hex格式输出
} catch (Exception e) {e.printStackTrace();
}

输出:02 01 0a 01 01 00 30 15 13 02 50 50 17 0d 31 35 30 35 31 36 30 32 33 39 31 32 5a 05 00
对应解析

02 : Interger
<span style="white-space:pre"> </span>01 : Len
<span style="white-space:pre"> </span>0a : value(10)
01 : Boolean
<span style="white-space:pre"> </span>01 : len
<span style="white-space:pre"> </span>00 : value(false)
30 : Sequence
<span style="white-space:pre"> </span>15 : len
<span style="white-space:pre"> </span>13 : PrintableString
<span style="white-space:pre">     </span>02 : len
<span style="white-space:pre">     </span>50 50 : value(PP)
<span style="white-space:pre"> </span>17 : UTCTime
<span style="white-space:pre">     </span>0d : len
<span style="white-space:pre">     </span>31 35 30 35 31 36 30 32 33 39 31 32 5a : value(150516023912GMT+00:00)
<span style="white-space:pre"> </span>05 : NULL
<span style="white-space:pre">     </span>00 : len

说明:需要创建序列的时候,先要创建ASN1EncodableVector,填充后序列内容后,再添加到DEROutputStream中即可。输出中30 15即为DERSequence的TAG和长度。

2.解析

解析1.2中生成的DER

try{ASN1InputStream asn1InputStream = new ASN1InputStream(StringUtils.Hex("02010a010100301513025050170d3135303531363032333931325a0500"));//将hex转换为byte输出ASN1Primitive asn1Primitive = null;while ((asn1Primitive = asn1InputStream.readObject()) != null) {//循环读取,分类解析。这样的解析方式可能不适合有两个同类的ASN1对象解析,如果遇到同类,那就需要按照顺序来调用readObject,就可以实现解析了。if ( asn1Primitive instanceof ASN1Integer) {ASN1Integer asn1Integer = (ASN1Integer) asn1Primitive;System.out.println("Integer:" + asn1Integer.getValue());}else if (asn1Primitive instanceof ASN1Boolean) {ASN1Boolean asn1Boolean = (ASN1Boolean) asn1Primitive;System.out.println("Boolean:"+asn1Boolean.isTrue());}else if (asn1Primitive instanceof ASN1Sequence) {ASN1Sequence asn1Sequence = (ASN1Sequence) asn1Primitive;ASN1SequenceParser asn1SequenceParser = asn1Sequence.parser();ASN1Encodable asn1Encodable = null;while ((asn1Encodable = asn1SequenceParser.readObject()) != null) {asn1Primitive = asn1Encodable.toASN1Primitive();if (asn1Primitive instanceof ASN1String) {ASN1String string = (ASN1String) asn1Primitive;System.out.println("PrintableString:"+string.getString());}else if (asn1Primitive instanceof ASN1UTCTime) {ASN1UTCTime asn1utcTime = (ASN1UTCTime) asn1Primitive;System.out.println("UTCTime:"+asn1utcTime.getTime());}else if (asn1Primitive instanceof ASN1Null) {System.out.println("NULL");}}}}
} catch (Exception e) {e.printStackTrace();
}

输出:
Integer:10
Boolean:false
PrintableString:PP
UTCTime:150516023912GMT+00:00
NULL

说明:无

Bouncy Castle 的 ASN1 使用方法相关推荐

  1. Bouncy Castle的Java JCE安装方法

    Bouncy Castle的Java JCE安装方法 1.去官方站点下载Bouncy Castle的JCE Provider包 bcprov-ext-jdk15-145.jar 2.把 jar文件复制 ...

  2. 在C#中保存Bouncy Castle生成的密钥对

    在用Bouncy Castle的C#版API产生公钥和私钥 中产生了一对密钥对,可以用bouncy caslte提供的API进行保存 公钥方面的3个类,具体代码根据命名空间自行查看其源代码: Org. ...

  3. Bouncy Castle 加密库修复高危的认证绕过漏洞

     聚焦源代码安全,网罗国内外最新资讯! 编译:奇安信代码卫士团队 最近,Bouncy Castle 加密库修复了一个高危的认证绕过漏洞. 该项目建立于2000年,表示 Java 和 C# 加密中使用的 ...

  4. bouncy castle

    官方主页  http://www.bouncycastle.org/ Bouncy Castle 是一种用于 Java 平台的开放源码的轻量级密码术包.它支持大量的密码术算法,并提供 JCE 1.2. ...

  5. Java Bouncy Castle TLS PSK example

    转自:http://tiebing.blogspot.com/2013/09/java-bouncy-castle-tls-psk-example.html Java Bouncy Castle TL ...

  6. ecies算法c语言实现,Bouncy Castle算法库中ECIES算法调用示例

    JRE8 + jce_policy-8, Bouncy Castle 1.50环境下调试通过 import java.security.KeyPair; import java.security.Ke ...

  7. Bouncy Castle Crypto API c# port

    Bouncy Castle 是一种用于 Java 平台的开放源码的轻量级密码术包.它支持大量的密码术算法,并提供 JCE 1.2.1 的实现.现在有了C#的版本.下面是网站上的介绍 This port ...

  8. android 公钥pem编码,如何将PEM编码的Elliptic Curve公钥加载到Bouncy Castle中?

    我有一个PEM编码的Elliptic Curve公钥,我正试图加载到Bouncy Castle中,到目前为止我尝试的所有内容都失败了.这是我正在尝试加载的密钥的示例: -----BEGIN PUBLI ...

  9. java pgp加密_基于Java Bouncy Castle的PGP加密解密示例

    # re: 基于Java Bouncy Castle的PGP加密解密示例  回复  更多评论 2016-03-02 10:32 by 毛小龙 对文件进行加密 在测试类里面已经跑通了 抽取出来调用就报这 ...

最新文章

  1. ACMNO.30 C语言-宏交换 定义一个带参的宏,使两个参数的值互换,并写出程序,输入两个数作为使用宏时的实参。输出已交换后的两个值。
  2. 在Linux 下配置PHP 支援GD
  3. Python入门100题 | 第039题
  4. C++防止文件重复包含
  5. 开源 免费 java CMS - FreeCMS1.2-标签 userList
  6. 印度首富之女大婚,贫穷限制了我的想象……
  7. 重置mariadb密码
  8. R7-1 新世界 (5 分)
  9. exports,和module.exports 的区别
  10. linux+性能排查,Linux系统性能排查基础
  11. (进阶)LeetCode(206)——反转链表(JavaScript)
  12. 【java学习之路】(javaWeb篇)005.Js之DOM、对象、函数上下文
  13. 重拾Java Network Programming(一)IO流
  14. Linux扫描工具rootkit部署
  15. lcd1602显示自己的学号和姓名拼音的c语言程序,LCD1602显示字符.doc
  16. mysql转拼音首字母大写_mysql中文字段转拼音首字母,以及中文拼音模糊查询
  17. STM32F103C8T6最小系统
  18. 【句库】英语论文写作之好词好句积累
  19. Nginx负载均衡状态值max_fails和fail_timeout
  20. 【手写 Vue2.x 源码】第十九篇 - 根据 vnode 创建真实节点

热门文章

  1. chemoinformaticspython | 化学信息学软件包安装方法集合
  2. Blender——烘培记录
  3. 孔令德的计算机图形学课程实验
  4. 用 Flutter 和 Firebase 轻松构建 Web 应用
  5. 最近几年电力行业信息化发展趋势和奥运对电力信息化的推动
  6. linux dts 文件格式,DTS 文件扩展名: 它是什么以及如何打开它?
  7. 分治法-----找最大值与最小值
  8. 职教云计算机网络基础题库,最新章节测试答案2020智慧职教云创业竞争力提升...
  9. 纯享三代HiFi reads,至美细菌完成图,加送质粒基因组!
  10. 手机连接win10电脑wifi热点(不安装任何软件)