PHP RSA签名(公钥、私钥)

1、公钥、私钥格式化(加上前后戳、每64位进行换行)

/**********************************私钥格式化*************************************/

 1 function formatPriKey($priKey) {
 2     $fKey = "-----BEGIN PRIVATE KEY-----\n";
 3     $len = strlen($priKey);
 4     for($i = 0; $i < $len; ) {
 5         $fKey = $fKey . substr($priKey, $i, 64) . "\n";
 6         $i += 64;
 7     }
 8     $fKey .= "-----END PRIVATE KEY-----";
 9     return $fKey;
10 }

/**********************************公钥格式化*************************************/

 1 function formatPubKey($pubKey) {
 2     $fKey = "-----BEGIN PUBLIC KEY-----\n";
 3     $len = strlen($pubKey);
 4     for($i = 0; $i < $len; ) {
 5         $fKey = $fKey . substr($pubKey, $i, 64) . "\n";
 6         $i += 64;
 7     }
 8     $fKey .= "-----END PUBLIC KEY-----";
 9     return $fKey;
10 }

2、私钥签名、公钥验签

/**********************************私钥签名*************************************/

 1 /**
 2  * 生成签名
 3  * @param    string     $signString 待签名字符串
 4  * @param    [type]     $priKey     私钥
 5  * @return   string     base64结果值
 6  */
 7 function getSign($signString,$priKey){
 8     $privKeyId = openssl_pkey_get_private($priKey);
 9     $signature = ‘‘;
10     openssl_sign($signString, $signature, $privKeyId);
11     openssl_free_key($privKeyId);
12     return base64_encode($signature);
13 }

/**********************************公钥验签*************************************/

 1 /**
 2  * 校验签名
 3  * @param    string     $pubKey 公钥
 4  * @param    string     $sign   签名
 5  * @param    string     $toSign 待签名字符串
 6  * @param    string     $signature_alg 签名方式 比如 sha1WithRSAEncryption 或者sha512
 7  * @return   bool
 8  */
 9 function checkSign($pubKey,$sign,$toSign,$signature_alg=OPENSSL_ALGO_SHA1){
10     $publicKeyId = openssl_pkey_get_public($pubKey);
11     $result = openssl_verify($toSign, base64_decode($sign), $publicKeyId,$signature_alg);
12     openssl_free_key($publicKeyId);
13     return $result === 1 ? true : false;
14 }

3、公钥加密、私钥解密

/**********************************公钥加密*************************************/

 1 /**
 2  *公钥加密
 3   *@param    string     $sign_str   待加密字符串
 4   *@param    string     $public_key  公钥
 5   *@param    string     $signature_alg 加密方式
 6   *@return    string
 7 */
 8  function get_public_sign($sign_str,$public_key,$signature_alg=OPENSSL_ALGO_SHA1){
 9      $public_key = openssl_pkey_get_public($public_key);//加载密钥
10      openssl_sign($sign_str,$signature,$public_key,$signature_alg);//生成签名
11     $signature = base64_encode($signature);
12     openssl_free_key($public);
13     return $signature;
14  }

/**********************************私钥解密**************************************/

 1  /**
 2   *私钥解密
 3   *@param    string     $sign_str   待加密字符串
 4   *@param    string     $sign sign
 5   *@param    string     $private_key 私钥
 6   *@param    string     $signature_alg 加密方式
 7   *@return     bool
 8 */
 9
10  function private_verify($sign_str,$sign,$private_key,$signature_alg=OPENSSL_ALGO_SHA1){
11     $private_key = openssl_get_privatekey($private_key);
12     $verify = openssl_verify($sign_str, base64_decode($sign), $private_key, $signature_alg);
13     openssl_free_key($private_key);
14     return $verify==1;//false or true
15 }

示例代码如下(私钥签名公钥验签):

<?php

$pubKey = ‘-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDr6H/ictALLsV9/63lPFSYDPQK
gRwEM2FiewfR/BYaPGfpgdl8lelNYqFxnqBRKbGnbFOwOxOu7oiiPYaJxcSU94hI
d3S0/UsSXyRfTaHT8ZZv+5luikQAG62hwkxqcSdL3aEMbqsHRfQ9RXiFAneiJJwZ
1D0nHPANfBA4UN+OXQIDAQAB
-----END PUBLIC KEY-----‘;

$priKey = ‘-----BEGIN PRIVATE KEY-----
MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAOvof+Jy0AsuxX3/
reU8VJgM9AqBHAQzYWJ7B9H8Fho8Z+mB2XyV6U1ioXGeoFEpsadsU7A7E67uiKI9
honFxJT3iEh3dLT9SxJfJF9NodPxlm/7mW6KRAAbraHCTGpxJ0vdoQxuqwdF9D1F
eIUCd6IknBnUPScc8A18EDhQ345dAgMBAAECgYEAoNlVIQShn45TcBa97dhV4Zqr
ZuIjRSX3V5uFeIKGW3smastzjAP3ICGI7Jx4uP5RuFMfOMD/Kb5QgTasHhIvdwe0
kuMdUqd8YCLgZaV1u02GWkp5I7bG2HRKAqfrpaExeOJt3Iqmggt208P3BNQLTOa2
NFtNqT+onI1dGwbC120CQQD2BbkrXPv+wGAKkcqIK77Bkrwpg7Iqj91uyVHBAleW
AgfWDFA3rJb8jDCARHte2ehMImmhbsQmVBjdI1DNdYWLAkEA9XnEoVVIL5IA09s0
XtL/Na065loDTJsQZiumdi6VMn6zWafu6GFhS0w5DQdkjtA7qhwpftjVRaWtK0DX
4qpItwJAKxGrbfT0RI/HAHKvYxFNbrPSbu4YNa1D1Y422rQfQyqN1qIHNQfo0sN0
BjB27I73RMTNey5Z9l/IjoYNMjq9qwJABChZ0jm1jUi1xuDRlEGSnQAgHUKtB6Eg
t/pJSXskf8RxmTUk8L6lfTb/SF81rs2MFSeA9GsLwbA6rJ7eiTJFJQJBAJnixcdp
F6knRxyOUDhWoa8uYmnUdcyrfo4dnNyliJbNTTSw0LJAGZsCbo9EDqQIxDrqDa9X
qj0yz6UT1JM37Tk=
-----END PRIVATE KEY-----‘;

//$priKey = formatPriKey($priKey);
//$pubKey = formatPubKey($pubKey);
$params = [
    "merchant_id"=>"1",
    "uid"=>"2122334455",
    "out_trade_id"=>"13423423423",
    "amount"=>"88",
    "subject"=>"活动红包"
];

//获取预处理字符串
$signString = getSignString($params);
//预处理字符串为
//amount=88&merchant_id=1&out_trade_id=13423423423&subject=活动红包&uid=2122334455

//获取签名
$sign = getSign($signString,$priKey);

//生成的签名为
//k8DMuhe+q9rDVDgzAk8lFQEE+tZAahXLiZWExmiYl83vJpZlnKTBghLd1DM8itNzw3JYGhxR8ueHCIkkGyVh0BiPuKYmXFyrCwLVif9sMWCu2DFoEDFARZClDRCfE5rV+IDmumCBfVyxFY/uW/DIMS7AO7GlrydW5aVZ6xYKtBw=

//验证签名
$res = checkSign($pubKey,$sign,$signString);
var_dump($res);//结果为 true

/**
 * 生成签名
 * @param    string     $signString 待签名字符串
 * @param    [type]     $priKey     私钥
 * @return   string     base64结果值
 */
function getSign($signString,$priKey){
    $privKeyId = openssl_pkey_get_private($priKey);
    $signature = ‘‘;
    openssl_sign($signString, $signature, $privKeyId);
    openssl_free_key($privKeyId);
    return base64_encode($signature);
}

/**
 * 校验签名
 * @param    string     $pubKey 公钥
 * @param    string     $sign   签名
 * @param    string     $toSign 待签名字符串
 * @param    string     $signature_alg 签名方式 比如 sha1WithRSAEncryption 或者sha512
 * @return   bool
 */
function checkSign($pubKey,$sign,$toSign,$signature_alg=OPENSSL_ALGO_SHA1){
    $publicKeyId = openssl_pkey_get_public($pubKey);
    $result = openssl_verify($toSign, base64_decode($sign), $publicKeyId,$signature_alg);
    openssl_free_key($publicKeyId);
    return $result === 1 ? true : false;
}

/**
 * 获取待签名字符串
 * @param    array     $params 参数数组
 * @return   string
 */
function getSignString($params){
    unset($params[‘sign‘]);
    ksort($params);
    reset($params);

    $pairs = array();
    foreach ($params as $k => $v) {
        if(!empty($v)){
            $pairs[] = "$k=$v";
        }
    }

    return implode(‘&‘, $pairs);
}

/**
 * 格式化私钥
 */
function formatPriKey($priKey) {
    $fKey = "-----BEGIN PRIVATE KEY-----\n";
    $len = strlen($priKey);
    for($i = 0; $i < $len; ) {
        $fKey = $fKey . substr($priKey, $i, 64) . "\n";
        $i += 64;
    }
    $fKey .= "-----END PRIVATE KEY-----";
    return $fKey;
}

/**
 * 格式化公钥
 */
function formatPubKey($pubKey) {
    $fKey = "-----BEGIN PUBLIC KEY-----\n";
    $len = strlen($pubKey);
    for($i = 0; $i < $len; ) {
        $fKey = $fKey . substr($pubKey, $i, 64) . "\n";
        $i += 64;
    }
    $fKey .= "-----END PUBLIC KEY-----";
    return $fKey;
}
?>

原文地址:https://www.cnblogs.com/changning0822/p/9964258.html

时间: 2024-10-16 18:44:56

PHP RSA签名(公钥、私钥)的相关文章

java RSA 生成公钥私钥

/** * 引进的包都是Java自带的jar包 * 秘钥相关包 * base64 编解码 * 这里只用到了编码 */ import java.security.Key; import java.security.KeyPair; import java.security.KeyPairGenerator; import java.security.interfaces.RSAPrivateKey; import java.security.interfaces.RSAPublicKey; imp

RSA公钥加密—私钥解密&amp;私钥加密—公钥解密&amp;私钥签名—公钥验证签名

关于RSA算法,前面有介绍,点击打开链接. 这里直接有实现. 代码太多就不直接贴了,免积分下载. http://download.csdn.net/detail/acmjk/7310847 RSA公钥加密-私钥解密&私钥加密-公钥解密&私钥签名-公钥验证签名,布布扣,bubuko.com

OpenSSL与公钥私钥证书签名的千丝万缕

导语 人对任何事物的认识都是阶段性的,从无知到知晓,从懵懂到半知半解,从误解到将信将疑,从晕头转向到下定决心吃透. 介绍 OpenSSL是一个强大的命令行工具,它可以用来处理许多种跟PKI(Public Key Infrastructure)即:公钥基础建设.HTTPS(HTTP以及TLS)等相关的技术.这篇提纲挈领式的随笔文章可以提供快速的OpenSSL相关技术的命令咨询,这对于IT软件开发技术人员的日常工作来说非常的有必要. 这里主要包含了OpenSSL的一些例子,有:如何生成私钥(priv

Android 获取签名公钥 和 公钥私钥加解密

public class GetPublicKey { /** * 获取签名公钥 * @param mContext * @return */ protected static String getSignInfo(Context mContext) { String signcode = ""; try { PackageInfo packageInfo = mContext.getPackageManager().getPackageInfo( GetAppInfo.getPack

C# RSA加密、解密、加签、验签、支持JAVA格式公钥私钥、PEM格式公钥私钥、.NET格式公钥私钥 -变态模式【支持私钥加密,公钥解密】(二)

RSA变态模式:[私钥加密,公钥解密] 一般这种写法都是JAVA弄的..NET原生不支持.为啥,我也不清楚,大概是因为安全性问题吧,毕竟公钥是人人都可是持有的.私钥只有自己拥有. 对接注意事项:https://www.cnblogs.com/kevin860/p/9557845.html 一般方法请看:https://www.cnblogs.com/kevin860/p/9557845.html 签名一直都是[私钥加签.公钥验签]只为证明该消息是你发出来的. 这里使用了BouncyCastle1

RSA不对称加密和公钥 私钥

理论上只要有加密的规则 基本都是可以解密的 但是如果解密需要消耗的时间过长 比如1000年 解密过后已经没什么意义了 此时可认为这种算法不能被破解 也就是说此加密可信 MD5 是一种单向操作 加密后不能被还原 只能用于信息校验(相同的输入md5后的字符是相同的<_>) RSA 私钥 公钥 加密算法 是一种可以还原数据原型的算法  公钥加密的东西  只能用私钥解出来 即使公钥自身也解不出来  同理私钥加密的东西也只有公钥能解密出来  自身也解不出来 .所以二者是对等的 相互依赖的. 但是加入我们

Delphi RSA加解密【 (RSA公钥加密,私钥解密)、(RSA私钥加密,公钥解密)、MD5加密、SHA加密】

作者QQ:(648437169) delphi RSA加解密 [Delphi RSA加解密]支持 (RSA公钥加密,私钥解密).(RSA私钥加密,公钥解密).MD5加密.SHA1加密.SHA224加密.SHA256加密.SHA384加密.SHA512加密 原文地址:https://www.cnblogs.com/zhimamaigua/p/11003504.html

.net core中使用openssl的公钥私钥进行加解密

这篇博文分享的是 C#中使用OpenSSL的公钥加密/私钥解密 一文中的解决方法在 .net core 中的改进.之前的博文针对的是 .NET Framework ,加解密用的是 RSACryptoServiceProvider .虽然在 corefx(.NET Core Framework) 中也有 RSACryptoServiceProvider ,但它目前只支持 Windows ,不能跨平台. 之前的 new RSACryptoServiceProvider(); 代码在 mac 上运行,

RSA加密解密及RSA签名和验证

原文:RSA加密解密及RSA签名和验证 1.RSA加密解密: (1)获取密钥,这里是产生密钥,实际应用中可以从各种存储介质上读取密钥 (2)加密 (3)解密2.RSA签名和验证 (1)获取密钥,这里是产生密钥,实际应用中可以从各种存储介质上读取密钥 (2)获取待签名的Hash码 (3)获取签名的字符串 (4)验证 3.公钥与私钥的理解: (1)私钥用来进行解密和签名,是给自己用的. (2)公钥由本人公开,用于加密和验证签名,是给别人用的.   (3)当该用户发送文件时,用私钥签名,别人用他给的公