4

RSAの暗号化と復号化に問題があります。私はAndroidで開発しており、RSA暗号化と復号化を外部委託したいと考えています。私のソースコードは、アウトソーシングする前はうまく機能していました。

秘密鍵と公開鍵を作成し、private.keyとpublic.keyとして保存しました。エラーは、このメソッドによって引き起こされたClassNotFoundExceptionです。

public Key getPrivateKey(){
  try {
    InputStream fis = activity.getResources().openRawResource(R.raw.private);
    ObjectInputStream ois = new ObjectInputStream(fis);
    Key RSAprivateKey = (Key)ois.readObject();
    return RSAprivateKey;
  }
  catch (FileNotFoundException e) {
    Log.e("FileNotFound","FileNotFound");
    e.printStackTrace();
  } catch (IOException e) {
    Log.e("IOEXception","IOEXception");
    e.printStackTrace();
  } catch (ClassNotFoundException e) {
    Log.e("ClassNotFound","ClassNotFound");
    Log.e("Errro", "Error: "+ e.getMessage());
    Log.e("error", e.toString());
    e.printStackTrace();
  }
  return null;
}

logcatを調べたところ、次のエラーメッセージが表示されました。

E/ClassNotFound(1205): ClassNotFound
03-19 13:54:52.176: E/Errro(1205): Error: 
com.android.org.bouncycastle.jce.provider.JCERSAPrivateCrtKey
03-19 13:54:52.176: E/error(1205): java.lang.ClassNotFoundException: 
com.android.org.bouncycastle.jce.provider.JCERSAPrivateCrtKey

英語は私の母国語ではないので、あなたが私の問題を理解してくれることを願っています。

編集:問題はコードのアウトソーシングが原因ではないことがわかりました。だから私はトピックが解決済みとしてマークすることができると思います。

4

1 に答える 1

0

RSAPublicKeyおよびRSAPrivateKeyインターフェイスです。を取得するKeyと、このインターフェースの暗号化プロバイダーによる実装を実際に受け取ります。これらのプロバイダーは、Java プラットフォームごとに異なります (ただし、少なくとも公式には、Android/Dalvik は Java プラットフォームではありません)。したがって、同じプラットフォームで作業している場合を除き、シリアライゼーションが機能するとは決して考えるべきではありません。

ただし、Java で公開鍵と秘密鍵をシリアル化する方法があります。KeyインターフェイスにはgetEncoded()、キーの最も一般的なバイナリ エンコーディングを返すメソッドが含まれています。この場合、RSAPublicKeyX5.09 SubjectKeyIdentifier 内の PKCS#1 エンコーディングです。この場合RSAPrivateKey内部のPKCS#8 エンコーディングが PKCS#1 で定義された構造にラップされます。これらは および を使用して表現できX509EncodedKeySpecPKCS8EncodedKeySpecRSA を使用してキーに変換できますKeyFactory

を呼び出した場合、秘密鍵は暗号化されないgetEncodedことに注意してください。通常、秘密鍵をまったく転送したくありません。転送する場合は、実際に暗号化する必要があります。Cipher.wrapおよびCipher.unwrapメソッドを使用してこれを行うことができます。

于 2015-09-01T08:59:27.770 に答える