2012-04-17 10 views
20

Ho oggetti dati ASN.1 binari che devo analizzare nel mio progetto Java. Voglio solo la struttura ASN.1 e dei dati in quanto è analizzato, ad esempio da parte dello spettatore BER:Analisi di dati binari ASN.1 con Java

ASN.1 structure as shown in BER viewer

Il parser ASN.1 di BouncyCastle non è in grado di analizzare tale struttura (restituisce solo binario specifica applicazione tipo di dati).

Quale libreria ASN.1 posso utilizzare per ottenere tale risultato? Qualcuno ha un codice di esempio che dimostra come analizzare un oggetto ASN.1?

BTW: Ho anche provato diversi compilatori Java ASN.1 gratuiti, ma nessuno è in grado di generare codice Java funzionante dato può specificare ASN.1.

+0

Avete voglia di analizzare un flusso di dati BER, o si desidera implementare una specifica grammatica ASN.1? –

+0

Ho una grammatica ASN.1 ma i compilatori ASN.1 che ho provato non lo accettano. Ad ogni modo preferirei non essere limitato a quegli oggetti per cui ho la grammatica. – Robert

risposta

15

Devo correggere me stesso - è possibile leggere i dati utilizzando il parser ASN.1 incluso in BouncyCastle - tuttavia il processo non è così semplice.

Se si desidera stampare solo i dati contenuti in una struttura ASN.1, si consiglia di utilizzare la classe org.bouncycastle.asn1.util.ASN1Dump. Può essere utilizzato dalla seguente semplice frammento di codice:

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

Esso stampa la struttura, ma non i dati - ma copiando l'ASN1Dump in una classe proprio e modificandolo per stampare ad esempio OCTET_STRINGS questo può essere fatto facilmente .

Inoltre il codice in ASN1Dump dimostra di analizzare le strutture ASN.1.Per l'esempio dei dati utilizzati nella mia domanda possono essere analizzati un livello più profondo utilizzando il seguente codice:

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

Se si desidera solo decodificare i dati con codifica BER, ci sono numerosi parser là fuori. Hai provato qualcuno? Ne esistono anche due nel Sun JDK - com.sun.jmx.snmp.BerDecoder e com.sun.jndi.ldap.BerDecoder.

+4

Nota: le classi JDK nei pacchetti com.sun. * Non sono API pubbliche che possono essere rimosse/modificate nelle versioni future. – Puce

+0

@ Tom: darei a quelle classi una prova, ma la documentazione di quelle classi è buona come la documentazione di molti altri progetti ASN.1: quasi inesistenti ... – Robert

+0

La documentazione non è l'ideale, ma le classi sono semplice, e puoi ottenere il codice sorgente tramite OpenJDK. Immagino che tu possa imparare tutto ciò che devi sapere leggendo e sperimentando. –

3

Non è chiaro dalla domanda se si dispone o meno della specifica ASN.1 per il BER che si sta tentando di analizzare. Si noti che senza la specifica ASN.1, è possibile solo dare un senso ai dati se sono stati utilizzati i TAG ESPLICIT nella specifica ASN.1 da cui è stata generata. Alcuni strumenti, come quello di OSS Nokalva, dispongono di una libreria (file jar) chiamata JIAAPI che consente di attraversare e manipolare le codifiche BER senza previa conoscenza delle specifiche ASN.1.

Se si dispone della specifica ASN.1, qualsiasi compilatore Java ASN.1 dovrebbe essere in grado di gestirlo.

È possibile scaricare una versione di prova gratuita degli strumenti OSS ASN.1 per Java a partire dal http://www.oss.com/asn1/products/asn1-download.html per vedere se funziona meglio per voi rispetto agli altri tentativi non riusciti.

2

Devo essere in grado di analizzare qualsiasi tipo di dati ASN.1 in krypt. Sebbene krypt sia un progetto Ruby, potresti voler dare un'occhiata allo JRuby extension - il codice per la gestione dell'analisi/codifica ASN.1 è scritto interamente in Java e abbastanza modulare per una facile estrazione.

Ho anche creato un Java-only version, ma mancano alcune delle funzionalità di livello superiore del primo. Ma dal momento che è conciso, forse è una buona opportunità per iniziare.

+0

Il codice sembra bello - sfortunatamente ho notato che non ho solo bisogno di un parser/deserializzatore ASN.1 ma anche della parte serializzante. – Robert

+0

Grazie! Ho smesso di far avanzare la versione solo Java quando ho iniziato ad integrarlo in krypt, lì, troverai anche i [bit di serializzazione] (https://github.com/emboss/krypt-core-java/tree/master/src/ impl/Krypt/ASN1). L'intero pacchetto impl è autonomo, quindi non sarà mescolato con le specifiche di JRuby - dovresti essere in grado di estrarlo facilmente. – emboss

1

Sto usando API BouncyCastle per stampare la stringa struttura, qui di seguito è il frammento di codice:

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

Nel risultato è la struttura di stampa ma in stringa di ottetto sta stampando la lunghezza anziché il valore. Come stampare il valore?

+0

Ho lo stesso requisito, ho asn1Object. Da lì ho bisogno di analizzare i dati e ottenere i dati richiesti, potresti fornire il codice? –

+0

Che cos'è CustomTreeNode? –

4

Basta usare "vera" per stampare i valori

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

A scopo informativo: dumpAsString con due parametri non è disponibile nelle versioni precedenti di bouncycastle. – kukudas