php Rsa簽名算法


一:加簽驗簽

class RsaController extends Controller{
    
    /**
     * RSA簽名
     * @param $data 待簽名數據
     * @param $private_key 私鑰字符串
     * return 簽名結果
     */
    public function rsaSign($data, $private_key) {
            
            // $search = [
                    // "-----BEGIN RSA PRIVATE KEY-----",
                    // "-----END RSA PRIVATE KEY-----",
                    // "\n",
                    // "\r",
                    // "\r\n"
            // ];

            // $private_key=str_replace($search,"",$private_key);
            // $private_key=$search[0] . PHP_EOL . wordwrap($private_key, 64, "\n", true) . PHP_EOL . $search[1];
            $res=openssl_get_privatekey($private_key);

            if($res)
            {
                    openssl_sign($data, $sign,$res);
                    openssl_free_key($res);
            }else {
                    exit("私鑰格式有誤");
            }
            $sign = base64_encode($sign);
            return $sign;
    }

    /**
     * RSA驗簽
     * @param $data 待簽名數據
     * @param $public_key 公鑰字符串
     * @param $sign 要校對的的簽名結果
     * return 驗證結果
     */
    public function rsaCheck($data, $public_key, $sign)  {
            // $search = [
                    // "-----BEGIN PUBLIC KEY-----",
                    // "-----END PUBLIC KEY-----",
                    // "\n",
                    // "\r",
                    // "\r\n"
            // ];
            // $public_key=str_replace($search,"",$public_key);
            // $public_key=$search[0] . PHP_EOL . wordwrap($public_key, 64, "\n", true) . PHP_EOL . $search[1];
            $res=openssl_get_publickey($public_key);
            if($res)
            {
                    $result = (bool)openssl_verify($data, base64_decode($sign), $res);
                    openssl_free_key($res);
            }else{
                    exit("公鑰格式有誤!");
            }
            return $result;
    }    
}
View Code

二:加簽驗簽

$data為加簽數據

Rsa SHA256 加簽:

//Rsa SHA256
     $priKey = file_get_contents(__DIR__.'/file.pem');
     $privKeyId = openssl_pkey_get_private($priKey);
     $signature = '';
     $algo = "SHA256";
     openssl_sign($data, $signature, $privKeyId, $algo);
     openssl_free_key($privKeyId);
     $bs =  base64_encode($signature);
View Code

Rsa SHA1  or  Rsa 加簽:

//Rsa SHA1 or Rsa
     $priKey = file_get_contents(__DIR__.'/file.pem');
     $privKeyId = openssl_pkey_get_private($priKey);
     $signature = '';
     openssl_sign($data, $signature, $privKeyId);
     openssl_free_key($privKeyId);
     $bs =  base64_encode($signature);
View Code

 

$r = curl($url, "POST", $data, $bs);

驗簽:

/**
     *驗簽
     * @param $data 待驗簽數據
     * @param $sign 簽名字符串(之前簽名生成的$bs)
     * @param $pubKey 公鑰字符串
     * @return bool
     */
    $pubKey = file_get_contents(__DIR__.'/pub.key'); //讀取公鑰   
    $pKey = checkSign($pubKey,$sign ,$data);
    function checkSign($pubKey,$sign,$toSign){
        $publicKeyId = openssl_pkey_get_public($pubKey);
        $result = openssl_verify($toSign, base64_decode($sign), $publicKeyId);
        openssl_free_key($publicKeyId);
        return $result === 1 ? true : false;
    }
View Code

 三:加密解密,解決長度超出返回false問題

$encrypt_data = encrypt($data,$public_key);
$decrypt_data = decrypt($encrypt_data,$private_key);
// 公鑰加密數據
function encrypt($originalData,$pubkey){
    $crypto = '';
    foreach (str_split($originalData, 117) as $chunk) {
        openssl_public_encrypt($chunk, $encryptData, $pubkey);
        $crypto .= $encryptData;
    }
    return base64_encode($crypto);
}

// 公鑰解密數據
function decrypt($encryptData,$privkey){
    $crypto = '';
    foreach (str_split(base64_decode($encryptData), 128) as $chunk) {
        openssl_private_decrypt($chunk, $decryptData, $privkey);
        $crypto .= $decryptData;
    }
    return $crypto;
}
View Code

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM