java解析ASN.1结构

  • ASN.1是什么?
    ASN.1抽象语法标记(Abstract Syntax Notation One) ASN.1是一种 ISO/ITU-T 标准,描述了一种对数据进行表示、编码、传输和解码的数据格式。它提供了一整套正规的格式用于描述对象的结构,而不管语言上如何执行及这些数据的具体指代,也不用去管到底是什么样的应用程序。

  • 本人在工作中涉及到ASN.1结构的场景
    证书的公、私钥文件,做数据加密、签名、信封产生的数据都是ASN.1结构。

  • 解析ASN.1
    下面是一段简单的解析ASN.1结构,获取ASN.1结构的元素类型和值的代码。
    如有图片中三种ASN.1结构的数据,要判断是其中的哪一种格式:
    在这里插入图片描述在这里插入图片描述在这里插入图片描述

/**
	 * 获取sequence下第一个元素,并判断元素类型
	 * @param data
	 * @return
*/
private static String read_Asn1Data(byte[] data) {
		ByteArrayInputStream bis = null;
		ASN1InputStream ais = null;
		String flag = "";
		try {
			bis = new ByteArrayInputStream(data);
			ais = new ASN1InputStream(bis);
			DERSequence sequence = (DERSequence) ais.readObject();
			DEREncodable derEnd  = sequence.getObjectAt(0);
			DERObject readObject = derEnd.getDERObject();
			if (readObject instanceof DERSequence) {
				flag = "0";
			}else if (readObject instanceof DERInteger) {
				flag = "1";
			}else if (readObject instanceof DERObjectIdentifier){
				flag = "2";
			}
		} catch (IOException e) {
		} finally {
			try {
				if (bis != null) bis.close();
				if (ais != null) ais.close();
			} catch (IOException e) {}
		}
		return flag;
	}

/**
	 * 获取元素值
	 * @param data
	 * @return
*/
private static String read_Asn1Data(byte[] data) throws Exception {
		ByteArrayInputStream bis = null;
		ASN1InputStream ais = null;
		ContentInfo contentInfo = null;
		try {
			bis = new ByteArrayInputStream(data);
			ais = new ASN1InputStream(bis);
			contentInfo = new ContentInfo((ASN1Sequence) ais.readObject());
		} catch (IOException e) {
			throw e;
		} finally {
			try {
				if (bis != null) bis.close();
				if (ais != null) ais.close();
			} catch (IOException e) {}
		}
		return contentInfo.getContentType().getId();
	}

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值