バイト配列から PrivateKey を生成する方法はありますか? getEncoded() メソッドを使用してこのバイト配列を取得しましたが、PrivateKey に戻す必要があります。
ありがとう、ヴーク
バイト配列から PrivateKey を生成する方法はありますか? getEncoded() メソッドを使用してこのバイト配列を取得しましたが、PrivateKey に戻す必要があります。
ありがとう、ヴーク
私もこの答えを探していて、ついに見つけました。keyBytes は、もともと getEncoded() で作成されたバイト配列です。
//add BouncyCastle as a provider if you want
Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
//create a keyfactory - use whichever algorithm and provider
KeyFactory kf = KeyFactory.getInstance("DSA", "BC");
//for private keys use PKCS8EncodedKeySpec; for public keys use X509EncodedKeySpec
PKCS8EncodedKeySpec ks = new PKCS8EncodedKeySpec(keyBytes);
PrivateKey pk = kf.generatePrivate(ks);
私は JavaCard に対して何もしたことがありませんが、この投稿から、KeyFactory クラスを使用できるようです。おそらく、BouncyCastle ライブラリをダウンロードする必要があります。
Javaドキュメントに記載されているように
キーは通常、キー ジェネレータ、証明書、またはキーの管理に使用されるさまざまな ID クラスを通じて取得されます。キーは、キー ファクトリを使用して、キー仕様 (基になるキー マテリアルの透過的な表現) から取得することもできます。
これにはKeyFactoryクラスが役立ちます。
エンコードされたバイト配列を破棄します。JavaCard では、AFAIR を直接デコードする方法はありません。さまざまな主要コンポーネントを個別に設定する必要があります。
たとえば、RSAPrivateKey は指数と係数で初期化する必要があります。
rsaPrivate = (RSAPrivateKey) javacard.security.KeyBuilder.buildKey
(javacard.security.KeyBuilder.TYPE_RSA_PRIVATE,
javacard.security.KeyBuilder.LENGTH_RSA_512, false);
byte[] exponent = {(byte) 7};
byte[] modulus = {(byte) 33};
rsaPrivate.setExponent(exponent, (short) 0, (short) exponent.length);
rsaPrivate.setModulus(modulus, (short) 0, (short) modulus.length);
ところで: JavaCard に関する質問については、Oracle フォーラムのJavaCard フォーラムをお勧めします。そこで RSAPrivateKey を検索すると、興味深い投稿がいくつか見つかります。
PKCS#8 でエンコードされた blob を自分でデコードし (ASN.1 BER 解析)、コンポーネントを設定するか、秘密鍵からコンポーネント (少なくとも秘密指数とモジュラス) を Java BigInteger として取得し、それらを次のように変換する必要があります。 Robert の説明に従って、符号なしバイト配列を Java Card API に設定します。PKCS#8 の構文解析は Java Card で実行できますが、これは非常に厄介な作業です。