Heim > Backend-Entwicklung > PHP-Tutorial > Eintrag: Lösung für den Verarbeitungsfehler bei der PHP-RSA-Verschlüsselung

Eintrag: Lösung für den Verarbeitungsfehler bei der PHP-RSA-Verschlüsselung

藏色散人
Freigeben: 2023-04-10 21:22:02
nach vorne
4920 Leute haben es durchsucht

Über die PHP-RSA-Verschlüsselungsverarbeitung

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;
    }
Nach dem Login kopieren

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 = &#39;基督教解决基督教解决决&#39;;
$ret = publicEncrypt($string);
var_dump($ret);
/**     
 * @uses 公钥加密     
 * @param string $data     
 * @return null|string     
 */    
function publicEncrypt($data = &#39;&#39;) {    
    $publicKey = &#39;MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAiX1bIq02AFypLOJ4byShfo6+D6pj0rQrdAtZ8Bb2Z4YwdCZS5vlEduBiVCZSKfF70M0nk4gMqhAKcgwqWxgI1/j8OrX401AssfaiXr2JqsAl679s+Xlwe0jppNe1832+3g0YOawDTpAQsUJDu1DpnyGnUz0qeac0/GiAJlXzKUP+/3db8haDuOkgYrT8A6twGAm7YwIuliieDWDcUS/CQzXGRtwtZQqUJDQsWC1lCML1kRUjbZ2EM2EzyttgHN0SsNryhVLHXSFXpDWbeqQwk36axojGF1lbg/oVQy+BnYJx8pKpTgSwIDAQAB&#39;;    
    $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;
}
Nach dem Login kopieren

Das Programm gibt aus:

string(344) "HSqVQbyhmWYrptvgzK+ggqmma88QRFVJerXTrZ+RpYqhZr/Dr9au9wxX+aAYy1wRh0eBk+fIpU4wkEZs6P5yozf5e/rAAEYUOImTJZcOvZqr89znT3yqaV8ME+vR16FLK5sk3BwgpOWI6X+wBwU2cLnHKDdj9RpYWAYhi/mn8XJj4/srKZbSgAjvzWqZI9gfqiJNdz8kf/MPtQ65cSlAhvh4eByY8cLGfgUXV0dxzWAkwTSPl2faSq3GHsNMXnxwoNjIvqz/IuZavqABNVZCwrZC3ZVb+Op7wF9GxrkIdJYzmHpX/wNn1DPLHUvghtO/WmfN4Jb2ZVzTsneB5B3Z6g=="
Nach dem Login kopieren

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);
    }
Nach dem Login kopieren

Der aktuelle Test hat kein Verschlüsselungsfehlerproblem gefunden ~ Problem gelöst

Empfohlen: „

PHP-Video-Tutorial

Das 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!

Verwandte Etiketten:
Quelle:learnku.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage