PHP基于openssl实现加解密、签名验签

相关版本信息:

apache1.3.39

php4.4

openssl0.9.7m

公钥、私钥生成

私钥生成(pri.key): openssl genrsa -out test.private1024
公钥生成(pub.key): openssl rsa -in test.private -pubout -out test.public

test.private文件内容(内容最后有一空行)

—–BEGIN RSA PRIVATE KEY—–
MIICXQIBAAKBgQDKYTFpXm8qwlDIsJAruhFrcDhRUTz0IxX5BTodz/Z5IAJKh5V4
m0IJjNXzjtghTO7Nh+1S9+N3q5PWyRm9sgL+GOjazBzck2PoEwtH80RPkiX362ay
iHiHivXE+o4sj1j1eycUk6RSqmSp6teGvZC9pH6a4DdGAssqxGgzkGUvfQIDAQAB
AoGAfORWFeyNNhoMuI0dq558OY1bc/NqZk9ws+ih4NwCAuXaBByABZnquvIK5u90
Obi8dmI390e7PJLJ/XbFR+efKA8gV6hF6Moxi2oiA66vz+LCu7Yd3+zApDiUgb5A
0qPmlpFQ/1uQT98mtvaaJk0qPWDoLP1MpBLfsBOZH/OQMAECQQDsBT+Mgv7E3H1f
FWkAItQ3MTk5WXed05HObDVEpS80I6IAtBbVBOf40wQ+9u1iVokxzeyPlrYWVmCk
gY2Pl4h9AkEA24LryL5yEu0P78E4pn5V5GvhWg7p4Rh1doAgxVAopanhAww3nsYI
IVxwSmrpKoKgVmYnvD9uE0WND0839mvzAQJBAOD7f8BpfoIZzEi/GABRMwoJmgrZ
BfUkoHCtJXnyHDUPYnZZNQqKSrYeMIX0zARZiR44ta+KcriITkeCV3bxc+ECQBoK
syxSo7fpFe3sr2rZLBl4TvjfMhH5U94mHz0pYFkfCUnSRjr45XgHvm6ltlnLu3fk
kKw9njJ9GtoJHOuILQECQQDLop/Qil+Nkd5i/MCgNoKewLa5ZX56p4FUm5zXn4e0
KdXZ0c8VTHzqoMR+MWcMPMAmDyQIiziL8/wMrOs26VCH
—–END RSA PRIVATE KEY—–

test.public文件内容(文件最后有一空行)

—–BEGIN PUBLIC KEY—–
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDKYTFpXm8qwlDIsJAruhFrcDhR
UTz0IxX5BTodz/Z5IAJKh5V4m0IJjNXzjtghTO7Nh+1S9+N3q5PWyRm9sgL+GOja
zBzck2PoEwtH80RPkiX362ayiHiHivXE+o4sj1j1eycUk6RSqmSp6teGvZC9pH6a
4DdGAssqxGgzkGUvfQIDAQAB
—–END PUBLIC KEY—–

源代码如下:

rsa.php

<?php

function BINTOHEX($bin_rsa_result)
{
$sign=””;
for($i=0; $i < strlen($bin_rsa_result); $i ++)
{
if(ord($bin_rsa_result[$i]) < 16)
{
$sign1 = ‘0’ . dechex(ord($bin_rsa_result[$i]));
}
else
{
$sign1 = “” . dechex(ord($bin_rsa_result[$i]));
}

$signtmp = $sign . $sign1;
$sign = $signtmp;
}
return $sign;
}

function HEXTOBIN($hex)
{
$result=””;
for($i=0; $i<strlen($hex); $i+=2) {
$result .= chr(hexdec(substr($hex, $i, 2)));
}

return $result;

}

return $result;
}

function sign($dataString , $key_content)
{
$pkeyid = openssl_get_privatekey($key_content);
$signature =””;
openssl_sign($dataString, $signature, $pkeyid);

// free the key from memory
openssl_free_key($pkeyid);
return base64_encode($signature);
}

function verify($dataString,$signString,$key_content)
{
$pubkeyid = openssl_get_publickey($key_content);
$signature =base64_decode($signString);
$flg = openssl_verify($dataString, $signature, $pubkeyid );

// free the key from memory
openssl_free_key($pubkeyid);
return $flg;
}

/**
*公钥加密
*/
function publickey_encodeing($sourcestr , $fileName)
{
$key_content = file_get_contents($fileName);
$pubkeyid = openssl_get_publickey($key_content);
if(openssl_public_encrypt($sourcestr,$crypttext,$pubkeyid))
{
return base64_encode(“”.$crypttext);
}
}

/**
*私钥加密
*/
function privatekey_encodeing($sourcestr , $fileName)
{
$key_content = file_get_contents($fileName);
$pubkeyid = openssl_get_privatekey($key_content);
if(openssl_private_encrypt($sourcestr,$crypttext,$pubkeyid))
{
return base64_encode(“”.$crypttext);
}
}

/**
*私钥解密
*/
function privatekey_decodeing($crypttext , $fileName)
{
$key_content = file_get_contents($fileName);
$prikeyid = openssl_get_privatekey($key_content);
$crypttext = base64_decode($crypttext);

if(openssl_private_decrypt($crypttext,$sourcestr,$prikeyid))
{
return “”.$sourcestr;
}
return ;
}

/**
*公钥解密
*/
function publickey_decodeing($crypttext , $fileName)
{
$key_content = file_get_contents($fileName);
$prikeyid = openssl_get_publickey($key_content);
$crypttext = base64_decode($crypttext);

if(openssl_public_decrypt($crypttext,$sourcestr,$prikeyid))
{
return “”.$sourcestr;
}
return ;
}

///////////////////////////////////////////////////////////////////////////////////

/**
*公钥加密,结果转16进制
*/
function hex_publickey_encodeing($sourcestr , $fileName)
{
$key_content = file_get_contents($fileName);
$pubkeyid = openssl_get_publickey($key_content);
if(openssl_public_encrypt($sourcestr,$crypttext,$pubkeyid))
{
return BINTOHEX(“”.$crypttext);
}
}

/**
*私钥加密,结果转16进制
*/
function hex_privatekey_encodeing($sourcestr , $fileName)
{
$key_content = file_get_contents($fileName);
$pubkeyid = openssl_get_privatekey($key_content);
if(openssl_private_encrypt($sourcestr,$crypttext,$pubkeyid))
{
return BINTOHEX(“”.$crypttext);
}
}

/**
*结果转16进制,私钥解密
*/
function hex_privatekey_decodeing($crypttext , $fileName)
{
$key_content = file_get_contents($fileName);
$prikeyid = openssl_get_privatekey($key_content);
$crypttext = HEXTOBIN($crypttext);

if(openssl_private_decrypt($crypttext,$sourcestr,$prikeyid))
{
return “”.$sourcestr;
}
return ;
}

/**
*结果转16进制,,公钥解密
*/
function hex_publickey_decodeing($crypttext , $fileName)
{
$key_content = file_get_contents($fileName);
$prikeyid = openssl_get_publickey($key_content);
$crypttext = HEXTOBIN($crypttext);

if(openssl_public_decrypt($crypttext,$sourcestr,$prikeyid))
{
return “”.$sourcestr;
}
return ;
}

?>

rsa_test.php

<?
include(“rsa.php”);

function EchoPageResult($info)
{
echo $info. “<br>”;
}

$privatekey=”../../conf/test.private”;
$publickey=”../../conf/test.public”;
$Text=”123456789ABCDEF”;

//私钥加密,结果转Base64
$result=privatekey_encodeing($Text, $privatekey);
EchoPageResult($Text .”<br>privatekey_encodeing :”);
EchoPageResult($result);
EchoPageResult(“”);

//对上面的结果解密
$source=publickey_decodeing($result, $publickey);
EchoPageResult($result .”<br>publickey_decodeing :”);
EchoPageResult($source);
EchoPageResult(“”);

//私钥加密,结果转Base64
$result=hex_privatekey_encodeing($Text, $privatekey);
EchoPageResult($Text .”<br>hex_privatekey_encodeing :”);
EchoPageResult($result);
EchoPageResult(“”);

//对上面的结果解密
$source=hex_publickey_decodeing($result, $publickey);
EchoPageResult($result .”<br>hex_publickey_decodeing :”);
EchoPageResult($source);
EchoPageResult(“”);

?>

运行结果

123456789ABCDEF
privatekey_encodeing :
LERI7LOHuECuxV5x+BbwX3JnG58HSLBt6QM5/S6VM510wMP91iEqm0JBQWwlBcR3TBbA1U5+fvby2DCrDMbf3vIo664NkAtGV4tZ1bRjBtxsgfVzB65ZyhBAHvjuNstTIDPaCjNINnQvOtZsqK7RwWwbtP+A/lNfYvdivvAJHfI=

LERI7LOHuECuxV5x+BbwX3JnG58HSLBt6QM5/S6VM510wMP91iEqm0JBQWwlBcR3TBbA1U5+fvby2DCrDMbf3vIo664NkAtGV4tZ1bRjBtxsgfVzB65ZyhBAHvjuNstTIDPaCjNINnQvOtZsqK7RwWwbtP+A/lNfYvdivvAJHfI=
publickey_decodeing :
123456789ABCDEF

123456789ABCDEF
hex_privatekey_encodeing :
2c4448ecb387b840aec55e71f816f05f72671b9f0748b06de90339fd2e95339d74c0c3fdd6212a9b4241416c2505c4774c16c0d54e7e7ef6f2d830ab0cc6dfdef228ebae0d900b46578b59d5b46306dc6c81f57307ae59ca10401ef8ee36cb532033da0a334836742f3ad66ca8aed1c16c1bb4ff80fe535f62f762bef0091df2

2c4448ecb387b840aec55e71f816f05f72671b9f0748b06de90339fd2e95339d74c0c3fdd6212a9b4241416c2505c4774c16c0d54e7e7ef6f2d830ab0cc6dfdef228ebae0d900b46578b59d5b46306dc6c81f57307ae59ca10401ef8ee36cb532033da0a334836742f3ad66ca8aed1c16c1bb4ff80fe535f62f762bef0091df2
hex_publickey_decodeing :
123456789ABCDEF

发表评论

电子邮件地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据