千家信息网

openssl RSA非对称加密、解密、签名、验签

发表于:2024-12-01 作者:千家信息网编辑
千家信息网最后更新 2024年12月01日,需要先了解的openssl系列函数openssl_pkey_get_private 从证书中解析获取私钥,以供使用。成功,返回真实的密钥资源标识符(Resource ID),否则返回falseopen
千家信息网最后更新 2024年12月01日openssl RSA非对称加密、解密、签名、验签

需要先了解的openssl系列函数

  • openssl_pkey_get_private 从证书中解析获取私钥,以供使用。成功,返回真实的密钥资源标识符(Resource ID),否则返回false
  • openssl_pkey_get_public 从证书中解析获取公钥,以供使用。成功,返回真实的密钥资源标识符(Resource ID),否则返回false
  • openssl_private_encrypt($data, $encrypted, $privateKeyResourceID, OPENSSL_PKCS1_PADDING)
  • //使用私钥key加密数据data并且将结果保存至变量crypted中
  • openssl_public_decrypt(base64_decode($encrypted), $decrypted, $publicKeyResourceID, OPENSSL_PKCS1_PADDING)
  • //私钥加密的内容通过公钥可用解密出来
getMessage());}
加密、解密系列
  • 公钥加密 openssl_public_encrypt,私钥解密 openssl_private_decrypt
  • 私钥加密 openssl_private_encrypt,公钥解密 openssl_public_decrypt
封装
checkFilePath($publicKeyPath);        $this->checkFilePath($privatePath);        $this->publicKeyContent = file_get_contents($publicKeyPath);        $this->privateKeyContent = file_get_contents($privatePath);        if (empty($this->publicKeyContent)) throw new \Exception('Public key is empty');        if (empty($this->privateKeyContent)) throw new \Exception('Private key is empty');        $this->publicKeyResourceID = !empty($this->publicKeyContent) ? openssl_pkey_get_public($this->getPublicKey()) : false;        $this->privateKeyresourceID = !empty($this->privateKeyContent) ? openssl_pkey_get_private($this->getPrivatekey()) : false;        if ($this->publicKeyResourceID === false) throw new \Exception('解析公钥内容失败');        if ($this->privateKeyresourceID === false) throw new \Exception('解析私钥内容失败');    }    /**     * 校验文件路径     * @param string $filePath     * @throws Exception     */    public function checkFilePath(string $filePath)    {        if (!is_file($filePath)) throw new \Exception($filePath . ' is not a regular file');        if (!file_exists($filePath)) throw new \Exception($filePath . ' is not exists');    }    //获取私有key字符串,重新格式化,为保证任何key都可以识别    public function getPrivatekey(): string    {        $search = [            "-----BEGIN RSA PRIVATE KEY-----",            "-----END RSA PRIVATE KEY-----",            "\n",            "\r",            "\r\n"        ];        $privateKey = str_replace($search, "", $this->privateKeyContent);        //打断字符串为指定数量的字串        return $search[0] . PHP_EOL . wordwrap($privateKey, 64, "\n", true) . PHP_EOL . $search[1];    }    /**     *     * 获取公共key字符串,重新格式化,为保证任何key都可以识别     */    public function getPublicKey()    {        $search = [            "-----BEGIN PUBLIC KEY-----",            "-----END PUBLIC KEY-----",            "\n",            "\r",            "\r\n"        ];        $publicKey = str_replace($search, "", $this->publicKeyContent);        //打断字符串为指定数量的字串        return $search[0] . PHP_EOL . wordwrap($publicKey, 64, "\n", true) . PHP_EOL . $search[1];    }    public function createKey()    {        $result = openssl_pkey_new();// 生成一个新的私钥和公钥对,        if ($result === false) return false;        openssl_pkey_export($result, $privateKey);//将key当作PEM编码字符串导出并且将之保存到$privateKey(通过引用传递的)中。        $publicKey = openssl_pkey_get_details($result);//返回包含密钥详情的数组        return array('public_key' => $publicKey["key"], 'private_key' => $this->getPrivatekey());    }    //使用私钥加密    public function encryptByPrivateKey(string $data): string    {        openssl_private_encrypt($data, $output, $this->privateKeyresourceID);        return base64_encode($output);    }    //使用公钥解密    public function decryptByPublicKey(string $data): string    {        openssl_public_decrypt(base64_decode($data), $output, $this->publicKeyResourceID);        return $output;    }    //使用公钥加密    public function encryptByPublicKey(string $data): string    {        openssl_public_encrypt($data, $output, $this->publicKeyResourceID);        return base64_encode($output);    }    //使用私钥解密    public function decryptByPrivateKey(string $data): string    {        openssl_private_decrypt(base64_decode($data), $output, $this->privateKeyresourceID);        return $output;    }    //生成签名    public function generateSignature(string $data, int $signType = OPENSSL_ALGO_SHA1): string    {        openssl_sign($data, $outSignature, $this->privateKeyresourceID, $signType);//Generate signature        return base64_encode($outSignature);    }    //校验签名 OPENSSL_ALGO_SHA256为RSA2    public function checkSignature(string $originalData, string $signature, int $signType = OPENSSL_ALGO_SHA1): bool    {        //如果签名正确返回 1, 签名错误返回 0, 内部发生错误则返回-1        $result = openssl_verify($originalData, base64_decode($signature), $this->publicKeyResourceID, $signType);        return $result == 1;    }    public function __destruct()    {        openssl_free_key($this->publicKeyResourceID);        openssl_free_key($this->privateKeyresourceID);    }}$rsaObj = new RSA('/home/zrj/.ssh/rsa_public.key', '/home/zrj/.ssh/rsa_private.key');$str = 'Hello world';echo '原始数据:' . $str . PHP_EOL;echo '公钥加密私钥解密如下:' . PHP_EOL;$tmpstr = $rsaObj->encryptByPublicKey($str); //用公钥加密echo '加密后的数据:' . PHP_EOL;echo $tmpstr . PHP_EOL;$tmpstr = $rsaObj->decryptByPrivateKey($tmpstr); //用私钥解密echo '解密结果:' . $tmpstr . PHP_EOL;echo PHP_EOL;echo PHP_EOL;echo '私钥加密公钥解密如下:' . PHP_EOL;$tmpstr = $rsaObj->encryptByPrivateKey($str); //用私钥加密echo '私钥加密后的数据:' . PHP_EOL;echo $tmpstr . PHP_EOL;$tmpstr = $rsaObj->decryptByPublicKey($tmpstr); //用公钥解密echo '公钥解密结果:' . $tmpstr . PHP_EOL;echo PHP_EOL;echo PHP_EOL;$signature = $rsaObj->generateSignature($tmpstr);echo '签名结果为:' . $signature . PHP_EOL;var_dump($rsaObj->checkSignature($tmpstr, $signature));
加密 公钥 字符 字符串 数据 结果 内容 密钥 成功 数量 标识 标识符 格式 证书 资源 错误 保证 生成 原始 函数 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 任务发布数据库设计 在国外艾尔登法环连不上服务器 ug刀具数据库部件材料 青岛海浪软件开发 湖南长沙互联网服务器虚拟主机 引入网络安全专业人才 好的软件开发公司都是怎么考核的 数据库int设置范围内 amax服务器开机后黑屏 openvz服务器加速 网络安全 拓扑 杭州超事通网络技术有限公司 加强网络安全管理的有效措施 组织学生收看网络安全主题党日 太仓正规网络技术哪家便宜 软件开发突击队 门头沟区推广软件开发热线 采购系统管理软件开发价格 沃特森 网络安全 国家网络安全和信息化是 软件开发绩效评价自我描述 郑州恒普网络技术有限公司 成都智能设备软件开发 厦门 互联网与生活科技 金融机构系统软件开发 数据库怎么连接网站数据 江西机电软件开发公司 桓台食品软件开发价格 超微服务器进不去pxe 电脑连接数据库失败未指定的错误
0