zoukankan      html  css  js  c++  java
  • 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-----",
                        // "
    ",
                        // "
    ",
                        // "
    "
                // ];
    
                // $private_key=str_replace($search,"",$private_key);
                // $private_key=$search[0] . PHP_EOL . wordwrap($private_key, 64, "
    ", 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-----",
                        // "
    ",
                        // "
    ",
                        // "
    "
                // ];
                // $public_key=str_replace($search,"",$public_key);
                // $public_key=$search[0] . PHP_EOL . wordwrap($public_key, 64, "
    ", 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
  • 相关阅读:
    Windows 8实用窍门系列:18.windows 8开发模拟器和windows 8程序中关联文件类型
    Silverlight实用窍门系列:75.Silverlight中DataGrid制作复杂表头
    Windows 8实用窍门系列:11.Windows 8 中的Toast Tile Badge通知
    Windows 8实用窍门系列:9.Windows 8中使用FlipView
    Windows 8实用窍门系列:12.windows 8的文件管理1.File创建和String Stream Buffer方式读写
    Silverlight实用窍门系列:74.Silverlight使用Perst数据库Demo
    Windows 8实用窍门系列:17.文件选择器 文件保存器 文件夹选择器
    Windows 8实用窍门系列:16.Windows 8的右键菜单
    Windows 8实用窍门系列:3.第一个拆分布局应用程序修改Logo
    Windows 8实用窍门系列:19.Windows 8中的GridView使用(一)
  • 原文地址:https://www.cnblogs.com/cuizhenyu/p/10498711.html
Copyright © 2011-2022 走看看