私は、このコードに弾む城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
ID_K
は、より多くの答えを満たすよりも、あなたのヒューゴありがとうございます。 – preem
あなたの例では表示されませんが、一般的にPEMはbase64 _に64文字(またはそれ以上)の文字列と破線のBEGIN/END-typename行が追加されています。 –
@ dave_thompson_085 BEGIN/ENDは、証明書、CSR、キーなどの定義されたタイプのものです。しかし、この場合、それは "非標準"形式のカスタム構造です。新しいタイプを作成できるかどうか、あるいは標準化されているかどうかはわかりません。 –