未知类型ASN.1编码的解析

5 篇文章 1 订阅

 最近一直在研究BC中的ASN1组装和解析,从BC开源项目中中拿出给如下一段ASN1编码,在不知道组合以及对象情况时,如何解析呢?

 private byte[] unsignedReq = Base64.decode(
        "MEIwQDA+MDwwOjAJBgUrDgMCGgUABBRDb9GODnq7lRhSkEqw4XX24huERwQUkY4j"
      + "a6eKuDlkVP9hRgkEvIWqHPECAQE="); 

 首先我们把ASN.1解码为byte[]输出:

byte[] d64 = org.bouncycastle.util.encoders.Base64.decode(unsignedReq);
ASN1InputStream asn1InputStream = new ASN1InputStream(d64);

接下来就是循环遍历了,但是我们并不知道类型,这时候我们就需要打断点来看一看。

 断点过第9行时,可以看到该编码的组合类型。接着开始解析:

完整代码:

package com.xdja.timingDemo.asn1;

import org.bouncycastle.asn1.*;

import java.util.Arrays;

public class ReqTest {

    public static void ReqTest() {

        String unsignedReq = "MEIwQDA+MDwwOjAJBgUrDgMCGgUABBRDb9GODnq7lRhSkEqw4XX24huERwQUkY4ja6eKuDlkVP9hRgkEvIWqHPECAQE=";
        //解码为byte数组
        byte[] d64 = org.bouncycastle.util.encoders.Base64.decode(unsignedReq);
        System.out.println("decode----------" + Arrays.toString(d64));
        ASN1InputStream asn1InputStream = new ASN1InputStream(d64);
        ASN1Primitive asn1Primitive;
        try {
            while ((asn1Primitive = asn1InputStream.readObject()) != null) {

                ASN1Sequence asn1Sequence = (ASN1Sequence) asn1Primitive;
                ASN1SequenceParser asn1SequenceParser = asn1Sequence.parser();
                ASN1Encodable asn1Encodable;

                while ((asn1Encodable = asn1SequenceParser.readObject()) != null) {
                    asn1Primitive = asn1Encodable.toASN1Primitive();

                    ASN1Sequence asn1Sequence1 = (ASN1Sequence) asn1Primitive;
                    ASN1SequenceParser asn1SequenceParser1 = asn1Sequence1.parser();
                    ASN1Encodable asn1Encodable1;
                    while ((asn1Encodable1 = asn1SequenceParser1.readObject()) != null) {
                        asn1Primitive = asn1Encodable1.toASN1Primitive();

                        ASN1Sequence asn1Sequence2 = (ASN1Sequence) asn1Primitive;
                        ASN1SequenceParser asn1SequenceParser2 = asn1Sequence2.parser();
                        ASN1Encodable asn1Encodable2;
                        while ((asn1Encodable2 = asn1SequenceParser2.readObject()) != null) {
                            asn1Primitive = asn1Encodable2.toASN1Primitive();

                            ASN1Sequence asn1Sequence3 = (ASN1Sequence) asn1Primitive;
                            ASN1SequenceParser asn1SequenceParser3 = asn1Sequence3.parser();
                            ASN1Encodable asn1Encodable3;

                            while ((asn1Encodable3 = asn1SequenceParser3.readObject()) != null) {
                                asn1Primitive = asn1Encodable3.toASN1Primitive();

                                ASN1Sequence asn1Sequence4 = (ASN1Sequence) asn1Primitive;
                                ASN1SequenceParser asn1SequenceParser4 = asn1Sequence4.parser();
                                ASN1Encodable asn1Encodable4;
                                //-----进入
                                while ((asn1Encodable4 = asn1SequenceParser4.readObject()) != null) {
                                    asn1Primitive = asn1Encodable4.toASN1Primitive();

                                    if (asn1Primitive instanceof ASN1Integer) {
                                        ASN1Integer asn1Integer = (ASN1Integer) asn1Primitive;
                                        System.out.println("ASN1Integer--:" + asn1Integer.getValue());
                                    } else if (asn1Primitive instanceof DEROctetString) {
                                        DEROctetString string = (DEROctetString) asn1Primitive;
                                        System.out.println("DEROctetString--:" + string.toString());
                                    } else {
                                        ASN1Sequence asn1Sequence5 = (ASN1Sequence) asn1Primitive;
                                        ASN1SequenceParser asn1SequenceParser5 = asn1Sequence5.parser();
                                        ASN1Encodable asn1Encodable5;

                                        while ((asn1Encodable5 = asn1SequenceParser5.readObject()) != null) {
                                            asn1Primitive = asn1Encodable5.toASN1Primitive();

                                            if (asn1Primitive instanceof ASN1Null) {
                                                System.out.println("NULL");
                                            } else if (asn1Primitive instanceof ASN1Integer) {
                                                ASN1Integer asn1Integer = (ASN1Integer) asn1Primitive;
                                                System.out.println("ASN1Integer--:" + asn1Integer.getValue());
                                            } else if (asn1Primitive instanceof ASN1ObjectIdentifier) {
                                                ASN1ObjectIdentifier string = (ASN1ObjectIdentifier) asn1Primitive;
                                                System.out.println("ASN1ObjectIdentifier--:" + string.toString());
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        ReqTest();
    }
}

运行结果:

解析完成~

END!!!

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
ASN.1(Abstract Syntax Notation One)是一种用于描述数据结构和编码规则的标准化方法。ASN.1编码规则国标是指中国制定的ASN.1编码规则的国家标准。 ASN.1编码规则国标包括两个方面的内容:ASN.1数据结构的定义和ASN.1数据的编码规则。 ASN.1数据结构的定义是使用一种形式化的语言来描述数据的结构和类型。它定义了一些基本的数据类型,如整数、字符串、对象标识符等,并允许用户根据需要定义复杂的数据类型,例如序列、集合、选择等。这样,可以按照预先定义好的规则来定义和描述数据的结构,使得不同系统之间可以相互理解和交换数据。 ASN.1数据的编码规则规定了如何将ASN.1数据转换成二进制格式进行传输。常用的ASN.1编码规则有BER、DER、CER等。这些编码规则根据对数据体积和传输效率的要求,定义了不同的编码方式和规则,例如使用可变长度编码或固定长度编码,使用标记位表示数据类型等。ASN.1编码规则国标就是在这些基本的ASN.1编码规则的基础上,针对中国国情和实际需求,进行了一些适应性的修改和补充。 ASN.1编码规则国标的制定是为了提高通信系统的互操作性和数据交换的安全性。通过遵循ASN.1编码规则国标,不同厂家和不同系统可以更加方便地进行数据的交换和共享,避免了不同系统之间的兼容性问题和数据解析错误的风险。同时,ASN.1编码规则国标还可以提供一定的安全机制,比如对数据进行签名和加密,保证数据在传输过程中的安全性。 总之,ASN.1编码规则国标是一种在中国制定的用于描述数据结构和编码规则的国家标准。它为不同系统之间的数据交换提供了统一的标准和规范,提高了通信系统的互操作性和数据交换的安全性。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值