如何解码 java 中的 asn.1 数据

How to decode asn.1 data in java

我有一个 asn.1 文件,其内容未知,因为我无法正确读取它。 我在 Whosebug 中找到了一些答案,但我对此有一些疑问。

public static void main(String[] args) throws IOException {
    ASN1InputStream ais = new ASN1InputStream( new FileInputStream(new File("asnfile")));
    while (ais.available() > 0){
        DERObject obj = ais.readObject();
        System.out.println(ASN1Dump.dumpAsString(obj, true));
        //System.out.println(CustomTreeNode.dumpAsString(obj));
     }
     ais.close();
}

代码的输出如下所示:

> 00                                                                  
>             Tagged [0] IMPLICIT 
>                 DER Sequence
>                     Tagged [0] IMPLICIT 
>                         DER Octet String[1] 
>                             00                                                                  
>                     Tagged [1] IMPLICIT 
>                         DER Octet String[8] 
>                             15051312215238f6                                                    !R8
>                     Tagged [2] IMPLICIT 
>                         DER Octet String[8] 
>                             53968510617268f0                                                    Sarh
>                     Tagged [3] IMPLICIT

我认为这不是实际格式。我如何读取文件以及在我的项目中添加什么来读取文件。

您似乎在使用 Bouncy Castle ASN1 读数 class。那是一个备受推崇的图书馆;它不太可能产生错误的答案。因此,您的问题的答案似乎是您已经在使用正确的工具。为什么不找一个工具将 ASN.1 文件转储到 Java 之外并将您的结果与它进行比较。

您得到了编码流的字符串转储,只需使用以下代码片段(我没有根据您的回答进行更改,只需理解以下代码即可)

在编写这段代码时,我每次都会读取一块 2048 流

ASN1InputStream bIn = null;
Object decodedObj = null; 

while ((len = inputStream.read(buf, 0, size)) != -1) { // Read 2Kb Block 

                bIn = new ASN1InputStream(buf); // Passing buffer

                try{

                    while( (decodedObj = bIn.readObject()) != null){ // Read each record in the Block.

                            decode(decodedObj);

                    }
                }//try block 
                catch (Exception e){
                    //e.printStackTrace();
                    //logger.error("Got an error while dividing inputStream because of filler bytes :"+e.getMessage());
                }
            }

解码方法内容为休闲

void decode(Object obj){

    ASN1Primitive primObj = null;

    if(obj instanceof ASN1TaggedObject)
           {
               mapDecodedMsgValues = new HashMap<String,String>();
               msgTag = ((ASN1TaggedObject)obj).getTagNo() ;

    switch (msgTag)
               {
                    case ABC_EVENT: // you can keep required tag number 

                        primObj = ((DERTaggedObject)obj).getObject();

                        if (primObj instanceof ASN1Sequence)
                        {

                           ASN1Sequence obj = (ASN1Sequence)primObj;
                           ASN1Encodable imsi_asn1Enc  = obj.getObjectAt(IMSI_INDEX); // write which index value you want
                           ASN1Primitive imsi_asn1Prim = imsi_asn1Enc.toASN1Primitive();
                           ASN1OctetString imsi_OS = (ASN1OctetString) ((ASN1TaggedObject)imsi_asn1Prim).getObject(); //According to spec is OCTETString
                           raw_imsi = imsi_OS.toString();
                        }
                 }
}

其中 raw_imsi 变量将给出解码后的特定索引数据