4

アプリで暗号化を使用しています。秘密鍵をバイト配列として保存し、次のコードを使用して復元します。

PrivateKey private = KeyFactory.getInstance("RSA").generatePrivate(new PKCS8EncodedKeySpec(s_privateKeyIn1t));

ターゲットのすべての Android プラットフォーム 2.1 -> 4.0.4 で完全に動作しますが、Jelly Bean では失敗します!

Jelly Bean は例外をスローします。

07-20 17:29:35.197: E/AnyBalance:Codec(990): Caused by: java.lang.RuntimeException: error:0D0680A8:asn1 encoding routines:ASN1_CHECK_TLEN:wrong tag
07-20 17:29:35.197: E/AnyBalance:Codec(990):    at org.apache.harmony.xnet.provider.jsse.NativeCrypto.d2i_PKCS8_PRIV_KEY_INFO(Native Method)
07-20 17:29:35.197: E/AnyBalance:Codec(990):    at org.apache.harmony.xnet.provider.jsse.OpenSSLRSAKeyFactory.engineGeneratePrivate(OpenSSLRSAKeyFactory.java:73)

なにが問題ですか?

4

2 に答える 2

23

これは私のために働いたコードです(2行目が重要な部分です):

PKCS8EncodedKeySpec privSpec = new PKCS8EncodedKeySpec(s_privateKeyIn1t);
KeyFactory keyFactory = KeyFactory.getInstance("RSA", "BC");
PrivateKey privateKey = keyFactory.generatePrivate(privSpec);
于 2014-03-18T11:15:36.967 に答える
2

何が原因なのかはわかりませんが、対処法はわかりました。以前の Android バージョンでキーを再エンコードしましたが、この再エンコードされたキーは Jelly Bean で機能しました。

次のコードを使用してキーを再エンコードしました。

Private key = KeyFactory.getInstance("RSA").generatePrivate(new PKCS8EncodedKeySpec(s_privateKeyIn1t));
byte [] xxx = s_privateKey.getEncoded(); //Then I watched this byte array in debugger and inserted it in a source code.
//Now it works on Jelly Bean
于 2012-07-20T18:13:53.907 に答える