* RSA加密
*
* @param string $data 待加密数据
* @param string $publicKey 公钥
* @return string|false 加密结果
* @author SC*/
function rsaEncrypt($data, $publicKey)
{$ciphertext = '';$publicKey = openssl_pkey_get_public($publicKey);$data = str_split($data, 117); //加密的数据长度限制为比密钥长度少11位,如128位的密钥最多加密的数据长度为117
foreach ($data as $d) {
openssl_public_encrypt($d, $crypted, $publicKey); //OPENSSL_PKCS1_PADDING
$ciphertext .= $crypted;
}
openssl_free_key($publicKey);return base64_encode($ciphertext);
}/**
* RSA解密
*
* @param string $data 待解密数据
* @param string $privateKey 私钥
* @param string 解密结果
* @author SC*/
function rsaDecrypt($data, $privateKey)
{$plaintext = '';$privateKey = openssl_pkey_get_private($privateKey);$data = base64_decode($data);$data = str_split($data, 128);foreach ($data as $d) {$r = openssl_private_decrypt($d, $decrypted, $privateKey);$plaintext .= $decrypted;
}return $plaintext;
}/**
* 生成RSA签名
*
* @param string $data 待签名数据
* @param string $privateKey 私钥
* @return string 签名
* @author SC*/
function rsaSign($data, $privateKey)
{$privateKey = openssl_get_privatekey($privateKey);
openssl_sign($data, $sign, $privateKey, OPENSSL_ALGO_MD5); //OPENSSL_ALGO_MD5 or OPENSSL_ALGO_SHA1(default)
openssl_free_key($privateKey);return base64_encode($sign);
}/**
* 检验RSA签名
*
* @param string $data 待签名数据
* @param string $sign 待验证签名
* @param string $publicKey 公钥
* @return bool 检验结果
* @author SC*/
function rsaVerify($data, $sign, $publicKey)
{$publicKey = openssl_get_publickey($publicKey);$result = openssl_verify($data, base64_decode($sign), $publicKey, OPENSSL_ALGO_MD5); //OPENSSL_ALGO_MD5 or OPENSSL_ALGO_SHA1(default)
openssl_free_key($publicKey);return ($result == 1) ? true : false; //-1:错误;0:签名错误;1:签名正确
}$pubKey = '-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCsvvkZ0EYjDcmYsRbcdEugUybF
YGM3WKZfmZQaU+jHIk0UTw2I9kDHC2wmYcIAA3fqCeJ71WvdiqJNXByUYgsKGuLC
SYUP9wqOGze0U9hNb/M8E1JHlKbo3v0oAsp8awXl7QDRsOhibJUjIdf3Gt/qwh1R
mAtYSWHi/BLfzC6nfQIDAQAB
-----END PUBLIC KEY-----';$a = rsaEncrypt(123, $pubKey);$priKey = '-----BEGIN PRIVATE KEY-----
MIICdQIBADANBgkqhkiG9w0BAQEFAASCAl8wggJbAgEAAoGBAKy++RnQRiMNyZix
Ftx0S6BTJsVgYzdYpl+ZlBpT6MciTRRPDYj2QMcLbCZhwgADd+oJ4nvVa92Kok1c
HJRiCwoa4sJJhQ/3Co4bN7RT2E1v8zwTUkeUpuje/SgCynxrBeXtANGw6GJslSMh
1/ca3+rCHVGYC1hJYeL8Et/MLqd9AgMBAAECgYBJvO9KJIx71BvU0OsISaAqnLP1
FtLjQjUqo70DjAPWVP8AB0qoxy0ZifetXpdYOCLMxVFnOM/lbpMfYI1WjY9WGmDQ
C0UMpOEuk/bhqAJMIN79WpEqWvJQYFzRWw3O63SwbU3mcYgqssULk6VXhhTuCuNI
gc9D/xNyj3CsfKLgRQJBANNsErsLNeM07lOaeTRXC+OYZmz9TOIgXRliYH+r52rF
QTYGY6zfs1SgDPIZZZ+1nCA6ifkFlm4xnhptlWTZTzsCQQDRK0cGCt52Iusu0LV9
2jiY1fNP8QX4bJThT+iAuGuSZeOgzWQE1Wic6j1Rsgn6XELwY7kpZbLKXWoXLVJC
9GinAkA1J53J8vaYai1lTZgdhakSjrVpv4F99L8Ta71xO+oR2QgdKhwTUabHpvm6
QJJhRgq7u5wGxNXeXJEwec6urUgTAkAstHo2kWYgi7AGTncr0dMc30VkhZgIE3Ty
fvirYj8jiAFRofRJkC8OsoWui0XUq5lm9XlinqjK1ZJSJ86YHtKrAkBnB6+fO1/h
j1Jm7L5miQVDYE4VRlVK/oAWTlceVn7a6HUQOTQUlHAiKGxuhzB7jIyLoQWLXHyG
vpZ0T54nyQqu
-----END PRIVATE KEY-----';$b = rsaDecrypt($a, $priKey);echo $b;$c = rsaSign(333, $priKey);//echo $c;
echo '';var_dump(rsaVerify(333, $c, $pubKey));