rsa php 生成的密钥如何转换为java,PHP使用Java生成RSA密钥对进行签名、验签

本文详细介绍了如何将Java生成的RSA密钥对(Base64字符串形式)转换为PHP能使用的PEM格式,并提供了转换工具和签名、验签的示例代码。转换过程涉及到PKCS8到PKCS1格式的私钥转换,以及最终转化为PEM格式。
摘要由CSDN通过智能技术生成

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 =<<

-----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 = <<

-----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、付费专栏及课程。

余额充值