Rekod: Penyelesaian kepada kegagalan pemprosesan penyulitan PHP rsa

藏色散人
Lepaskan: 2023-04-10 21:22:02
ke hadapan
4880 orang telah melayarinya

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;
    }
Salin selepas log masuk

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;
}
Salin selepas log masuk

Atur cara mencetak:

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

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);
    }
Salin selepas log masuk

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);
}
Salin selepas log masuk

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!

Label berkaitan:
sumber:learnku.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan