1

公開鍵と秘密鍵のペアを生成するクライアント (Android デバイス) があります。公開鍵をサーバーに送信し、サーバーは公開鍵を使用して一部のデータを暗号化し、クライアントが後で秘密鍵を使用して復号化できるようにそれを返す必要があります。私の php コードは、提供している公開鍵が無効であることを示す警告を記録します。

デバイス側では、次のようにキー ペアを生成します -

KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA");
kpg.initialize(256);
KeyPair kp = kpg.generateKeyPair();
PublicKey publicKey = kp.getPublic();

次に、base64 でエンコードして POST します -

String urlParameters = "productID=" + productID + "&publicKey="
                + URLEncoder.encode(Base64.encodeToString(publicKey.getEncoded(),
                        Base64.DEFAULT)); // without the URLEncoder, the + signs
                                          // are turned into spaces

サーバー側では、POST パラメーターから publicKey を抽出し、それを使用して一部のデータをエンコードしようとします -

$publicKey = $_POST['publicKey'];
$encryptedData = '';
$productData = 'test test test';
openssl_public_encrypt($productData, $encryptedData, $publicKey);

これにより、ログに次のエラーが表示されます-

PHP Warning:  openssl_public_encrypt(): key parameter is not a valid public key

また、暗号化に使用する前に公開鍵にプレフィックスとサフィックスを追加しようとしましたが、それも役に立ちませんでした-

$publicKey = "-----BEGIN PUBLIC KEY-----\r\n" . $publicKey . "\r\n-----END PUBLIC KEY-----";

これについてしばらく頭を悩ませていましたが、オンラインで出くわした提案はどれも役に立たないようです. どんな考えでも最も役に立ちます!

4

1 に答える 1

1

2つの変更を加えることで、最終的に問題を解決できました-

  1. Java 側ではBase64.NO_WRAPなくフラグを使用する必要がありました。Base64.DEFAULT
  2. チャンク分割後にphpにプレフィックス/サフィックスを追加しました - $publicKey = "-----BEGIN PUBLIC KEY-----\r\n" . chunk_split($publicKey) . "-----END PUBLIC KEY-----";
于 2013-02-23T16:22:29.800 に答える