国密SM2
本次国密算法sm2在 php7.2环境 Thinkphp5.1中应用
开始前准备以下扩展
composer require mdanter/ecc
composer require wzhih/guomi
需要 gmp 扩展
php -m查看是否存在扩展。如果你使用的是宝塔可以在扩展中直接安装
openssl > 1.1.1版本
查看版本
openssl version
可以通过 yun升级,
sudo yum update openssl
下载想要的版本 https://www.openssl.org/source/index.html
如果想下 1.1.1 wget https://www.openssl.org/source/openssl-1.1.1k.tar.gz
我这里暂时最新的是 https://www.openssl.org/source/openssl-3.2.1.tar.gz
如果实在安不上最新板,可以安装1.1.1
tar -zxvf openssl-3.2.1.tar.gz
cd openssl-3.2.1#如果此步骤报错,需要安装perl以及gcc包[安装方法在下面]
./config --prefix=/usr/local/openssl
make && make install#备份
mv /usr/bin/openssl /usr/bin/openssl.bak
ln -sf /usr/local/openssl/bin/openssl /usr/bin/openssl
echo "/usr/local/openssl/lib" >> /etc/ld.so.conf#设置生效
ldconfig -v
最后查看本地openssl版本是否升级成功
生成公钥私钥
在线生成 https://const.net.cn/tool/sm2/genkey/
生成好的密钥放在config或env下,我这里直接放入evn下了
[sm2]
private_key=xxxx
public_key=xxxxxxxxxxxx
在function中加入以下方法
// config/function.php
function encryptSm2($str, $publicKey)
{
$sm2 = new \Rtgm\sm\RtSm2();
$m2EncryptData = $sm2 ->doEncrypt($str, $publicKey);
return $m2EncryptData;
}
function decryptSm2($m2EncryptData, $privateKey)
{
$sm2 = new \Rtgm\sm\RtSm2();
$m2DecryptData = $sm2 ->doDecrypt($m2EncryptData, $privateKey);
return $m2DecryptData;
}
function signSm2($document, $privateKey)
{
$sm2 = new \Rtgm\sm\RtSm2('base64');
return $sm2 ->doSign($document, $privateKey);
}
function verifySignSm2($document, $sign, $publicKey)
{
$sm2 = new \Rtgm\sm\RtSm2('base64');
return $sm2 ->verifySign($document, $sign, $publicKey);
}
控制器中测试
public function test()
{
$str = '123456串';
$enSm2 = encryptSm2($str);
$deSm2 = decryptSm2($enSm2);
dump($enSm2);
dump($deSm2);
$sign = signSm2($str);
$verify = verifySignSm2($str, $sign);
dump($sign);
dd($verify);
}
perl安装
-
安装openssl时报错
请注意这句话:【Can't locate IPC/Cmd.pm in @INC (@INC contains: /usr/local/src/openssl-3.2.1/util/perl】 说明缺少 IPC/Cmd.pm
#先安装perl
$ yum install -y perl-CPAN
#进入CPAN的 shell 模式,配置shell我选的全是默认配置
$ perl -MCPAN -e shell
#在shell中安装缺少的模块
cpan[1]> install IPC/Cmd.pm
中间有报错
Reading '/home/zhangjie/.cpan/sources/modules/03modlist.data.gz'
Can't locate object method "data" via package "CPAN::Modulelist"解决办法:
$ perl -MCPAN -e shell
cpan[1]> o conf urllist unshift http://www.perl.com/CPAN/
cpan[2]> o conf commit