Heim > Artikel > Backend-Entwicklung > Eintrag: Lösung für den Verarbeitungsfehler bei der PHP-RSA-Verschlüsselung
Vor kurzem muss ich nur mehrere Schnittstellen mit einem Drittanbietersystem verbinden. Die andere Partei verlangt, dass Postdaten eine RSA-Verschlüsselung benötigen, also hat Baidu nach der PHP-RSA-Verschlüsselungsverarbeitung gesucht, und dann können Sie Folge mir Das folgende Beispiel wurde gefunden:
/** * @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; }
Also habe ich es gerne in mein eigenes Projekt kopiert und ein wenig modifiziert, bevor ich es getestet habe. Ich habe einfach ein paar Zeichenfolgen hineingegeben:
<?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; }
Das Programm gibt aus:
string(344) "HSqVQbyhmWYrptvgzK+ggqmma88QRFVJerXTrZ+RpYqhZr/Dr9au9wxX+aAYy1wRh0eBk+fIpU4wkEZs6P5yozf5e/rAAEYUOImTJZcOvZqr89znT3yqaV8ME+vR16FLK5sk3BwgpOWI6X+wBwU2cLnHKDdj9RpYWAYhi/mn8XJj4/srKZbSgAjvzWqZI9gfqiJNdz8kf/MPtQ65cSlAhvh4eByY8cLGfgUXV0dxzWAkwTSPl2faSq3GHsNMXnxwoNjIvqz/IuZavqABNVZCwrZC3ZVb+Op7wF9GxrkIdJYzmHpX/wNn1DPLHUvghtO/WmfN4Jb2ZVzTsneB5B3Z6g=="
Alles scheint Das ist normal, aber im eigentlichen Projekt habe ich beim Verschlüsseln einer relativ langen JSON-Zeichenfolge festgestellt, dass null zurückgegeben wurde. Ich habe darauf zurückgeführt, dass die Funktion openssl_public_encrypt zu diesem Zeitpunkt false zurückgegeben hat, was darauf hinweist, dass die Verschlüsselung fehlgeschlagen ist. Nachdem ich Zeichenfolgen unterschiedlicher Länge übergeben und mehrmals getestet hatte, stellte ich fest, dass die Verschlüsselung fehlschlägt, wenn die Zeichenfolgenlänge 100 Zeichen überschreitet. Ich habe mir das von der anderen Partei gesendete Java-Verschlüsselungsbeispiel angesehen und festgestellt, dass sie verschlüsselt werden muss Für die Zeichenfolge wurde eine Aufteilungsoperation durchgeführt, sodass die folgende geänderte Version erstellt wurde:
/** * 用公钥加密 * @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); }
Der aktuelle Test hat kein Verschlüsselungsfehlerproblem gefunden ~ Problem gelöst
Empfohlen: „
PHP-Video-TutorialDas obige ist der detaillierte Inhalt vonEintrag: Lösung für den Verarbeitungsfehler bei der PHP-RSA-Verschlüsselung. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!