9

バイト配列から PrivateKey を生成する方法はありますか? getEncoded() メソッドを使用してこのバイト配列を取得しましたが、PrivateKey に戻す必要があります。

ありがとう、ヴーク

4

5 に答える 5

7

私もこの答えを探していて、ついに見つけました。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 ライブラリをダウンロードする必要があります。

于 2011-06-16T19:30:36.890 に答える
5

Javaドキュメントに記載されているように

キーは通常、キー ジェネレータ、証明書、またはキーの管理に使用されるさまざまな ID クラスを通じて取得されます。キーは、キー ファクトリを使用して、キー仕様 (基になるキー マテリアルの透過的な表現) から取得することもできます。

これにはKeyFactoryクラスが役立ちます。

于 2011-01-05T01:45:28.813 に答える
3

エンコードされたバイト配列を破棄します。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 を検索すると、興味深い投稿がいくつか見つかります。

于 2011-01-05T13:31:00.493 に答える
0

PKCS#8 でエンコードされた blob を自分でデコードし (ASN.1 BER 解析)、コンポーネントを設定するか、秘密鍵からコンポーネント (少なくとも秘密指数とモジュラス) を Java BigInteger として取得し、それらを次のように変換する必要があります。 Robert の説明に従って、符号なしバイト配列を Java Card API に設定します。PKCS#8 の構文解析は Java Card で実行できますが、これは非常に厄介な作業です。

于 2012-05-10T19:35:15.253 に答える