最近一直在研究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!!!