相关版本信息:
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