作者:GRIROR格雷尔 | 来源:互联网 | 2023-05-17 12:29
rsa算法介绍
验证签名的几个算法
define ('OPENSSL_ALGO_SHA1', 1);
define ('OPENSSL_ALGO_MD5', 2);
define ('OPENSSL_ALGO_MD4', 3);
define ('OPENSSL_ALGO_MD2', 4);
define ('OPENSSL_ALGO_DSS1', 5);
define ('OPENSSL_ALGO_SHA224', 6);
define ('OPENSSL_ALGO_SHA256', 7);
define ('OPENSSL_ALGO_SHA384', 8);
define ('OPENSSL_ALGO_SHA512', 9);
define ('OPENSSL_ALGO_RMD160', 10);
Alipay支付接口的rsa加密解密函数:
protected function getSignContent($params) {
ksort($params);
$stringToBeSigned = "";
$i = 0;
foreach ($params as $k => $v) {
if (false === $this->checkEmpty($v) && "@" != substr($v, 0, 1)) {
// 转换成目标字符集
$v = $this->characet($v, $this->postCharset);
if ($i == 0) {
$stringToBeSigned .= "$k" . "=" . "$v";
} else {
$stringToBeSigned .= "&" . "$k" . "=" . "$v";
}
$i++;
}
}
unset ($k, $v);
return $stringToBeSigned;
}
/**
* 读取密钥,并生成rsa签名
* @param $data 签名数据
* @return string
* @throws AuthException
*/
protected function sign($data) {
if(isEmpty($this->rsaPrivateKeyFilePath)){
$priKey = $this->rsaPrivateKey;
$result = "-----BEGIN RSA PRIVATE KEY-----\n" .
wordwrap($priKey, 64, "\n", true) .
"\n-----END RSA PRIVATE KEY-----";
}else {
$priKey = file_get_contents($this->rsaPrivateKeyFilePath);
$result = openssl_get_privatekey($priKey);
}
if(!$result){
throw new AuthException(false, "您使用的私钥格式错误,请检查RSA私钥配置");
}
openssl_sign($data, $sign, $result);
if(!isEmpty($this->rsaPrivateKeyFilePath)){
openssl_free_key($result);
}
$sign = base64_encode($sign);
return $sign;
}
/*公钥验签操作*/
function verify($data, $sign, $rsaPublicKeyFilePath) {
if(isEmpty($this->alipayPublicKey)){
$pubKey= $this->alipayrsaPublicKey;
$res = "-----BEGIN PUBLIC KEY-----\n" .
wordwrap($pubKey, 64, "\n", true) .
"\n-----END PUBLIC KEY-----";
}else {
//读取公钥文件
$pubKey = file_get_contents($rsaPublicKeyFilePath);
//转换为openssl格式密钥
$res = openssl_get_publickey($pubKey);
}
($res) or die('支付宝RSA公钥错误。请检查公钥文件格式是否正确');
$result = (bool)openssl_verify($data, base64_decode($sign), $res);
if(!isEmpty($this->alipayPublicKey)) {
//释放资源
openssl_free_key($res);
}
return $result;
}
public function rsaEncrypt($data, $rsaPublicKeyPem, $charset) {
//读取公钥文件
$pubKey = file_get_contents($rsaPublicKeyPem);
//转换为openssl格式密钥
$res = openssl_get_publickey($pubKey);
$blocks = $this->splitCN($data, 0, 30, $charset);
$chrtext = null;
$encodes = array();
foreach ($blocks as $n => $block) {
if (!openssl_public_encrypt($block, $chrtext , $res)) {
echo "
" . openssl_error_string() . "
";
}
$encodes[] = $chrtext ;
}
$chrtext = implode(",", $encodes);
return $chrtext;
}
public function rsaDecrypt($data, $rsaPrivateKeyPem) {
//读取私钥文件
$priKey = file_get_contents($rsaPrivateKeyPem);
//转换为openssl格式密钥
$res = openssl_get_privatekey($priKey);
$decodes = explode(',', $data);
$strnull = "";
$dcyCOnt= "";
foreach ($decodes as $n => $decode) {
if (!openssl_private_decrypt($decode, $dcyCont, $res)) {
echo "
" . openssl_error_string() . "
";
}
$strnull .= $dcyCont;
}
return $strnull;
}
PHP版本的AES加密实现
/**
* AES加密解密类
* Class Encripty
*/
class AES{
/**
* 加密方法
* @param string $str
* @return string
*/
public function encrypt($str,$screct_key){
//AES, 128 模式加密数据 CBC
$screct_key = base64_decode($screct_key);
$str = trim($str);
$str = $this->addPKCS7Padding($str);
$iv = mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128,MCRYPT_MODE_CBC),1);
$encrypt_str = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $screct_key, $str, MCRYPT_MODE_CBC);
return base64_encode($encrypt_str);
}
/**
* 解密方法
* @param string $str
* @return string
*/
public function decrypt($str,$screct_key){
//AES, 128 模式加密数据 CBC
$str = base64_decode($str);
$screct_key = base64_decode($screct_key);
$iv = mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128,MCRYPT_MODE_CBC),1);
$encrypt_str = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $screct_key, $str, MCRYPT_MODE_CBC);
$encrypt_str = trim($encrypt_str);
$encrypt_str = $this->stripPKSC7Padding($encrypt_str);
return $encrypt_str;
}
/**
* 填充算法
* @param string $source
* @return string
*/
public function addPKCS7Padding($source){
$source = trim($source);
$block = mcrypt_get_block_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC);
$pad = $block - (strlen($source) % $block);
if ($pad <= $block) {
$char = chr($pad);
$source .= str_repeat($char, $pad);
}
return $source;
}
/**
* 移去填充算法
* @param string $source
* @return string
*/
public function stripPKSC7Padding($source){
$source = trim($source);
$char = substr($source, -1);
$num = ord($char);
if($num==62)return $source;
$source = substr($source,0,-$num);
return $source;
}
}