2017-06-12 32 views
1

カスタムASN.1構造を作成します。3の内容は、PrintableStringと1 OctetStringです。私はBouncyCastleフレームワークを使用してこれを処理しています。ASN.1形式をエクスポートし、次にBase64でエンコードします。JA

私はクラスに必要なパラメータを設定しました。この構造体をASN.1形式で返し、次にBase64(そのパラメータはbyte [])でエンコードしてからPEM形式にエンコードする必要があります。

私の質問は、どのタイプのオブジェクトをメソッドgetASN1format()から返さなければならないのでしょうか?

マイコード:

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; 
    } 
} 

答えて

1

私は、このコードに弾む城1.57(bcprov-jdk15on)を使用しています。

まず、ASN.1は、それ自体形式ではないことを覚えておいて、それは、構造、およびPEM is a format that uses base 64を定義することdescription languageです。多くの暗号標準では、ASN.1を使用してデータ構造を定義し、PEMまたはDER (Distinguished Encoding Rules)を使用してこれらの構造をシリアル化しています。

したがって、ASN.1構造体を取得してbase64にフォーマットするには、以下のようにします。 getASN1formatメソッドは必要ありません。既存のものを使用してください。

フィールドは、ASN.1構造体では「緩い」ことはできません。だから私はシーケンス(org.bouncycastle.asn1.DERSequenceクラスを使用して)を配列に入れることにしました。これは構造体のフィールドを格納するのに最適です。私はそれらを宣言された順序で入れますが、もちろんあなたが望む順序を選ぶことができます。

また、変数名をJava's code conventions(小文字で始まる名前)に変更しました。だから、クラスコードは次のとおりです。

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); 
    } 
} 

握手オブジェクトを作成し、BASE64に変換(以下のコードは、例外を処理していないので、それに応じtry/catchブロックを追加)するには:

この意志出力Base64形式でハンドシェイク構造:

MBUTAWETAWIEBElEX0sTB0lEX1BBU1M =

あなたのカスタム構造があらかじめ定義された標準ではないため、これは完全なPEM(ヘッダーは-----BEGIN CERTIFICATE-----)ではないことに注意してください。したがって、このbase64汎用文字列にとどまる必要があります。

base64文字列にASNが含まれていることを確認します。1つのシーケンスは、単に実行します。

// 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); 
    } 
} 

出力は次のようになります。


B ID_PASS

+1


ID_K
は、より多くの答えを満たすよりも、あなたのヒューゴありがとうございます。 – preem

+0

あなたの例では表示されませんが、一般的にPEMはbase64 _に64文字(またはそれ以上)の文字列と破線のBEGIN/END-typename行が追加されています。 –

+0

@ dave_thompson_085 BEGIN/ENDは、証明書、CSR、キーなどの定義されたタイプのものです。しかし、この場合、それは "非標準"形式のカスタム構造です。新しいタイプを作成できるかどうか、あるいは標準化されているかどうかはわかりません。 –

関連する問題