最近和java对接接口看文档就是rsa 一开始怎么也调不通;以为就是rsa 加密一把 他们只给一个key 一个字符串
MIIBVAIBADxxxxxxxEAAkEApWBS7aJbksmufLQZ889vhw5Uy93xGOqe3/YS5/trqgDMA9iZKNxttyBnU7ffj0c3bas7jUklZRnGlO7Tb+Aa8QIDAQABAkBeA7GBSKB4hVE9sYFjepSzmbEZKLYsbQ0e0xySZvsg7GMJFjFAbcFaqD7W4bFbG34QKvrEELbmRyxxxxx0yApG/yJPJlCXzN5Iaavcszx1al7mKPK8PECIQDIhtVhmgYEIM3W/TxxxxxxxxxxxxxJZ38VSU42phAEDBeq59IKkc15hyBQSgXnuM0x2yfszBAiBjS4D155L7ExxxxVhU/F/lMD7oOGoAQIgEM5LXv1q8Suf1oIDetZB4T7jMQ4vgRpQfR0g8YEFR/Y=
我就简单的调用
$pu_key = openssl_pkey_get_private($interface_key); 会报错 // openssl_pkey_get_private(): key param is not a valid private key
var_dump($pu_key)
openssl_private_encrypt($sign, $resSign, $pu_key);
其实正规生成的pem 文件格式确实不和前面一样;最后让java给一个java的demo 最后看到SHA1WithRSA 就网上搜了一下php的实现
//生成 sha1WithRSA 签名
function genSign($toSign, $privateKey){
//这里他是拼接成和pem文件一样的格式
$privateKey = "-----BEGIN RSA PRIVATE KEY-----\n" .
wordwrap($privateKey, 64, "\n", true) .
"\n-----END RSA PRIVATE KEY-----";
$key = openssl_get_privatekey($privateKey);
openssl_sign($toSign, $signature, $key);
openssl_free_key($key);
$sign = base64_encode($signature);
return $sign;
}
//校验 sha1WithRSA 签名
function verifySign($data, $sign, $pubKey){
$sign = base64_decode($sign);
$pubKey = "-----BEGIN PUBLIC KEY-----\n" .
wordwrap($pubKey, 64, "\n", true) .
"\n-----END PUBLIC KEY-----";
$key = openssl_pkey_get_public($pubKey);
$result = openssl_verify($data, $sign, $key, OPENSSL_ALGO_SHA1) === 1;
return $result;
}
//测试
$privateKey = "xx....";
$pubKey = "xxx....";
//生成签名
$sign = genSign("test", $privateKey);
//校验签名
$rs = verifySign("test", $sign, $pubKey);
var_dump($rs);