1. 国密介绍
国密算法是我国自主研发创新的一套数据加密处理系列算法。从SM1-SM4分别实现了对称、非对称、摘要等算法功能。特别适合应用于嵌入式物联网等相关领域,完成身份认证和数据加解密等功能。当然,默认的前提条件是算法密钥必须保证安全性,因此要将国密算法嵌入到硬件加密芯片中结合使用。
国密即国家密码局认定的国产密码算法。主要有SM1,SM2,SM3,SM4。密钥长度和分组长度均为128位。
SM1 为对称加密。其加密强度与AES相当。该算法不公开,调用该算法时,需要通过加密芯片的接口进行调用。
SM2为非对称加密,基于ECC。该算法已公开。由于该算法基于ECC,故其签名速度与秘钥生成速度都快于RSA。ECC 256位(SM2采用的就是ECC 256位的一种)安全强度比RSA 2048位高,但运算速度快于RSA。
SM3 消息摘要。可以用MD5作为对比理解。该算法已公开。校验结果为256位。
SM4 无线局域网标准的分组数据算法。对称加密,密钥长度和分组长度均为128位。
由于SM1、SM4加解密的分组大小为128bit,故对消息进行加解密时,若消息长度过长,需要进行分组,要消息长度不足,则要进行填充。
2. 实现方法
PHP调用linux命令实现,可实现SM2加解密签名验签,SM3摘要加密,SM4对称加密文件加密,不需要gmssl和PHP编译,变动小。
2. 环境要求
相对来讲,环境要求低,只要下载安装gmssl就好,并且与openssl兼容
其实在openssl1.1.1+上已经实现了国密算法C语言实现,openssl不用多介绍了吧(不知道的好好反思一下),有C扩展经验的同学可以自己实现C扩展,当然可以直接拿C语言实现国密算法的就当笑话看吧,原谅我C语言早还给大学了,所以写C扩展供PHP调用对我来说短时间还是没办法做到,立个flag,C扩展从入门到放弃走起。
但是在本文中并没有使用openssl,而是他的一个分支Gmssl,因为openssl命令行并没有提供SM2的加解密和签名验签(也可能是我没找到,o(╥﹏╥)o)
github:gmsslgit地址
gmssl网站:地址 有点耐心,这网站时不时打不开
3. 安装gmssl
下载gmssl:点击下载
unzip master.zip
cd GmSSL-master/
./config --prefix=/usr/local/gmssl --openssldir=/usr/local/gmssl no-shared //“--prefix=/usr/local/gmssl” 指定安装路径 “no-shared” 只编译静态库,不编译动态库,解决和openssl兼容问题
make
make install
4. bug片段
/**
* php exec请求linux命令拼凑完整结果
*
* @param $command 命令行
*
* @return mixed|string
* @author zhaozl@infogo.com.cn
*/
function cutil_exec($command) {
$str = '';
try {
$res = exec($command, $out);
if ($res) {
foreach ($out as $value) {
$str .= $value;
}
}
}
catch (Exception $e) {
}
return $str;
}
/**
*
* 生成国密SM2非对称加密公钥
*
* @param $key 标识key
* @