算法库
openSSL加密接口
openSSL是常用的密码算法库软件,当前已经支持商密算法SM2/3/4,用户可以通过命令行或API调用商密算法的加解密功能。
前置条件
openSSL大于或等于1.1.1m-6版本:
$ rpm -qa openssl
openssl-1.1.1m-6.oe2209.x86_64
如何使用
场景1:使用命令行调用密码算法
- SM2公钥算法。
生成SM2私钥:
$ openssl ecparam -genkey -name SM2 -out priv.key
根据私钥生成公钥:
$ openssl ec -in priv.key -pubout -out pub.key
read EC key
writing EC key
使用SM2算法对文件进行签名,摘要算法指定为SM3:
$ openssl dgst -sm3 -sign priv.key -out data.sig data
使用公钥进行验签:
$ openssl dgst -sm3 -verify pub.key -signature data.sig data
Verified OK
- SM3摘要算法。
使用SM3算法计算数据摘要:
$ openssl dgst -sm3 data
SM3(data)= a794922bb9f0a034257f6c7090a3e8429801a42d422c21f1473e83b7f7eac385
- SM4对称加密算法。
使用SM4算法对数据进行加密,其中-K和-iv分别指定加密所使用的key值和iv值,通常需要随机生成:
$ openssl enc -sm4 -in data -K 123456789ABCDEF0123456789ABCDEF0 -iv 123456789ABCDEF0123456789ABCDEF0 -out data.enc
使用SM4算法对数据进行解密:
$ openssl enc -d -sm4 -in data.enc -K 123456789ABCDEF0123456789ABCDEF0 -iv 123456789ABCDEF0123456789ABCDEF0 -out data.raw
对比加解密数据,结果一致:
$ diff data data.raw
场景2:使用API调用密码算法
可直接安装openssl-help并查询man手册:
$ yum install openssl-help
$ man sm2
$ man EVP_sm3
$ man EVP_sm4_cbc
内核加密接口
概述
Linux内核的加密算法采用crypto框架管理,不同的算法实现在crypto框架中分别进行注册和调用。openEuler提供的5.10内核提供了对商密算法(SM2/3/4)的支持,其中SM2/3算法默认编译在内核中,SM4算法以内核模块的形式提供。
前置条件
内核大于或等于5.10.0-106版本:
# rpm -qa kernel
kernel-5.10.0-106.1.0.55.oe2209.x86_64
如何使用
场景1:查询内核支持的加密算法
通过/proc/crypto查询已注册的商密算法,其中SM2/SM3算法默认加载:
$ cat /proc/crypto | grep sm3 -A8
name : sm3
driver : sm3-generic
module : kernel
priority : 100
refcnt : 1
selftest : passed
internal : no
type : shash
blocksize : 64
digestsize : 32
$ cat /proc/crypto | grep sm2 -A6
name : sm2
driver : sm2-generic
module : kernel
priority : 100
refcnt : 1
selftest : passed
internal : no
type : akcipher
sm4算法默认不加载,需要先加载对应模块:
$ modprobe sm4-generic
$ cat /proc/crypto | grep sm4 -A8
name : sm4
driver : sm4-generic
module : sm4_generic
priority : 100
refcnt : 1
selftest : passed
internal : no
type : cipher
blocksize : 16
min keysize : 16
max keysize : 16
场景2:算法API调用
商密算法的调用和其他相同类型的算法调用方法一致,可参考Linux内核文档:
https://www.kernel.org/doc/html/v5.10/crypto/userspace-if.html
场景3:指令集优化
Crypto框架支持注册架构相关的算法实现,可以通过特定指令集实现算法性能的优化。当前openEuler 5.10内核支持的指令集优化包括:
驱动 | 指令集支持 | 优先级 |
---|---|---|
sm4-neon(ecb/cbc/cfb/ctr) | ARM64-NEON指令集 | 200 |
sm3-avx | X86-AVX指令集 | 300 |
sm4-aesni-avx (ecb/cbc/cfb/ctr) | X86-AVX指令集 | 400 |
sm4-aesni-avx 2(ecb/cbc/cfb/ctr) | X86-AVX2指令集 | 500 |
当同一个算法注册多个实例时,按照各个算法实例注册的priority选择默认的算法实现,priority数值越大则优先级越高,纯软件的算法实现(后缀为-generic)的priority固定为100。商密算法的指令集优化不默认使能,以内核模块的形式对用户提供,如使能SM3算法的AVX指令集优化的方法为:
$ modprobe sm3-avx
$ cat /proc/crypto | grep sm3 -A8
name : sm3
driver : sm3-avx
module : sm3_avx_x86_64
priority : 300
refcnt : 1
selftest : passed
internal : no
type : shash
blocksize : 64
digestsize : 32
......
注意事项
- 算法指令集优化使能的前提是CPU支持对应指令集,可以通过/proc/cpuinfo接口查询当前CPU支持的指令集;
- 特定指令集的调用本身存在一定开销,因此并不能保证在所有的场景下,指令集优化的性能都高于软件实现;
- 部分指令集优化存在一定限制,如neon指令集仅在支持并行计算的加密模式下存在优化效果。