php中的公钥和私钥

本文详细介绍了RSA非对称加密算法的基本概念,包括公钥和私钥的作用、使用场景及其实现原理。并通过PHP示例代码展示了公钥加密、私钥解密以及数字签名的具体实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近公司业务需要用到公钥和私钥,之前接触的很少,不是很了解,刚刚上网了解了下.发现很多地方都要用到加密.有对称加密算法( DES,AES)*[加密和解密都使用一个密钥]*和不对称加密算法(RSA).这里说的是RSA(非对称加密算法). RSA就涉及到公钥和私钥.

要记住的就是:公钥加密,私钥解密.私钥加密,公钥解密. ##RSA加密:## SHA-1(杀one)中的RSA算法核心特点:有一个公钥,有一个私钥,二者是一套,且每一套都是独一无二的.再无第二套一模一样的. 公钥可以随便给人,但私钥确是不可外传的. 公钥私钥都可以进行加密解密,哪个加的密,就必须用这一套的另外一个钥进行解密.钥的加密实际就是一个规则 ###什么是公钥加密?### 假设一下,两个字母,一个是a,一个是b。我喜欢b这个数字,就保留起来,不告诉你们(私钥),然后我告诉大家,a是我的公钥。 我有一个文件,不能让别人看,我就用1加密了。别人找到了这个文件,但是他不知道b就是解密的私钥啊,所以他解不开,只有我可以用 数字b,就是我的私钥,来解密。这样我就可以保护数据了。 某人用我的公钥a加密了字符hello,加密后成了xxxxx,放在网上。别人偷到了这个文件,但是别人解不开,因为别人不知道b就是我的私钥, 只有我才能解密,解密后就得到hello。这样,我们就可以传送加密的数据了。 ###私钥签名### 如果我用私钥加密一段数据(当然只有我可以用私钥加密,因为只有我知道b是我的私钥),结果所有的人都看到我的内容了,因为他们都知道我的公钥是a,那么这种加密有什么用处呢? 某人说有人冒充我给他发信。怎么办呢?我把我要发的信,内容是c,用我的私钥b,加密,加密后的内容是d,发给某人,再告诉他解密看是不是c。他用我的公钥a解密,发现果然是c。这个时候,他会想到,能够用我的公钥解密的数据,必然是用我的私钥加的密。只有我知道我得私钥,因此他就可以确认确实是我发的东西。这样我们就能确认发送方身份了。这个过程叫做数字签名。当然具体的过程要稍微复杂一些。用私钥来加密数据,用途就是数字签名。 公钥和私钥是成对的,它们互相解密。 公钥加密,私钥解密。 私钥数字签名,公钥验证。

下面贴上php中使用公钥私钥加密解密的代码以及其中需要注意的地方: 首先公钥和私钥存放的方式有文件和字符串的形式.不过作为小白要注意的是,公钥私钥无论是放在文件中还是字符串里面,千万要记得分行.我刚开始一直不分行,然后就是老是出错,后来才知道要分行.而且不要忘了前后的注释行.-----BEGIN PUBLIC KEY----- 下面这段是错误的

-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADxdfxfgcghCBiQKBgQCIgm80UzfD9lQ/tnASRCapNNaoTcodUfDzNYLWAxEMp8EtWkD4eZmWbMdaWKyShIOGS48NKdVGsAB+F4usW1VFtrbqOfKgBUxMJKz1YcciBiV3kvhHZI4/jq94E0qy1jxTNdralRhe+0/JklopEM9QWZScpBT4IXBfbMJ3JD5doQIDAQAB
-----END PUBLIC KEY-----
复制代码

这段代码形式才是正确的

-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCIgm80UzfD9lQ/tnASRCapNNao
TcodUfDzNYLWAxEMp8EtWkD4eZmWbMdaWKyShIOGS48NKdVGsAB+F4usW1VFtrbq
OfKgBUxMJKz1YcciBiV3kvhHZI4/jq94E0qy1jxTNdralRhe+0/JklopEM9QWZSc
pBT4IXBfbMJ3JD5doQIDAQAB
-----END PUBLIC KEY-----
复制代码

解决的公钥私钥的存放,然后就是代码中需要用到的加密解密了,加签解签了.其中用到的函数可以直接在php手册加密中查看http://php.net/manual/zh/refs.crypto.php 首先是公钥加密:这里用到的函数是openssl_public_encrypt(http://php.net/manual/zh/function.openssl-public-encrypt.php)

public function encrypt($data,$key_path){   
 $key = file_get_contents($key_path);
    $encryptedList = array();
    $step          = 117; 
    $encryptedData = ''; 
    $len = strlen($data); 
    for ($i = 0; $i < $len; $i += $step) {        
       $tmpData   = substr($data, $i, $step); 
       $encrypted = '';
        openssl_public_encrypt($tmpData, $encrypted, $key,OPENSSL_PKCS1_PADDING); 
       $encryptedList[] = ($encrypted);
    }    
     $encryptedData = base64_encode(join('', $encryptedList));
    return $encryptedData;
}
复制代码

用私钥解密(用到的函数openssl_private_decrypt)

 private function decrypt($encryptedData){
        if (empty($encryptedData)) {
            return '';
        }
        $encryptedData = base64_decode($encryptedData);
        $decryptedList = array();
        $step          = 128;
        $len = strlen($encryptedData);
        for ($i = 0; $i < $len; $i += $step) {
            $data      = substr($encryptedData, $i, $step);
            $decrypted = '';
            openssl_private_decrypt($data, $decrypted, file_get_contents($this->_key_pri), OPENSSL_PKCS1_PADDING);
            $decryptedList[] = $decrypted;
        }
        return join('', $decryptedList);
复制代码

用私钥加签,用到的函数(openssl_get_privatekey)

 private function rsa_sign($data){
        //私钥加签
        $res = openssl_get_privatekey(file_get_contents($this->_key_priva_mime));
        openssl_sign($data, $sign, $res, OPENSSL_ALGO_SHA1);
        openssl_free_key($res);
        $sign = base64_encode($sign);
        return $sign;
复制代码

公钥验签(openssl_get_publickey)

private function _rsaCheckSign($data, $sign){
        $pubKey = file_get_contents($this->_key_pub_mime);
	    $res = openssl_get_publickey($pubKey);
	    $result = (bool)openssl_verify($data, base64_decode($sign), $res);
	    openssl_free_key($res);    
	    return $result;
    }
复制代码

ps:如果是文件形式的公私钥,需要使用file_get_contents,括号中可以是地址.

### 支付宝 App 公钥私钥的生成、配置及使用说明 #### 一、公钥私钥的作用 在支付宝集成过程中,为了保障交易的安全性数据传输的真实性,采用非对称加密算法(如 RSA 或者 RSA2),其中涉及到一对密钥:公钥私钥。应用私钥用于对请求内容进行签名;而支付宝公钥则用来验证来自支付宝服务器响应消息的真实有效性。 #### 二、获取AppId及相关密钥 对于想要接入支付宝服务的应用来说,在开始之前需要先注册成为开发者并创建相应的应用程序来获得唯一的标识符即APPID。之后通过访问开放平台页面下的【密钥管理】选项卡找到对应的【开放平台密钥】部分即可看到所拥有的APPID以及其他必要的安全凭证信息[^2]。 #### 三、生成RSA/RSA2类型的密钥对 当进入沙箱环境后,可以通过如下路径完成自定义密钥设置操作:依次点击“沙箱应用”,接着选择“网页&移动应用”,最后到达“自定义密钥”。在这里可以选择适合版本的加密标准(推荐使用更安全强度更高的RSA2),系统将会自动为你生成一组新的密钥对供后续开发测试阶段调用[^3]。 #### 四、配置公钥证书方式的具体步骤 按照官方文档指导,如果打算采取基于公钥证书的方式来进行身份认证,则除了常规意义上的四个要素外还需要额外准备两个文件——应用自身的公钥证书以及支付宝提供的根CA证书。具体而言: - 将上述提到的所有必要组件妥善保存至项目工程内部合适位置; - 修改源码里涉及网络通信逻辑的地方使之能够正确加载本地存储好的这些资源,并确保每次发起API调用前都已成功附加了必需的身份证明材料(app_cert_sn, alipay_root_cert_sn),因为默认情况下PHP SDK并不支持此特性所以可能要自行调整相关类库实现[^1]。 ```php // 示例代码片段展示如何向请求头添加所需参数 $params[&#39;app_cert_sn&#39;] = &#39;your_app_certificate_serial_number&#39;; $params[&#39;alipay_root_cert_sn&#39;] = &#39;root_ca_certificate_serial_number&#39;; // 假设这是执行远程HTTP POST请求函数的一部分... $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $gatewayUrl); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($params)); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值