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

时间:2015-05-27 13:10:16

标签: java asn.1

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

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

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

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:-1)

你有一个编码流的字符串转储,只需使用下面的鳕鱼片(我没有根据你的答案改变,只需了解下面的代码,然后就可以了)

在编写此代码时,我每次都使用读取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变量将给出解码的特定索引数据