2

デバイスで生成された RSA キーを使用して、Android アプリケーションで文字列を復号化しようとしています。暗号化は、私のアプリケーションによって提供された公開 RSA キーを使用して、php サービスによって行われます。私の問題は復号化にあり、失敗します。

私は次のことをしています:

  • Android での KeyPair の生成 (KeyPairGenerator.getInstance("RSA") を使用) -> OK

  • 両方の鍵 (公開鍵と秘密鍵) は、Base64.encode(pubKey.getEncoded()) で「base64」エンコードされた後、秘密鍵と同じようにファイルに保存されます。-> OK

  • Web サービスを呼び出すときに、公開鍵 (base 64) を post 変数に渡します -> OK

  • Web サービス (PHP サービス) は、openssl_public_encrypt 関数で公開鍵を使用して短い文字列を暗号化します。暗号化された文字列は base64 に変換されます。-> OK のようです。関数は FALSE を返しません。

  • アプリケーションはサービスの結果を取得し、それをデコードします (Base64.decode()) -> OK (確認しました。受信したバイトは openssl_public_encrypt() 関数によって生成されたものと一致します)

  • 最後に、この文字列を復号化します。次のことを行っています: -> NOT OK

    暗号 cipher = Cipher.getInstance("RSA");

    cipher.init(Cipher.DECRYPT_MODE, privateKey);

    byte[] decryptedBytes = cipher.doFinal(cryptedBytes);

    文字列復号文字列 = 新しい文字列 (decryptedBytes);

    System.out.println(decryptedString);

復号化の結果が元の文字列と一致しません。

何か不足していますか?

4

1 に答える 1

10

OpenSSL はpadding = OPENSSL_PKCS1_PADDINGデフォルトで使用します。したがって、両側で同じパディング メカニズムを使用するには、 を使用する必要がありますCipher.getInstance("RSA/ECB/PKCS1Padding")。これは、Java SE でも使用できるものです。

暗号化のデフォルトの操作モードに依存することは非常に危険であることに注意してください。多くの実装には異なるデフォルトがあり、それらを調べるのは難しい場合があります。したがって、常に使用するアルゴリズム/モードを完全に指定するようにしてください。

他の RSA パディング モードを試すこともできますが、残念ながら、Android では、採用した Bouncy Castle ソース コードから多くのアルゴリズムとエイリアスが無効になっていることに注意してください。


[編集] これは古い回答です。現在、OAEP パディング、または RSA-KEM を使用したハイブリッド暗号化が強く推奨されています。

于 2013-07-23T20:56:41.733 に答える