PHP转换SM2加密数据ASN1编码格式为C1C3C2格式数据
php  /  管理员 发布于 7个月前   328
php的SM2加密生成数据和解析数据格式基本为C1C3C2格式,
JAVA默认生成的加密数据为ASN1 格式,PHP解析可能会有问题,
需要使用phpseclib/phpseclib包转换下才能使用,所以就写了一个转换函数。
转换函数:
use phpseclib3\File\ASN1;
// SM2 加密数据的 ASN1 格式转换为 C1C3C2 格式
// 需要 composer 安装 "phpseclib/phpseclib": "^3.0"
function formatSM2EncryptData($data)
{
$der = ASN1::decodeBER(base64_decode($data));
$x = "";
$y = "";
if (isset($der[0]["content"][0]["content"])) {
$x = $der[0]["content"][0]["content"]->toHex();
}
if (isset($der[0]["content"][1]["content"])) {
$y = $der[0]["content"][1]["content"]->toHex();
}
$ct = bin2hex($der[0]["content"][2]["content"] ?? "");
$hash = bin2hex($der[0]["content"][3]["content"] ?? "");
$x = str_pad($x, 64, "0", STR_PAD_LEFT);
$y = str_pad($y, 64, "0", STR_PAD_LEFT);
$endata = $x . $y . $ct . $hash;
return $endata;
}
调用测试:
use Rtgm\sm\RtSm2;
// 测试数据
$prikey = "6b4bb2cfe6d4e3499f74cfd05b048b380230d6d7837ebbe1a865850054fbafdb";
$data = "MGwCIQDafQBon8ZrC5fRya4oC6yAgONN6PIWN/I4fk/8wwhGIAIgJgJ/vmW0UmEGmzTp4sgPvigyafQXSU5gsfwLJvE1WYwEIM8nvAb2K7xoK/Q/yi7z/7jzq5XwO3/TtDyvluEiZD0yBAP1Ed4=";
$endata = formatSM2EncryptData($data);
// 使用包: "lpilp/guomi": "1.0.*",
$sm2 = new RtSm2();
$res = $sm2->doDecrypt($endata, $prikey);
var_dump($res);
// 输出: 123
解析 ASN1 编码格式用到了第三方包 phpseclib/phpseclib, SM2 解密测试用到的包 lpilp/guomi。
其他 PHP 包解密 SM2 加密数据时请注意测试。
go的sm2解密可以查看 sm2 doc
https://github.com/deatil/go-cryptobin/blob/main/docs/sm2.md
123 在
Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..原梓番博客 在
在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..博主 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..1111 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..路人 在
php中使用hyperf框架调用讯飞星火大模型实现国内版chatgpt功能示例中评论 教程很详细,如果加个前端chatgpt对话页面就完美了..Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号