前言
国密主要有 SM1,SM2,SM3,SM4。密钥长度和分组长度均为 128 位。
SM1
为对称加密。其加密强度与 AES (高级加密标准,Advanced Encryption Standard) 相当。该算法不公开,调用该算法时,需要通过加密芯片的接口进行调用。
SM2
为非对称加密,基于 ECC。该算法已公开。由于该算法基于 ECC,故其签名速度与秘钥生成速度都快于 RSA。ECC 256 位(SM2 采用的就是 ECC 256 位的一种)安全强度比 RSA 2048 位高,但运算速度快于 RSA。
SM3
为消息摘要。可以用 MD5 作为对比理解。该算法已公开。校验结果为 256 位。
SM4
为对称加密,无线局域网标准的分组数据算法,密钥长度和分组长度均为 128 位。
代码
-
安装包
composer require lpilp/guomi -
示例
protected function execute(Input $input, Output $output)
{
############################数据加密开始################################
// 公钥
$publicKey = 'BNsIe9U0x8IeSe4h/dxUzVEz9pie0hDSfMRINRXc7s1UIXfkExnYECF4QqJ2SnHxLv3z/99gsfDQrQ6dzN5lZj0=';
// 私钥
$privateKey = 'NBtl7WnuUtA2v5FaebEkU0/Jj1IodLGT6lQqwkzmd2E=';
// base64私钥转二进制
$privateKey = base64_decode($privateKey);
// 二进制转十六进制字符串
$privateKey = unpack("H*", $privateKey)[1];
// 待加密的数据
$data = '{"request":{"body":{"ntbusmody":[{"busmod":"00001"}],"ntdumaddx1":[{"bbknbr":"75","dyanam":"招商测试","dyanbr":"11111111111","eftdat":"20220602","inbacc":"755936020410404","ovrctl":"N","yurref":"596620626253316098"}]},"head":{"funcode":"NTDUMADD","reqid":"202206021511010000001","userid":"B000001631"}},"signature":{"sigdat":"__signature_sigdat__","sigtim":"20220602161503"}}';
// 生成签名开始
$sm2 = new RtSm2("base64");
// 将用户id填充到16个字节
$userId = sprintf('%-016s', "B000001631");
// 使用rsa的私钥生成签名(注意这里是私钥!私钥!私钥!)
$sign = $sm2->doSign($data, $privat
国密算法在PHP中的应用:SM1-SM4加密与解密示例

本文详细介绍了中国国密算法SM1、SM2、SM3和SM4在PHP中的使用,涉及对称加密、非对称加密、消息摘要以及与AES、RSA等算法的比较。以实际代码演示了如何使用SM2进行签名和SM4进行对称加密,同时提及了与OpenSSL的兼容性。
最低0.47元/天 解锁文章
3261

被折叠的 条评论
为什么被折叠?



