PHP 中的发送方和接收方之间通过 Public 密钥验证私钥的签名

Verify signature of Private key by Public key between Sender and Receiver in PHP

我为发件人创建了一个 Signature() 函数来签署 his/her 私钥,然后 return $signature

use phpseclib\Crypt\RSA;

public function Signature(Request $request)
{
  $agent_code = $request->agent_code;
  $private_key = $request->private_key;
  $private_passphrase = $request->private_passphrase;

  $string = $agent_code;

  $private_key = File::get($private_key);

  $rsa = new RSA();
  $rsa->setPassword($private_passphrase);
  $rsa->loadKey($private_key); // private key

  $signature = base64_encode($rsa->sign($string));
  return $signature;
}

之后,将$signature传递给Verify()函数,让接收方使用his/her public key

验证签名
 public function Verify(Request $request)
 {
  $agent_code = $request->agent_code;
  $public_key = $request->public_key;
  $signature = $request->signature;

  $string = $agent_code;

  $public_key = File::get($public_key);

  $rsa = new RSA();
  $rsa->loadKey($public_key); // public key
  echo $rsa->verify($string, base64_decode($signature)) ? 'verified' : 'unverified';

}

然后,我在 Postman 上测试了这两个功能
照片 1 - 3 用于 Signature() 函数
照片 4 - 6 用于 Verify() 函数

照片 1:此 url 将调用 Signature() 函数。 agent_code 和 private_passphrase 参数已填充。 agent_code 是要由私钥签名的字符串,而 private_passphrase 是私钥的密码。

图2:私钥以文件格式附在正文中

照片 3:$签名是 returned

照片 4:此 url 将调用 Verify() 函数。 agent_code 和签名参数已填充。签名是从 Signature() 函数复制的,该函数用于通过 public key
验证

图片 5 : public 密钥作为文件格式以正文形式附加

照片 6:Invalid signature 错误

我不知道为什么return Invalid Signature,因为如果我把签名和验证码写在一个函数里,它会给我回显'verified'。密钥对正确并且 $signature 被正确复制。

感谢所有指导和指正。

我正在将我的评论转化为答案。

我认为您的问题是由查询参数中的 + 符号引起的 - 它们被识别为 URL 编码的空格。如果您使用 POST 而不是 GET 就不会有任何问题。

为了避免使用URL-encoding 引起的通常的Base64 编码问题,我的建议是使用Base64URL 编码。与正常的 Base64 编码相比,它使用 - 而不是 +_ 而不是 /