PHP使用Java生成RSA密钥对进行签名、验签

1、Java生成的密钥对(base64字符串)
String privateKey = "MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAJIQ+dgSAgEKAJ7Wf2fsztYQwmDBwZoVwmBDcm/SzdxAh8f3Oq3D5tghImj3fKATrLdoMZLETnVnoIVK+T014I8gICVoTmHNsyb3pp4r43W2NAcaL+YTB4WRVuCfye9QVOtBqRVK9e2Ltwjv0hea6iqBD4+w3Gbu8zWPcjRRt95BAgMBAAECgYEAgy/mBa8ex6ohJofGBCQHHPIOcnJzHJ4AZw8Mv+xYYkI+8VVWCW0SbvlLe3UUJH2nOU7Gf2f6g63f2PeeZOB33xkDoXTe+tVBjzIUKAwbwMvlMwtxPigAs2zMLBu1tMxovPmR3GM6JchF/vnMHu/zwH9ZvKouOy6idPZT3flY7UUCQQDBmQtIBwtI6TEhvZf8DorQ6A8Ng2pFpxkjZRAoyiMIphys8LuPphINy2IBCO9Hxgq+ZYy7IvQc/+mMsJ8epjEjAkEAwSXP5UZuJaS5fdmRA1pepucY904EBxrHCOjNmWXoLyWBJD22DE0MOSE1GM/cX7UXM1+VSAZ8Ho4PyJg822SzSwJAENH5NvLVuin4iNPuJook6W2gES5/xzlzZ63aL5EQZin4h9YKlbp6CxTGmQxrrbK5MD2mcoPg7bwWUJDv4jvSPQJBAJqd2Vnx0pUB05eiRgrIGgND9mFqq6DAV9qS+ps0z/SF8mZ/nC8msoU9RxMQuppHDkaK2qbowg13rbzn2bfLWhcCQE5+Ji28W58yy90qwQqLw5z1lkDjHh8nkVQg99pNodxiLRVo4Zt2Do711AxQb0Udw+y51jHwXCylw2Wq44MMx0M=";
String publicKey = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCSEPnYEgIBCgCe1n9n7M7WEMJgwcGaFcJgQ3Jv0s3cQIfH9zqtw+bYISJo93ygE6y3aDGSxE51Z6CFSvk9NeCPICAlaE5hzbMm96aeK+N1tjQHGi/mEweFkVbgn8nvUFTrQakVSvXti7cI79IXmuoqgQ+PsNxm7vM1j3I0UbfeQQIDAQAB";

2、把Java密钥对转换为PHP密钥对(pem格式)
Java私钥为PKCS8格式,PHP使用的私钥为PKCS1格式,先将Java私钥转换为PKCS1格式,公钥不用转换,转换工具可以使用支付宝提供的签名工具

然后将转换PKCS1后的私钥和原公钥转换为pem格式

/**
 * 将字符串格式公私钥格式化为pem格式公私钥
 * @param $secret_key
 * @param $type
 * @return string
 */
public static function format_secret_key($secret_key, $type){
    // 64个英文字符后接换行符"\n",最后再接换行符"\n"
    $key = (wordwrap($secret_key, 64, "\n", true))."\n";
    // 添加pem格式头和尾
    if ($type == 'pub') {
        $pem_key = "-----BEGIN PUBLIC KEY-----\n" . $key . "-----END PUBLIC KEY-----\n";
    }else if ($type == 'pri') {
        $pem_key = "-----BEGIN RSA PRIVATE KEY-----\n" . $key . "-----END RSA PRIVATE KEY-----\n";
    }else{
        echo('公私钥类型非法');
        exit();
    }
    return $pem_key;
}

这样就得到了PHP能够使用的密钥对了
PHP生成密钥对
// 生成密钥对
$res = openssl_pkey_new();
openssl_pkey_export($res,$pri);
$d= openssl_pkey_get_details($res);
$pub = $d['key'];
var_dump($pri,$pub);

PHP签名、验签
// 私钥
$pri =<<<EOF
-----BEGIN RSA PRIVATE KEY-----
MIICXQIBAAKBgQCSEPnYEgIBCgCe1n9n7M7WEMJgwcGaFcJgQ3Jv0s3cQIfH9zqt
w+bYISJo93ygE6y3aDGSxE51Z6CFSvk9NeCPICAlaE5hzbMm96aeK+N1tjQHGi/m
EweFkVbgn8nvUFTrQakVSvXti7cI79IXmuoqgQ+PsNxm7vM1j3I0UbfeQQIDAQAB
AoGBAIMv5gWvHseqISaHxgQkBxzyDnJycxyeAGcPDL/sWGJCPvFVVgltEm75S3t1
FCR9pzlOxn9n+oOt39j3nmTgd98ZA6F03vrVQY8yFCgMG8DL5TMLcT4oALNszCwb
tbTMaLz5kdxjOiXIRf75zB7v88B/WbyqLjsuonT2U935WO1FAkEAwZkLSAcLSOkx
Ib2X/A6K0OgPDYNqRacZI2UQKMojCKYcrPC7j6YSDctiAQjvR8YKvmWMuyL0HP/p
jLCfHqYxIwJBAMElz+VGbiWkuX3ZkQNaXqbnGPdOBAcaxwjozZll6C8lgSQ9tgxN
DDkhNRjP3F+1FzNflUgGfB6OD8iYPNtks0sCQBDR+Tby1bop+IjT7iaKJOltoBEu
f8c5c2et2i+REGYp+IfWCpW6egsUxpkMa62yuTA9pnKD4O28FlCQ7+I70j0CQQCa
ndlZ8dKVAdOXokYKyBoDQ/ZhaqugwFfakvqbNM/0hfJmf5wvJrKFPUcTELqaRw5G
itqm6MINd62859m3y1oXAkBOfiYtvFufMsvdKsEKi8Oc9ZZA4x4fJ5FUIPfaTaHc
Yi0VaOGbdg6O9dQMUG9FHcPsudYx8FwspcNlquODDMdD
-----END RSA PRIVATE KEY-----
EOF;

// 公钥
$pub = <<<EOF
-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCSEPnYEgIBCgCe1n9n7M7WEMJg
wcGaFcJgQ3Jv0s3cQIfH9zqtw+bYISJo93ygE6y3aDGSxE51Z6CFSvk9NeCPICAl
aE5hzbMm96aeK+N1tjQHGi/mEweFkVbgn8nvUFTrQakVSvXti7cI79IXmuoqgQ+P
sNxm7vM1j3I0UbfeQQIDAQAB
-----END PUBLIC KEY-----
EOF;


// 生成base64签名
$openssl_pri = openssl_pkey_get_private($pri);
if (openssl_sign('hello', $sign, $openssl_pri)) {
    var_dump(base64_encode($sign));
}

// 验签
$sign = base64_decode(base64_encode($sign));
$openssl_pub = openssl_pkey_get_public($pub);
if (openssl_verify('hello', $sign, $openssl_pub) === 1)
    echo 'pass';
else
    echo 'not pass';


原文:https://blog.csdn.net/tangletao/article/details/82180864 
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值