本次國(guó)密算法sm2在 php7.2環(huán)境 Thinkphp5.1中應(yīng)用
開始前準(zhǔn)備以下擴(kuò)展
composer require mdanter/ecc
composer require wzhih/guomi
需要 gmp 擴(kuò)展
php -m查看是否存在擴(kuò)展。如果你使用的是寶塔可以在擴(kuò)展中直接安裝
openssl > 1.1.1版本
查看版本
openssl version
可以通過 yun升級(jí),
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
我這里暫時(shí)最新的是 https://www.openssl.org/source/openssl-3.2.1.tar.gz
如果實(shí)在安不上最新板,可以安裝1.1.1
tar -zxvf openssl-3.2.1.tar.gz
cd openssl-3.2.1#如果此步驟報(bào)錯(cuò),需要安裝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#設(shè)置生效
ldconfig -v
最后查看本地openssl版本是否升級(jí)成功
生成公鑰私鑰
在線生成 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);
}
控制器中測(cè)試
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時(shí)報(bào)錯(cuò)
請(qǐng)注意這句話:【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
#進(jìn)入CPAN的 shell 模式,配置shell我選的全是默認(rèn)配置
$ perl -MCPAN -e shell
#在shell中安裝缺少的模塊
cpan[1]> install IPC/Cmd.pm
中間有報(bào)錯(cuò)
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

