10

状況

Java で RSA 暗号化を使用しています。Cyanogenmod の Android 2.2 を搭載した HTC Saphire (32B) 開発者向け携帯電話でデータを暗号化し、Mandriva Linux 2010 を実行している 64 ビット サーバーでそのデータを復号化しようとしています。両方のマシンで同じ公開鍵と秘密鍵のペアを使用しています。 、Androidフォンでデータを正しく暗号化/復号化でき、Linuxサーバーでデータを正しく暗号化/復号化できますが、電話でデータを暗号化してからサーバーで復号化できません. パディングの例外が発生します。データが電話から正しく送信され、サーバーによって正しく解析されていることを確認しました。そのため、復号化が失敗する理由がわかりません。誰でもこれで私を助けることができますか?おそらく、Java の RSA アルゴリズムには、単語のサイズに関するいくつかの基本的な仮定がありますか?

さらに詳しい情報:

  • 私の暗号化/復号化ライブラリは、こちらのガイドに基づいています。
  • 私の暗号化キーの長さは 2048 ビットですが、異なるキー サイズでも同様の動作が見られます。
  • RSA 暗号化/復号化コードを jar ファイルにパッケージ化しました。これは、サーバーのマシンで Eclipse を介してコンパイルされました。
  • Android フォンの暗号化ライブラリを使用するプログラムは、上記のライブラリを使用します。これも Eclipse を使用してビルドされました。
  • サーバー プログラムは、Netbeans を使用して作成されました (当時は Netbeans の方が簡単だったからです)。

その他の質問

  • Java で利用できる他の無料の公開鍵暗号化アルゴリズム/ライブラリはありますか? それらはクロスプラットフォームで動作しますか? それらにどのようなパフォーマンスが期待できますか? などなど。私はこれを調べましたが、あまり見つかりませんでした。おそらく私は間違ったキーワードで探しています。

ふぅ!それだけだと思います。事前にご協力いただきありがとうございます。

4

2 に答える 2

11

RSA 暗号化 (または任意の暗号化アルゴリズム) は、環境に関係なく機能するはずです。ただし、特定のシステムでは、デフォルトのパディングと動作モードについて異なる仮定を行う可能性があります。暗号化と復号化を実行するときは、アルゴリズムだけでなく、操作モード (CBC など) とパディングも完全に指定してください。それでも問題が解決しない場合は、デバイスとサーバーの両方からコードを投稿して、より詳細に調査できるようにすることをお勧めします。

編集あなたの質問に対処するには、Java では、crypto パッケージから暗号を取得するときに、通常、次のコードを使用します。

Cipher cipher;
cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");

指定された文字列はgetInstance、AES アルゴリズム、暗号ブロック チェーン操作モード、および PKCS5 パディングを使用する暗号インスタンスを取得するようランタイムに指示します。サポートされているアルゴリズムとパディングは多数あります。Java での暗号化の詳細については、Oracle のこのドキュメントを参照してください。

より具体的には、暗号を要求するために使用する文字列は次の形式です

<algorithm>/<mode of operation>/<padding>

さらに悪いことに、Java は多数のアルゴリズム、操作モード、およびパディングを提供していますが、それらすべてが連携して動作するわけではありません。機能する構成文字列を見つけるには、ドキュメントを読む必要があります。

于 2011-02-07T20:42:03.397 に答える
0

おそらく、データのチェックサムを実行し、それが暗号化/復号化APIに渡されるものとまったく同じであることを確認する必要があります。

于 2011-02-07T20:37:50.897 に答える