2012-04-17 40 views
20

Tengo objetos de datos ASN.1 binarios que necesito analizar en mi proyecto Java. Sólo quiero la estructura ASN.1 y datos a medida que se analiza, por ejemplo, por el espectador BER:Análisis de datos binarios ASN.1 con Java

ASN.1 structure as shown in BER viewer

El analizador ASN.1 de BouncyCastle no es capaz de analizar esta estructura (sólo devuelve binaria de aplicación específica tipo de datos).

¿Qué biblioteca ASN.1 puedo utilizar para obtener dicho resultado? ¿Alguien tiene un código de muestra que demuestra cómo analizar un objeto ASN.1?

BTW: También probé varios compiladores libres de ASN.1 Java pero ninguno es capaz de generar código Java funcional dado puede especificación ASN.1.

+0

No sólo quiere analizar un flujo de datos de BER, o quiere poner en práctica una gramática ASN.1 específico? –

+0

Tengo una gramática ASN.1 pero los compiladores ASN.1 que probé no la aceptan. De todos modos, preferiría no restringirme a esos objetos para los que tengo la gramática. – Robert

Respuesta

15

Tengo que corregirme a mí mismo - es posible leer los datos utilizando el analizador ASN.1 incluido en BouncyCastle - sin embargo, el proceso no es tan simple.

Si solo desea imprimir los datos contenidos en una estructura ASN.1, le recomiendo que utilice la clase org.bouncycastle.asn1.util.ASN1Dump. Puede ser utilizado por el siguiente fragmento de código simple:

ASN1InputStream bIn = new ASN1InputStream(new ByteArrayInputStream(data)); 
ASN1Primitive obj = bIn.readObject(); 
System.out.println(ASN1Dump.dumpAsString(obj)); 

Imprime la estructura, pero no los datos - pero copiando el ASN1Dump en una clase propia y modificándola para imprimir por ejemplo OCTET_STRINGS esto se puede hacer fácilmente .

Además, el código en ASN1Dump demuestra analizar estructuras ASN.1.Para el ejemplo de los datos utilizados en mi pregunta se puede analizar un nivel más profundo utilizando el siguiente código:

DERApplicationSpecific app = (DERApplicationSpecific) obj; 
ASN1Sequence seq = (ASN1Sequence) app.getObject(BERTags.SEQUENCE); 
Enumeration secEnum = seq.getObjects(); 
while (secEnum.hasMoreElements()) { 
    ASN1Primitive seqObj = (ASN1Primitive) secEnum.nextElement(); 
    System.out.println(seqObj); 
} 
1

Si solo desea decodificar los datos codificados en BER, existen numerosos analizadores. ¿Has probado alguna? Incluso hay dos en Sun JDK: com.sun.jmx.snmp.BerDecoder y com.sun.jndi.ldap.BerDecoder.

+4

Nota: Las clases JDK en los paquetes com.sun. * No son API públicas y se pueden eliminar o cambiar en futuras versiones. – Puce

+0

@Tom: Daría una oportunidad a esas clases pero la documentación de esas clases es tan buena como la documentación de varios otros proyectos ASN.1: casi inexistente ... – Robert

+0

La documentación no es ideal, pero las clases son simple, y puede obtener el código fuente a través de OpenJDK. Me imagino que puedes aprender todo lo que necesitas saber leyendo y experimentando. –

3

No está claro por su pregunta si tiene o no la especificación ASN.1 para la BER que está tratando de analizar. Tenga en cuenta que sin la especificación ASN.1, solo puede dar un sentido parcial a los datos si se usaron EXPLICIT TAGS en la especificación ASN.1 a partir de la cual se generó. Algunas herramientas, como la de OSS Nokalva, tienen una biblioteca (archivo jar) llamada JIAAPI que le permite recorrer y manipular codificaciones BER sin conocimiento previo de la especificación ASN.1.

Si tiene la especificación ASN.1, cualquier compilador ASN.1 Java debería ser capaz de manejar esto.

Puede descargar una versión de prueba gratuita de OSS ASN.1 Tools para Java desde http://www.oss.com/asn1/products/asn1-download.html para ver si funciona mejor para usted que las otras que intentó sin éxito.

2

Necesito poder analizar cualquier clase de datos de ASN.1 en krypt. Aunque krypt es un proyecto de Ruby, es posible que desee echarle un vistazo al JRuby extension - el código para manejar el análisis/codificación ASN.1 está escrito completamente en Java y es lo suficientemente modular para una fácil extracción.

También hice un Java-only version, pero falta algo de la funcionalidad de nivel superior del primero. Pero dado que es conciso, tal vez sea una buena oportunidad para comenzar.

+0

Su código se ve bien - lamentablemente noté que no solo necesito un analizador/deserializador ASN.1 sino también la parte de serialización. – Robert

+0

¡Gracias! Dejé de avanzar en la versión solo de Java cuando comencé a integrarlo en krypt, allí, también encontrarás los [bits de serialización] (https://github.com/emboss/krypt-core-java/tree/master/src/ impl/krypt/asn1). Todo el paquete impl es autónomo, por lo que no se entremezcla con los detalles de JRuby: debería poder extraerlo fácilmente. – emboss

1

estoy usando API BouncyCastle para imprimir la estructura de la cadena, a continuación es el fragmento de código:

ASN1InputStream bIn = new ASN1InputStream(input); 
    DERObject obj = bIn.readObject(); 
    System.out.println(CustomTreeNode.dumpAsString(obj)); 

En resultado, es la estructura de impresión, pero en cadena de octetos es la longitud de impresión en lugar del valor. ¿Cómo imprimir valor?

+0

Tengo el mismo requisito, tengo asn1Object. Desde allí necesito analizar los datos y obtener los datos necesarios, ¿podría proporcionar el código? –

+0

¿Qué es CustomTreeNode? –

4

sólo tiene que utilizar "verdadero" para imprimir los valores

ASN1InputStream ais = new ASN1InputStream(
     new FileInputStream(new File("d:/myfile.cdr"))); 
    while (ais.available() > 0) { 
     ASN1Primitive obj = ais.readObject(); 
     System.out.println(ASN1Dump.dumpAsString(obj, true)); 
    } 
    ais.close(); 
+0

Con fines informativos: dumpAsString con dos parámetros no está disponible en versiones anteriores de bouncycastle. – kukudas