常用的數據加密規則算法(php包含MD5和RSA)


1.字典排序,並進行md5加密(字段1=字段值&字段2=字段值再加上key)

/**
* @param $array 需要加密的數據
* @param $signKey 加密key
* @return string 加密的MD5結果
*/
function sign($array,$signKey){
ksort($array);//字典排序(升序排列)
$str="";//將結果組合成key1=value&key2=value&signkey格式
foreach ($array as $k=>$v) {
$str.=$k.'='.$v.'&';
}
$str = $str.$signKey;//加上signKey(如果需求是要求去掉&再加加密key的,可以使用php的函數substr去掉最后的一個&符號) return md5($str);}

 

2.rsa公鑰加密和解密、私鑰解密私鑰加密,簽名和驗證

/**
* 公匙加密
* @param unknown_type $sourcestr 加密字符串
* @param unknown_type $publickey 公鑰
*/
function publickey_encodeing($sourcestr, $publickey)
{
  //以下為了初始化公鑰,保證在您填寫公鑰時不管是帶格式還是不帶格式都可以通過驗證。
$publickey = str_replace("-----BEGIN PUBLIC KEY-----","",$publickey);
$publickey = str_replace("-----END PUBLIC KEY-----","",$publickey);
$publickey = str_replace("\n","",$publickey);
$publickey = '-----BEGIN PUBLIC KEY-----'.PHP_EOL.wordwrap($publickey, 64, "\n", true) .PHP_EOL.'-----END PUBLIC KEY-----';

$pubkeyid = openssl_get_publickey($publickey); // 生成密鑰資源id
if (openssl_public_encrypt($sourcestr, $crypttext, $pubkeyid, OPENSSL_PKCS1_PADDING)) //OPENSSL_PKCS1_PADDING采用RSA_PKCS1_PADDING填充模式
{
return $crypttext;
}
return FALSE;
}

/**
* 公匙解密
*/
function publickey_decodeing($crypttext, $publickey)
{
    //以下為了初始化公鑰,保證在您填寫公鑰時不管是帶格式還是不帶格式都可以通過驗證。
$publickey = str_replace("-----BEGIN PUBLIC KEY-----","",$publickey);
$publickey = str_replace("-----END PUBLIC KEY-----","",$publickey);
$publickey = str_replace("\n","",$publickey);
$publickey = '-----BEGIN PUBLIC KEY-----'.PHP_EOL.wordwrap($publickey, 64, "\n", true) .PHP_EOL.'-----END PUBLIC KEY-----';

$pubkeyid = openssl_get_publickey($publickey); // 生成密鑰資源id
if (openssl_public_decrypt($crypttext, $sourcestr, $pubkeyid, OPENSSL_PKCS1_PADDING)) //OPENSSL_PKCS1_PADDING采用RSA_PKCS1_PADDING填充模式
{
return $sourcestr;
}
return FALSE;
}
/**
* 私匙解密
*/
function privatekey_decodeing($crypttext, $privatekey)
{
//以下為了初始化私鑰,保證在您填寫私鑰時不管是帶格式還是不帶格式都可以通過驗證。
$privatekey=str_replace("-----BEGIN RSA PRIVATE KEY-----","",$privatekey);
$privatekey=str_replace("-----END RSA PRIVATE KEY-----","",$privatekey);
$privatekey=str_replace("\n","",$privatekey);

$privatekey="-----BEGIN RSA PRIVATE KEY-----".PHP_EOL .wordwrap($privatekey, 64, "\n", true). PHP_EOL."-----END RSA PRIVATE KEY-----";

$prikeyid = openssl_get_privatekey($privatekey);
if (openssl_private_decrypt($crypttext, $sourcestr, $prikeyid, OPENSSL_PKCS1_PADDING))
{
return $sourcestr;
}
return FALSE;
}


/**
* 私匙加密
*/
function privatekey_encodeing($sourcestr, $privatekey)
{

//以下為了初始化私鑰,保證在您填寫私鑰時不管是帶格式還是不帶格式都可以通過驗證。
$privatekey=str_replace("-----BEGIN RSA PRIVATE KEY-----","",$privatekey);
$privatekey=str_replace("-----END RSA PRIVATE KEY-----","",$privatekey);
$privatekey=str_replace("\n","",$privatekey);

$privatekey="-----BEGIN RSA PRIVATE KEY-----".PHP_EOL .wordwrap($privatekey, 64, "\n", true). PHP_EOL."-----END RSA PRIVATE KEY-----";
$prikeyid = openssl_get_privatekey($privatekey);
if (openssl_private_encrypt($sourcestr, $crypttext, $prikeyid, OPENSSL_PKCS1_PADDING))
{
return $crypttext;
}
return FALSE;
}


/**RSA簽名
* $data待簽名數據
* $priKey商戶私鑰
* 簽名用商戶私鑰
* 使用MD5摘要算法
* 最后的簽名,需要用base64編碼
* return Sign簽名
*/
function Rsasign($data, $priKey) {
//轉換為openssl密鑰
$res = openssl_get_privatekey($priKey);

//調用openssl內置簽名方法,生成簽名$sign
openssl_sign($data, $sign, $res, OPENSSL_ALGO_MD5);

//釋放資源
openssl_free_key($res);

//base64編碼
$sign = base64_encode($sign);
return $sign;
}


/**RSA驗簽
* $data待簽名數據
* $sign需要驗簽的簽名
* $pubKey公鑰
* return 驗簽是否通過 bool值
*/
function Rsaverify($data, $sign, $pubKey) {
//轉換為openssl格式密鑰
$res = openssl_get_publickey($pubKey);

//調用openssl內置方法驗簽,返回bool值
$result = (bool)openssl_verify($data, base64_decode($sign), $res, OPENSSL_ALGO_MD5);

//釋放資源
openssl_free_key($res);

//返回資源是否成功
return $result;
}






免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM