未知类型ASN.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!!!

猜你喜欢

转载自blog.csdn.net/weixin_42209368/article/details/88235871