2012-04-17 19 views
20

Tôi có các đối tượng dữ liệu ASN.1 nhị phân mà tôi cần phân tích cú pháp vào dự án Java của mình. Tôi chỉ muốn cấu trúc ASN.1 và dữ liệu khi nó được phân tách ví dụ bằng cách người xem BER:Phân tích dữ liệu nhị phân ASN.1 bằng Java

ASN.1 structure as shown in BER viewer

Các phân tích cú pháp ASN.1 của BouncyCastle không có khả năng để phân tích cấu trúc này (chỉ trả về ứng dụng nhị phân cụ thể loại dữ liệu).

Tôi có thể sử dụng thư viện nào ASN.1 để nhận kết quả như vậy? Có ai có mẫu mã chứng minh làm thế nào để phân tích một đối tượng ASN.1?

BTW: Tôi cũng đã thử một số trình biên dịch Java ASN.1 miễn phí nhưng không ai có thể tạo mã Java đang hoạt động được cung cấp có thể là đặc tả ASN.1.

+0

Bạn chỉ muốn phân tích một dòng dữ liệu BER, hay bạn muốn thực hiện một ngữ pháp ASN.1 cụ thể? –

+0

Tôi có một ngữ pháp ASN.1 nhưng các trình biên dịch ASN.1 mà tôi đã thử nghiệm không chấp nhận nó. Dù sao tôi không muốn bị giới hạn bởi những đối tượng mà tôi có ngữ pháp. – Robert

Trả lời

15

Tôi phải sửa bản thân mình - có thể đọc dữ liệu bằng cách sử dụng trình phân tích cú pháp ASN.1 được bao gồm trong BouncyCastle - tuy nhiên quá trình này không đơn giản.

Nếu bạn chỉ muốn in dữ liệu chứa trong cấu trúc ASN.1, tôi khuyên bạn nên sử dụng lớp org.bouncycastle.asn1.util.ASN1Dump. Nó có thể được sử dụng bởi các đoạn mã đơn giản sau đây:

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

nó in cấu trúc nhưng không phải là dữ liệu - nhưng bằng cách sao chép ASN1Dump thành một lớp riêng và sửa đổi nó để in ra ví dụ OCTET_STRINGS này có thể được thực hiện một cách dễ dàng .

Ngoài ra mã trong ASN1Dump thể hiện phân tích cấu trúc ASN.1.Ví dụ như các dữ liệu được sử dụng trong câu hỏi của tôi có thể được phân tích một mức độ sâu hơn bằng cách sử dụng đoạn mã sau:

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

Nếu bạn chỉ muốn giải mã dữ liệu được mã hóa BER, có rất nhiều trình phân tích cú pháp. Bạn đã thử chưa? Thậm chí có cả hai mặt trời trong JDK - com.sun.jmx.snmp.BerDecodercom.sun.jndi.ldap.BerDecoder.

+4

Lưu ý: Các lớp JDK trong các gói com.sun. * Không phải là các API công khai, có thể được xóa/thay đổi trong các bản phát hành sau này. – Puce

+0

@Tom: Tôi sẽ thử các lớp đó nhưng tài liệu của các lớp đó tốt bằng tài liệu của một số dự án ASN.1 khác: gần như không tồn tại ... – Robert

+0

Tài liệu không lý tưởng, nhưng các lớp học đơn giản, và bạn có thể lấy mã nguồn thông qua OpenJDK. Tôi sẽ tưởng tượng rằng bạn có thể tìm hiểu mọi thứ bạn cần biết bằng cách đọc và thử nghiệm. –

3

Nó không phải là rõ ràng từ câu hỏi của bạn hay không bạn có các đặc điểm kỹ thuật ASN.1 cho BER bạn đang cố gắng phân tích cú pháp. Xin lưu ý rằng không có đặc điểm kỹ thuật ASN.1, bạn chỉ có thể hiểu một phần dữ liệu nếu các thẻ TỪ KHÓA được sử dụng trong đặc tả ASN.1 mà từ đó nó được tạo ra. Một số công cụ, chẳng hạn như một công cụ từ OSS Nokalva có một thư viện (tệp jar) được gọi là JIAAPI cho phép bạn duyệt và thao tác mã hóa BER mà không cần biết trước về đặc tả ASN.1.

Nếu bạn có đặc tả ASN.1, mọi trình biên dịch Java ASN.1 sẽ có thể xử lý việc này.

Bạn có thể tải xuống bản dùng thử miễn phí các công cụ OSS ASN.1 cho Java từ http://www.oss.com/asn1/products/asn1-download.html để xem liệu có hoạt động tốt hơn cho bạn hay không so với những người khác bạn đã thử không thành công.

2

Tôi cần có khả năng phân tích cú pháp bất kỳ loại dữ liệu ASN.1 nào trong krypt. Mặc dù krypt là một dự án Ruby, bạn có thể muốn xem xét JRuby extension - mã để xử lý phân tích cú pháp/mã hóa ASN.1 được viết hoàn toàn bằng Java và đủ mô-đun để dễ dàng khai thác.

Tôi cũng đã thực hiện một Java-only version, nhưng thiếu một số chức năng cấp cao hơn của cũ. Nhưng vì nó ngắn gọn, có thể đó là cơ hội tốt để bạn bắt đầu.

+0

Mã của bạn trông đẹp - không may tôi nhận thấy rằng tôi không chỉ cần một trình phân tích cú pháp/deserializer ASN.1 mà còn là phần tuần tự hóa. – Robert

+0

Cảm ơn! Tôi đã ngừng nâng cấp phiên bản Java khi tôi bắt đầu tích hợp nó vào krypt, ở đó, bạn cũng sẽ tìm thấy [bit serialization] (https://github.com/emboss/krypt-core-java/tree/master/src/ impl/krypt/asn1). Toàn bộ gói impl là khép kín, do đó, nó sẽ không được xen kẽ với các chi tiết cụ thể JRuby - bạn sẽ có thể giải nén nó một cách dễ dàng. – emboss

1

Tôi đang sử dụng API BouncyCastle để in các cấu trúc chuỗi, dưới đây là đoạn mã:

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

Kết quả là cấu trúc in nhưng trong chuỗi octet nó có chiều dài in thay vì giá trị. Cách in giá trị?

+0

Tôi có cùng yêu cầu, tôi có asn1Object. Từ đó tôi cần phải phân tích cú pháp dữ liệu và nhận dữ liệu bắt buộc, bạn có thể vui lòng cung cấp mã không? –

+0

CustomTreeNode là gì? –

4

Chỉ cần sử dụng "true" để in các giá trị

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

Đối với mục đích thông tin: dumpAsString với hai tham số không có sẵn trong các phiên bản bouncycastle cũ hơn. – kukudas