最近、いくつかのインターフェースをサードパーティのシステムに接続する必要があるのですが、相手が投稿データにrsa暗号化が必要であると要求しているので、Baiduでphpを検索しました。 RSA 暗号化処理について調べてから、私と同じように次の例を検索してください:
/** * @uses 公钥加密 * @param string $data * @return null|string */ public function publicEncrypt($data = '') { if (!is_string($data)) { return null; } return openssl_public_encrypt($data, $encrypted, $this->_getPublicKey()) ? base64_encode($encrypted) : null; }
それで、あなたは喜んでそれを自分のプロジェクトにコピーし、少し変更してテストし、それにいくつかの文字列を渡すだけです。 :
<?php $string = '基督教解决基督教解决决'; $ret = publicEncrypt($string); var_dump($ret); /** * @uses 公钥加密 * @param string $data * @return null|string */ function publicEncrypt($data = '') { $publicKey = 'MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAiX1bIq02AFypLOJ4byShfo6+D6pj0rQrdAtZ8Bb2Z4YwdCZS5vlEduBiVCZSKfF70M0nk4gMqhAKcgwqWxgI1/j8OrX401AssfaiXr2JqsAl679s+Xlwe0jppNe1832+3g0YOawDTpAQsUJDu1DpnyGnUz0qeac0/GiAJlXzKUP+/3db8haDuOkgYrT8A6twGAm7YwIuliieDWDcUS/CQzXGRtwtZQqUJDQsWC1lCML1kRUjbZ2EM2EzyttgHN0SsNryhVLHXSFXpDWbeqQwk36axojGF1lbg/oVQy+BnYJx8pKpTgSwIDAQAB'; $publicKey = "-----BEGIN PUBLIC KEY-----\n" . wordwrap($publicKey, 64, "\n", true) . "\n-----END PUBLIC KEY-----"; if (!is_string($data)) { return null; } return openssl_public_encrypt($data, $encrypted, $publicKey) ? base64_encode($encrypted) : null; }
プログラムは次のように出力します:
string(344) "HSqVQbyhmWYrptvgzK+ggqmma88QRFVJerXTrZ+RpYqhZr/Dr9au9wxX+aAYy1wRh0eBk+fIpU4wkEZs6P5yozf5e/rAAEYUOImTJZcOvZqr89znT3yqaV8ME+vR16FLK5sk3BwgpOWI6X+wBwU2cLnHKDdj9RpYWAYhi/mn8XJj4/srKZbSgAjvzWqZI9gfqiJNdz8kf/MPtQ65cSlAhvh4eByY8cLGfgUXV0dxzWAkwTSPl2faSq3GHsNMXnxwoNjIvqz/IuZavqABNVZCwrZC3ZVb+Op7wF9GxrkIdJYzmHpX/wNn1DPLHUvghtO/WmfN4Jb2ZVzTsneB5B3Z6g=="
すべて正常のようです。実際のプロジェクトで比較的長い json 文字列を暗号化すると、null が返されることがわかりました。openssl_public_encrypt 関数をトレースしました。この時点では false が返され、暗号化が失敗したことを示します。異なる長さの文字列を渡して何度かテストしたところ、文字列長が100文字を超えると暗号化に失敗することが分かり、相手から送られてきたJava暗号化例を参考にしたところ、文字列を暗号化する必要があることが分かりました。 encrypted は分割操作を受けるため、次の修正バージョンが利用可能です:
/** * 用公钥加密 * @param data * @param publicKey * @return * @throws Exception */ public static String rsaEncrypt(String data, PublicKey publicKey) throws Exception { Cipher cipher = Cipher.getInstance(RSA_ALGORITHM); cipher.init(Cipher.ENCRYPT_MODE, publicKey); int inputLen = data.getBytes().length; ByteArrayOutputStream out = new ByteArrayOutputStream(); int offset = 0; byte[] cache; int i = 0; // 对数据分段加密 while (inputLen - offset > 0) { if (inputLen - offset > MAX_ENCRYPT_BLOCK) { cache = cipher.doFinal(data.getBytes(), offset, MAX_ENCRYPT_BLOCK); } else { cache = cipher.doFinal(data.getBytes(), offset, inputLen - offset); } out.write(cache, 0, cache.length); i++; offset = i * MAX_ENCRYPT_BLOCK; } byte[] encryptedData = out.toByteArray(); out.close(); // 加密后的字符串 return Base64.getEncoder().encodeToString(encryptedData); }
現在のテストでは暗号化失敗の問題が見つかりませんでした ~ 問題解決
推奨事項: "
PHP ビデオ チュートリアル以上が記録: PHP rsa 暗号化処理エラーの解決策の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。