php sm2签名
时间: 2023-07-26 09:20:24 浏览: 149
以下是PHP中使用SM2算法进行签名的示例代码:
```php
// 待签名的数据
$data = "Hello, world!";
// 随机生成32位16进制字符串作为私钥
$privateKey = bin2hex(random_bytes(32));
// 使用私钥生成公钥
$publicKey = sm2_get_public_key_from_private_key($privateKey);
// 对数据进行签名
$signature = sm2_sign($data, $privateKey);
// 验证签名
$isValid = sm2_verify($data, $signature, $publicKey);
// 打印结果
echo "Data: " . $data . PHP_EOL;
echo "Private key: " . $privateKey . PHP_EOL;
echo "Public key: " . $publicKey . PHP_EOL;
echo "Signature: " . bin2hex($signature) . PHP_EOL;
echo "Verification result: " . ($isValid ? "valid" : "invalid") . PHP_EOL;
/**
* 从私钥生成公钥
*
* @param string $privateKey 私钥,16进制字符串
* @return string 公钥,16进制字符串
*/
function sm2_get_public_key_from_private_key(string $privateKey): string
{
$context = sm2_init_context();
$publicKey = sm2_get_public_key($context, hex2bin($privateKey));
return bin2hex($publicKey);
}
/**
* 使用SM2算法对数据进行签名
*
* @param string $data 待签名的数据
* @param string $privateKey 私钥,16进制字符串
* @return string 签名结果,二进制字符串
*/
function sm2_sign(string $data, string $privateKey): string
{
$context = sm2_init_context();
$signature = sm2_do_sign($context, $data, hex2bin($privateKey));
return $signature;
}
/**
* 使用SM2算法验证签名
*
* @param string $data 待验证的数据
* @param string $signature 签名结果,二进制字符串
* @param string $publicKey 公钥,16进制字符串
* @return bool 验证结果,true表示验证通过,false表示验证失败
*/
function sm2_verify(string $data, string $signature, string $publicKey): bool
{
$context = sm2_init_context();
$isValid = sm2_do_verify($context, $data, $signature, hex2bin($publicKey));
return $isValid;
}
```
注意:以上代码中的`sm2_init_context()`函数需要自行实现,其作用是初始化SM2算法上下文。另外,也需要实现`sm2_get_public_key()`、`sm2_do_sign()`和`sm2_do_verify()`函数,分别用于生成公钥、签名和验证签名。这些函数的具体实现可以参考SM2算法的规范文档。
阅读全文