如何解码 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 变量将给出解码后的特定索引数据
我有一个 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 变量将给出解码后的特定索引数据