经常要跟java对接口用到RSA加解密及签名验签,现把方法记录下来方便用时查看:
class Rsa
{
const MAX_ENCRYPT_BLOCK = 117;
const MAX_DECRYPT_BLOCK = 128;
/**
* 私钥加密
* @param $plainString
* @param $privateKey
* @return string
*/
public static function priEncrypt($plainString, $privateKey)
{
$encryptedString = "";
$strlen = strlen($plainString);
if ($strlen < 118) {
openssl_private_encrypt($plainString, $encryptedString, self::conertKey($privateKey,"pri"));//私钥加密
} else {
foreach (str_split($plainString, self::MAX_ENCRYPT_BLOCK) as $chunk) {
openssl_private_encrypt($chunk, $chunkString, self::conertKey($privateKey,"pri"));
$encryptedString .= $chunkString;
}
}
return $encryptedString;
}
/**
* 私钥解密
* @param $encryptedString
* @param $privateKey
* @return string
*/
public static function priDecrypt($encryptedString, $privateKey)
{
$plainString = "";
$strlen = strlen($encryptedString);
if ($strlen < 129) {
openssl_private_decrypt($encryptedString,$plainString,self::conertKey($privateKey,"pri"));//私钥解密
} else {
foreach (str_split($encryptedString, self::MAX_DECRYPT_BLOCK) as $chunk) {
openssl_private_decrypt($encryptedString,$chunkString,self::conertKey($privateKey,"pri"));//私钥解密
$plainString .= $chunkString;
}
}
return $plainString;
}
/**
* 公钥加密
* @param $plainString
* @param $publicKey
* @return string
*/
public static function pubEncrypt($plainString, $publicKey)
{
$encryptedString = "";
$strlen = strlen($plainString);
if ($strlen < 118) {
openssl_public_encrypt($plainString,$encryptedString,self::conertKey($publicKey,"pub"));//公钥加密
} else {
foreach (str_split($plainString, self::MAX_ENCRYPT_BLOCK) as $chunk) {
openssl_public_encrypt($chunk,$chunkString,self::conertKey($publicKey,"pub"));//公钥加密
$encryptedString .= $chunkString;
}
}
return $encryptedString;
}
/**
* 公钥解密
* @param $encryptedString
* @param $publicKey
* @return string
*/
public static function pubDecrypt($encryptedString, $publicKey)
{
$plainString = "";
$strlen = strlen($encryptedString);
if ($strlen < 129) {
openssl_public_decrypt($encryptedString,$plainString,self::conertKey($publicKey,"pub"),OPENSSL_PKCS1_PADDING);//公钥解密
} else {
foreach (str_split($encryptedString, self::MAX_DECRYPT_BLOCK) as $chunk) {
openssl_public_decrypt($chunk, $chunkString, self::conertKey($publicKey,"pub"),OPENSSL_PKCS1_PADDING);
$plainString .= $chunkString;
}
}
return $plainString;
}
/**
* 私钥签名
* @param $alg 加密方式选择双方约定好的方式
*/
public static function sign($data, $key, $alg = OPENSSL_ALGO_SHA256)
{
$encSign = "";
openssl_sign($data, $encSign, self::conertKey($key,"pri"), $alg);
return $encSign;
}
//公钥验签
public static function verify($data, $sign, $key, $alg = OPENSSL_ALGO_SHA256)
{
return openssl_verify($data, base64_decode($sign), self::conertKey($key,"pub"), $alg);
}
// 将java公私钥格式转化为PHP可识别的pem格式
public static function conertKey($key,$type){
{
if($type == 'pri'){
$begin = "-----BEGIN PRIVATE KEY-----\n";
$end = "\n-----END PRIVATE KEY-----";
}else{
$begin = "-----BEGIN PUBLIC KEY-----\n";
$end = "\n-----END PUBLIC KEY-----";
}
$key_string = $begin . wordwrap($key, 64, "\n", true) . $end;
return $key_string;
}
}
}