【问题标题】:How to decode asn.1 data in java如何在java中解码asn.1数据
【发布时间】:2015-05-27 13:10:15
【问题描述】:

我有一个 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

我认为这不是实际的格式。我如何读取文件以及在我的项目中添加哪些 jars 才能读取文件。

【问题讨论】:

    标签: java asn.1


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      在编写这段代码时,我每次都会读取一个 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 变量将给出解码后的特定索引数据

      【讨论】:

      • 您不能将任意输入流拆分为 2k 个块,并期望这些块中的每一个都可以解析为 ASN.1。
      • @Roland Illig 并非一切都会奏效,要获得输出,人们应该努力解决!在发布答案时,我已经声明发布的代码基于我正在处理的场景,并且我能够获得所需的输出,并且不会根据问题的要求进行更改。如果您想要正确的输出,您应该知道 ASN.1 代码是如何编写来对要求的数据进行编码的。仅仅通过传递编码数据并期望输出是愚蠢的。
      猜你喜欢
      • 2018-10-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多