国密SM2

作者: 淡淡de盐 | 来源:发表于2024-04-17 10:13 被阅读0次

    本次国密算法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

    相关文章

      网友评论

          本文标题:国密SM2

          本文链接:https://www.haomeiwen.com/subject/gcvsxjtx.html