2017-06-12 5 views
1

Ich möchte eine benutzerdefinierte ASN.1 Struktur, die aus 3 PrintableString 's und 1 OctetString besteht. Ich benutze das BouncyCastle-Framework, um damit zu arbeiten.Export ASN.1-Format, dann mit Base64 JAVA kodieren

Also ich in meiner Klasse die erforderlichen Parameter festlegen, und jetzt muss ich diese Struktur im ASN.1-Format zurückgeben, und codieren Sie es dann mit Base64 (Parameter ist byte []), dann in PEM-Format.

Also meine Frage ist, dass welche Art von Objekt muss ich von Methode getASN1format() zurückgeben?

Mein Code:

import org.bouncycastle.asn1.*; 
import java.io.IOException; 

public class ASN1Handshake1 implements ASN1Encodable { 
    private DERPrintableString A, B, ID_PASS; 
    private ASN1OctetString ID_K; 

    public ASN1Handshake1(String A, String B, String ID_K, String ID_PASS, TTP TTPs) throws IOException { 
     this.A = new DERPrintableString(A); 
     this.B = new DERPrintableString(B); 
     this.ID_K = new DEROctetString(ID_K.getBytes()); 
     this.ID_PASS = new DERPrintableString(ID_PASS); 
    } 

    public ?? getASN1format(){ 
     //TODO 
    } 

    @Override 
    public ASN1Primitive toASN1Primitive() { 
     return null; 
    } 
} 

Antwort

1

Ich verwende Hüpfburg 1,57 (bcprov-jdk15on) für diesen Code.

Zunächst einmal bedenken Sie, dass ASN.1 ist kein Format per se, es ist ein description language dass definiert eine Struktur und PEM is a format that uses base 64. Viele Kryptographiestandards verwenden ASN.1, um ihre Datenstrukturen zu definieren, und PEM oder DER (Distinguished Encoding Rules), um diese Strukturen zu serialisieren.

Also, wenn Sie die ASN.1-Struktur erhalten und zu Base64 formatieren möchten, können Sie wie folgt tun. Sie benötigen keine getASN1format Methode, verwenden Sie nur die vorhandenen.

Die Felder können in der ASN.1-Struktur nicht einfach "lose" sein. Also habe ich beschlossen, sie in eine Sequenz zu setzen (mit org.bouncycastle.asn1.DERSequence Klasse), die die beste Wahl ist, um Felder einer Struktur zu speichern. Ich gebe sie in der Reihenfolge an, in der sie deklariert sind, aber natürlich können Sie jede beliebige Reihenfolge wählen.

Ich habe auch die Namen der Variablen geändert, um Java's code conventions folgen (Namen beginnen mit Kleinbuchstaben). So ist der Klassencode ist:

import org.bouncycastle.asn1.ASN1Encodable; 
import org.bouncycastle.asn1.ASN1Object; 
import org.bouncycastle.asn1.ASN1OctetString; 
import org.bouncycastle.asn1.ASN1Primitive; 
import org.bouncycastle.asn1.ASN1Sequence; 
import org.bouncycastle.asn1.DEROctetString; 
import org.bouncycastle.asn1.DERPrintableString; 
import org.bouncycastle.asn1.DERSequence; 

public class ASN1Handshake1 extends ASN1Object { 

    private DERPrintableString a, b, idPass; 

    private ASN1OctetString idK; 

    // removed TTPs parameter (it wasn't using it) 
    public ASN1Handshake1(String a, String b, String idK, String idPass) { 
     this.a = new DERPrintableString(a); 
     this.b = new DERPrintableString(b); 
     this.idK = new DEROctetString(idK.getBytes()); 
     this.idPass = new DERPrintableString(idPass); 
    } 

    // returns a DERSequence containing all the fields 
    @Override 
    public ASN1Primitive toASN1Primitive() { 
     ASN1Encodable[] v = new ASN1Encodable[] { this.a, this.b, this.idK, this.idPass }; 
     return new DERSequence(v); 
    } 
} 

ein Handshake Objekt zu erstellen und konvertieren es in base64 (der Code unten nicht Ausnahmen ist der Umgang, so fügen Sie den try/catch Block entsprechend):

Dies wird ausgegeben die Handshake-Struktur in Base64-Format:

MBUTAWETAWIEBElEX0sTB0lEX1BBU1M =

Bitte beachten Sie, dass dies kein vollständiges PEM ist (mit Kopfzeilen wie -----BEGIN CERTIFICATE-----), da Ihre benutzerdefinierte Struktur kein vordefinierter Standard ist. Sie müssen also bei dieser base64-generischen Zeichenfolge bleiben.

Überprüfen, ob die Base64-Zeichenfolge die ASN enthält.1-Sequenz, gerade tun:

// read from base64 String 
ASN1Sequence seq = (ASN1Sequence) DERSequence.fromByteArray(Base64.decode(base64String.getBytes())); 
int n = seq.size(); 
for (int i = 0; i < n; i++) { 
    ASN1Encodable obj = seq.getObjectAt(i); 
    if (obj instanceof DEROctetString) { 
     System.out.println(new String(((DEROctetString) obj).getOctets())); 
    } else { 
     System.out.println(obj); 
    } 
} 

Die Ausgabe lautet:

ein
b
ID_K
ID_PASS

+1

Danke Hugo, mehr als Antwort genügen. – preem

+0

Ihr Beispiel zeigt es nicht, aber im Allgemeinen PEM ist base64 _mit zusätzlichen Zeilenumbrüchen alle 64 (oder so) Zeichen_ plus gestrichelten BEGIN/END-typeName Zeilen. –

+0

@ dave_thompson_085 Die BEGIN/END sind für definierte Typen wie Zertifikat, CSR, Schlüssel und so weiter. Aber in diesem Fall ist es eine benutzerdefinierte Struktur mit einem "Nicht-Standard" -Format. Ich bin mir nicht sicher, ob man einfach einen neuen Typ erstellen kann oder ob es standardisiert ist. –

Verwandte Themen