1,如果私钥在一行,openssl_pkey_get_private()就会返回false,所以我们要修改格式
$privateKey = "MIICXgIBAAKBgQDjI484irh8X8+/ahon/+frln74K7azpwHrvei70c2cpjFoW4ghkfQmhBkcqNj/OCyGAcDDw30v/PActXlPGqxT79E7zobAU4PbikkEoqnY440E4DZ8nvbLm1W6+StUahR70nwAS+KfwRilsS+EZwqSGHmKA3hPv82ONUj+uO5F9wIDAQABAoGBAID1moY2tIHhABmkiw80yx9GBfavEv8zDfMjkrS4bK3I6fpfJY4xyNXpYDyWXQWihhzbd+9t2XDaghU6r5JLCZVYmpxRbNDYD48BK8e0STKQkQipTo5BG/DHajirVLWlJN9csQeM/TgHOmieRWzA2XZLG79XdZoAn5qrkHfszV4BAkEA8xFvfBZ8XjNdR5H2h3ktlWbH9+xeSCFv4F34xdE4jCUs7CLEZqaVWwVwBUceVAenEI9xIRNC6q51EMbrl+eS9wJBAO85K3PKyNVoqZKJ+JB2GozuwW29j96Ki5zzOx7jWjVHygO3gnwU0v2VqdftFXj3KLoycdzZjAQDAwWmbPI/JQECQQDH2UIMiIBhA2JiggRshpmQCR3JHjK2o6dUlm8AVnFj6PzyefN5YuXSHLpp3Ht3I4Oc/hNJ2oheZGokDSmPj/spAkEArYBdT4IH3yAlvK5spPnDj+uqRplxuwno8FBI1MI4LuR+U+vIq42+6USfBohhRnacB0+G3ZK6xj4Y9wQZiCjcAQJAUhsoJcGWXVpuT+xfPvnEaEhBkOC6HYoMApgljPng8ZrPGEFaGpk/ZwK13ilB1LOjGmVtNmfDpVDXJtvLStH0WQ==";
$passphrase = ''; // 私钥密码
$key_width = 64;
//私钥
$p_key = array();
//如果私钥是 1行
if( ! stripos( $privateKey, "\n" ) ){
$i = 0;
while( $key_str = substr( $privateKey , $i * $key_width , $key_width) ){
$p_key[] = $key_str;
$i ++ ;
}
}else{
//echo '一行?';
}
$privateKey = "-----BEGIN RSA PRIVATE KEY-----\n" . implode("\n", $p_key) ;
$privateKey = $privateKey ."\n-----END RSA PRIVATE KEY-----";
//私钥
$pkeyid = openssl_pkey_get_private( $privateKey , $passphrase);
if (empty($pkeyid)) {
echo "private key resource identifier False!";
return False;
}
$verify = openssl_sign($data, $signature, $pkeyid, OPENSSL_ALGO_MD5);
openssl_free_key($pkeyid);
这样就会变成我们想要的格式,从而验证成功,注意:openssl_sign函数中的最后一个参数OPENSSL_ALGO_MD5,这个要看用的是什么加密方式,对应的用什么参数
openssl_sign 默认signature_alg参数是OPENSSL_ALGO_SHA1
如果使用DSA加密方式需要使用OPENSSL_ALGO_DSS1参数
signature_alg 其他参数
OPENSSL_ALGO_DSS1
OPENSSL_ALGO_SHA1
OPENSSL_ALGO_SHA224
OPENSSL_ALGO_SHA256
OPENSSL_ALGO_SHA384
OPENSSL_ALGO_SHA512
OPENSSL_ALGO_RMD160
OPENSSL_ALGO_MD5
OPENSSL_ALGO_MD4
OPENSSL_ALGO_MD2
下面的openssl_verify函数的最后一个参数一样的,也是要注意是什么加密方式,用什么方式解密
2,如果公钥在一行,openssl_pkey_get_public(),也会返回false
$public_key = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCLRDRAO/Yt5g/v8nHTXTxz+0CLac1Y380soIEDhPIIOui2P5L7rijBUsjPq5gNGfg6w0OoiviwzuFFljE3QSB7RGt4iOpI360O7pCim0AzLqLI2wZ2CjNRsFO9LIeo/EkjrxCLJtdTQtu/7u5YH9tarqawdXNZ0rr3qQeC/VCPWQIDAQAB";
if (empty($public_key)){
echo "Public Key error!";
return False;
}
$pem = chunk_split($public_key,64,"\n");
$pem = "-----BEGIN PUBLIC KEY-----\n".$pem."-----END PUBLIC KEY-----\n";
$public_key_id = openssl_pkey_get_public($pem);
if (empty($public_key_id)){
echo "public key resource identifier False!";
return False;
}
$ret = openssl_verify($data, $signature, $public_key_id,OPENSSL_ALGO_MD5); //$ret返回1是验证成功,0是验证失败
if($ret == 1){
return true;
}else{
return false;
}