<?php

//生成公钥 私钥
/**
 * 用 OpenSSL, Linux 上自带,常用命令如下:

-- 生成 RSA 私钥(传统格式的)

openssl genrsa -out rsa_private_key.pem 1024

-- 将传统格式的私钥转换成 PKCS#8 格式的(JAVA需要使用的私钥需要经过PKCS#8编码,PHP程序不需要,可以直接略过)

openssl pkcs8 -topk8 -inform PEM -in rsa_private_key.pem -outform PEM -nocrypt

-- 生成 RSA 公钥

openssl rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem
 */
$str = json_encode([
    'a'=>1,
    'b'=>2,
    'c'=>3,
]);


$keyPath = __DIR__.'/key';



$publicKey = openssl_pkey_get_public(file_get_contents($keyPath.'/rsa_public_key.pem'));//获取公钥
$privateKey = openssl_pkey_get_private(file_get_contents($keyPath.'/rsa_private_key.pem'));//获取私钥

// var_dump($publicKey).'<br />';
// var_dump($privateKey);

//公钥签名  私钥验签
openssl_sign($str,$sign,$privateKey);
$sign = base64_encode($sign);

//验签通过
openssl_verify($str,base64_decode($sign),$publicKey);


//公钥加密
openssl_public_encrypt($str,$data,$publicKey);
$data = base64_encode($data);
//私钥解密
openssl_private_decrypt(base64_decode($data),$deData,$privateKey);
echo $deData;//{"a":1,"b":2,"c":3}

//私钥加密
openssl_private_encrypt($str,$data,$privateKey);
$data = base64_encode($data);

//公钥解密
openssl_public_decrypt(base64_decode($data),$deData,$publicKey);

echo $deData;//{"a":1,"b":2,"c":3}


/**
 * 总结:
 * 公钥和私钥本是一对,加密解密没有固定顺序,加密用公钥,那解密必然是用私钥,可以理解为两者都是对方解密的钥匙
 * 签名的话只能用私钥生成签名,公钥来验签
 */

 /**
  * 摘抄一段支付宝论坛关于公私钥的解答:
  阿里云  >  教程中心   >  android教程  >  关于支付宝的公钥与私钥  
关于支付宝的公钥与私钥
发布时间:2018-01-18 来源:网络 上传者:用户

关键字: 公钥 支付 关于 宝的

发表文章
摘要:以下只讲原理,不讲实际操作加密技术支付宝支付时,通讯信息的加密算法使用的是非对称加密算法,意思钥匙有两把,其中一把对数据进行加密后,需要使用另外一把钥匙才能将其解密,也就是公钥(publickey)和私钥(privatekey)。私钥自己保存,切勿被别人知道,公钥是公开的,给人知道也没关系。商户的公钥与私钥,用于发起支付商户使用支付宝官方指导文档的openssl工具在本地生成的公钥和私钥,然后将生成的公钥上传到支付宝商家后台,支付时,我们使用该私钥对订单信息加密,支付宝服务端

以下只讲原理,不讲实际操作


加密技术
支付宝支付时,通讯信息的加密算法使用的是非对称加密算法,意思钥匙有两把,其中一把对数据进行加密后,需要使用另外一把钥匙才能将其解密,也就是公钥(public key)和私钥(private key)。私钥自己保存,切勿被别人知道,公钥是公开的,给人知道也没关系。


商户的公钥与私钥,用于发起支付
商户使用支付宝官方指导文档的openssl工具在本地生成的公钥和私钥,然后将生成的公钥上传到支付宝商家后台,支付时,我们使用该私钥对订单信息加密,支付宝服务端收到该加密信息后会拿商户后台上传的公钥对该信息进行解密。


支付宝的公钥与私钥,用于回调
支付宝有个公开的公钥,所有的商户使用的支付宝公钥都是同一个。支付成功或失败后,支付宝服务端要回调告诉我们支付结果,会拿私钥对该回调信息进行加密,我们收到该信息要拿支付宝的公钥进行解密。
  */

 

posted on 2018-09-09 12:45  沉默的土豆  阅读(249)  评论(0编辑  收藏  举报