Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Rekod: Penyelesaian kepada kegagalan pemprosesan penyulitan PHP rsa

Rekod: Penyelesaian kepada kegagalan pemprosesan penyulitan PHP rsa

藏色散人
藏色散人ke hadapan
2022-01-20 16:52:234864semak imbas

Mengenai pemprosesan penyulitan php rsa

Baru-baru ini, saya hanya perlu menyambung beberapa antara muka dengan sistem pihak ketiga Pihak lain memerlukan data siaran memerlukan penyulitan rsa, jadi Baidu mencari php tentang pemprosesan penyulitan rsa, dan kemudian anda boleh mencari contoh berikut seperti saya:

  /**     
     * @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;
    }

Jadi anda dengan senang hati menyalinnya ke projek anda sendiri, mengubah suai sedikit dan mengujinya, dan hanya lulus beberapa rentetan ke dalamnya:

<?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;
}

Atur cara mencetak:

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

Semuanya kelihatan seperti biasa Apabila menyulitkan rentetan json yang agak panjang dalam projek sebenar, didapati bahawa nol adalah kembali. Saya mengesan openssl_public_encrypt Fungsi mengembalikan palsu pada masa ini, menunjukkan bahawa penyulitan gagal. Selepas menghantar rentetan dengan panjang yang berbeza dan menguji beberapa kali, saya mendapati kegagalan penyulitan akan berlaku apabila panjang rentetan melebihi 100. Saya merujuk kepada contoh penyulitan java yang dihantar oleh pihak lain

    /**
     * 用公钥加密
     * @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);
    }

dan mendapati bahawa mereka Adalah perlu untuk melakukan operasi pemisahan pada rentetan untuk disulitkan, jadi versi diubah suai berikut tersedia:

/**
 * 公钥加密
  * @param string $data
  * @return null|string
 */
 public function publicEncrypt($data = &#39;&#39;)
 {
    if (!is_string($data)) {
        return null;
    }
    $dataLength = mb_strlen($data);
    $offet = 0;
    $length = 128;
    $i = 0;
    $string = &#39;&#39;;
    while ($dataLength - $offet > 0) {
        if ($dataLength - $offet > $length) {
            $str = mb_substr($data, $offet, $length);
        } else {
            $str = mb_substr($data, $offet, $dataLength - $offet);
        }
        $encrypted = &#39;&#39;;
        openssl_public_encrypt($str,$encrypted, $this->rsaPublicKey, OPENSSL_PKCS1_OAEP_PADDING);//这个OPENSSL_PKCS1_OAEP_PADDING是对方要求要用这种padding方式
        $string .= $encrypted;
        $i ++;
        $offet = $i * $length;
    }
    return base64_encode($string);
}

Pada masa ini, ujian tidak menemui sebarang masalah kegagalan penyulitan ~ Masalah diselesaikan

Disyorkan: " Tutorial video PHP

Atas ialah kandungan terperinci Rekod: Penyelesaian kepada kegagalan pemprosesan penyulitan PHP rsa. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:learnku.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam