近年来,为摆脱对国外技术和产品的过度依赖,建设行业网络安全环境,增强我国行业信息系统安全、可靠的能力,国家有关机关和监管机构站在国家安全和长远战略的高度提出了“推动国密算法应用实施、加强行业安全可控”的要求。
密码算法是保障信息安全的核心技术,支持和应用国密算法不仅保障了算法的安全性,避免了陷门,而且高度符合国家安全战略布局要求。
常见的国密算法
常见的国密算法主要有SM1,SM2,SM3,SM4,SM7,SM9。
其中SM1是对称加密算法中的分组加密算法,其强度与AES相当,但是该算法不公开,仅以IP核的形式存在于芯片中;
SM2是一种椭圆曲线密码公钥密码算法,其密钥长度256bits,包含数字签名、密钥交换和公钥加密;
SM3用于替代MD5/SHA-1/SHA-2等国际算法,适用于数字签名和验证、消息认证码的生成与验证以及随机数的生成;
SM4与SM1类似,是我国自主设计的分组对称密码算法,用于替代DES/AES等国际密码算法,与AES算法具有相同的密钥长度、分组长度;
SM7是一种分组密码算法,该算法未公开,适用于非接触IC卡,应用包括身份识别类应用(门禁卡、工作证、参赛证),支付与通卡类应用等;
SM9是基于标识的非对称密码算法,用椭圆曲线对实现的基于标识的数字签名算法、密钥交换协议、密钥封装机制和公钥加密与解密算法。
实际中常用的国产密码算法,主要包括SM1,SM2,SM3,SM4。
AntDB中的国密算法
AntDB目前实现的国密算法有SM3、SM4两种。
SM3算法
SM3是我国自研的一种密码散列函数标准,由国家密码管理局于2010年12月17日发布。在商用密码体系中,SM3主要用于数字签名的生成及验证、消息认证码生成及验证、随机数生成等,其安全性及效率与SHA-256相当。
SM3算法采用Merkle-Damgard结构,消息分组长度为512位,摘要值长度为256位。SM3杂凑算法经过填充、迭代压缩,最后生成长度为256比特的杂凑值。
AntDB在内核中实现了SM3算法。支持对字符串类型和bytea类型的数据做摘要计算。登录到AntDB后,可以通过select 语句来调用SM3算法做消息摘要。
AntDB中提供以下函数供用户使用:
表1:antdb的sm3函数
使用方法:
postgres=# select adb_sm3('abcdefg');
adb_sm3
--------------------------------------------------------------------
\x08b7ee8f741bfb63907fcd0029ae3fd6403e6927b50ed9f04665b22eab81e9b7
(1 row)
postgres=#
postgres=# select adb_sm3('12345678'::bytea);
adb_sm3
--------------------------------------------------------------------
\x0fffff81e971fa3f09107abf77931463fc0710bfb8962efeae3d5654b073bb0c
(1 row)
postgres=#
AntDB中的SM3算法主要经过参数校验、填充、迭代压缩,最后生成杂凑值。
1、参数校验
通过在pg_proc.dat中指定函数的参数类型,利用AntDB解析SQL时,会对函数原型进行匹配,自动排除不满足参数类型的输入。
2、填充
输入消息m的长度为l,首先在消息末尾添加比特’1’ ,再添加k个0,k需要满足l+1+k = 448(mod 512)的最小的非负整数。再在末尾添加长度为64bits的数,其值为长度l。
3、迭代压缩
将消息512bits分为一组,使用压缩函数CF对每一分组进行处理,并将结果存在8个32bits寄存器中,循环处理完所有分组后,寄存器中的值即为最后的摘要值。
图1:SM3加密流程
SM4算法
SM4是我国自主设计的分组对称密码算法,由国家密码管理局于2012年3月21日发布,用于实现数据的加密和解密,以保证数据和信息的机密性。SM4是一种Feistel结构的分组密码算法,其分组长度和密钥长度均为128bits。
SM4算法使用128位的加密密钥,并采用32轮迭代加密结构,每一轮加密使用一个32位的轮密钥,共使用32个轮密钥。因此需要使用密钥扩展算法,由加密密钥生成32个轮密钥。SM4解密过程与加密过程算法相同,但是轮密钥使用的顺序与加密是相反的。
分组密钥的工作模式相当于分组密码算法的框架,它决定了采用那种流程对明文或密文进行处理,常见的工作模式有ECB,CBC,CFB,OFB,CTR,这里简要介绍ECB和CBC。
ECB(电子密码本)模式,需要加密的消息按照块密码的大小被分为多个块,并对每个块进行独立加密,其过程如下图所示。
CBC(密钥分组链接)模式,每个明文块先与前一个密文块进行异或后,再进行加密,其过程如下图所示。
图2:ECB加密过程
图3:CBC加密过程
AntDB在内核中实现了SM4算法,目前默认采用的工作模式为CBC,同时也支持EBC,并使用pkcs7算法对不足128bits的数据进行填充。对于明文plaintext,支持字符串类型和bytea类型的数据。
AntDB中提供以下SM4加密函数供用户使用:
表2:antdb的sm4加密函数
AntDB中提供以下SM4解密函数供用户使用:
表3:antdb的sm4解密函数
使用方法:
postgres=# select adb_sm4_encrypt('AntDB@1234','I love china');
adb_sm4_encrypt
------------------------------------
\x821e1666416aef5bd4586c99c7e9a738
(1 row)
postgres=#
postgres=# select adb_sm4_decrypt('AntDB@1234','\x821e1666416aef5bd4586c99c7e9a738');
adb_sm4_decrypt
-----------------
I love china
(1 row)
postgres=#
postgres=# select adb_sm4_encrypt('AntDB@1234','I love china',1);
adb_sm4_encrypt
------------------------------------
\xe81340ab0e578933ef32e96e6bd1f7cf
(1 row)
postgres=#
postgres=#
postgres=# select adb_sm4_decrypt('AntDB@1234','\xe81340ab0e578933ef32e96e6bd1f7cf',1);
adb_sm4_decrypt
-----------------
I love china
(1 row)
postgres=#
AntDB中SM4的加密主要经过密码校验、参数校验、数据填充、32轮密钥扩展、32轮迭代算法、反序变换、最后生成密文。
解密主要经过密码校验、参数校验、32轮密钥扩展、32轮迭代算法、反序变换、丢弃填充、最后变成明文。
1、密码校验
首先验证用户输入的密码格式是否正确,须满足:8~16个字符,必须包含数字,字母大小写,特殊字符中的三种及以上。然后将用户输入的密钥进行扩展:不足16个字符,从首个字符进行拷贝填充至16个字符。
2、参数校验
通过在pg_proc.dat中指定加解密函数的参数类型,利用AntDB解析SQL时,会对函数原型进行匹配,自动排除不满足参数类型的输入。
3、32轮密钥扩展
因加解密过程须经过32轮迭代,每轮都需要一个32bit的密钥,所以需要将原始128bits的密码扩展为32个32bits的密钥。SM4加密解密过程中使用的轮密钥是相同的,只是解密使用轮密钥的顺序与加密使用轮密钥顺序相反。
4、数据填充
AntDB中使用PKCS7算法对加密数据进行填充,即以16 bytes划分数据,对于尾部不满16 bytes的数据,用“16-尾部数据长度”的字符值进行填充。如果正好为16的倍数,则需要填充16位0x10。
5、32轮迭代运算
将每组的数值分为4个32bits的值,再结合轮密钥做异或换位运算。
6、反序变换
将每组的4个32bit的值,顺序逆置,如w1w2w3w4变为w4w3w2w1。
图4:SM4加解密流程
关于亚信安慧AntDB数据库
AntDB数据库始于2008年,在运营商的核心系统上,服务国内24个省市自治区的数亿用户,具备高性能、弹性扩展、高可靠等产品特性,峰值每秒可处理百万笔通信核心交易,保障系统持续稳定运行超十年,并在通信、金融、交通、能源、物联网等行业成功商用落地。