国密算法
国密算法
概述
国密算法是国家密码局制定标准的一系列算法,包括对称加密算法、椭圆曲线非对称加密算法和杂凑算法,如SM1、SM2、SM3等。SM2为国家密码管理局公布的公钥算法,其加密强度为256位,其它几个重要的商用密码算法如下:
-
SM1:对称加密算法,加密强度为128位,采用硬件实现。
-
SM3:密码杂凑算法,杂凑值长度为32字节,和SM2算法同期公布,详情请参见《国家密码管理局公告(第 22 号)》。
-
SMS4:对称加密算法,随WAPI标准一起公布,可使用软件实现,加密强度为128位。
目的
-
openssl支持国密算法SM2、SM3、SM4。
-
kernel支持加载SM4模块。
-
openss支持国密算法 SM2、SM3、SM4。
术语说明
SM2
SM2算法就是ECC椭圆曲线密码机制,但在签名、密钥交换方面不同于ECDSA、ECDH等国际标准,而是采取了更为安全的机制。另外,SM2推荐了一条256位的曲线作为标准曲线。
SM2算法主要考虑素域Fp和F2m上的椭圆曲线,分别介绍了这两类域的表示、运算,以及域上的椭圆曲线的点的表示、运算和多倍点计算算法。然后介绍了编程语言中的数据转换,包括整数和字节串,字节串和比特串,域元素和比特串,域元素和整数,点和字节串之间的数据转换规则。详细说明了有限域上椭圆曲线的参数生成以及验证,椭圆曲线的参数包括有限域的选取、椭圆曲线方程参数、椭圆曲线群基点的选取等,并给出了选取的标准以便于验证。最后给椭圆曲线上密钥对的生成以及公钥的验证,用户的密钥对为(s,sP),其中s为用户的私钥,sP为用户的公钥,由于离散对数问题从sP难以得到s,并针对素域和二元扩域给出了密钥对生成细节和验证方式。
SM3
SM3密码杂凑(哈希、散列)算法给出了杂凑函数算法的计算方法和计算步骤,并给出了运算示例。此算法适用于商用密码应用中的数字签名和验证,消息认证码的生成与验证以及随机数的生成,可满足多种密码应用的安全需求。此算法对输入长度小于2的64次方的比特消息,经过填充和迭代压缩,生成长度为256比特的杂凑值,其中使用了异或,模,模加,移位,与,或,非运算,由填充,迭代过程,消息扩展和压缩函数所构成。
SM4
此算法是一个分组算法,用于无线局域网产品。该算法的分组长度为128比特,密钥长度为128比特。加密算法与密钥扩展算法都采用32轮非线性迭代结构。解密算法与加密算法的结构相同,只是轮密钥的使用顺序相反,解密轮密钥是加密轮密钥的逆序。
此算法采用非线性迭代结构,每次迭代由一个轮函数给出,其中轮函数由一个非线性变换和线性变换复合而成,非线性变换由S盒所给出。其中rki为轮密钥,合成置换T组成轮函数。轮密钥的产生与上图流程类似,由加密密钥作为输入生成,轮函数中的线性变换不同,还有些参数的区别。
参考资料
-
GB/T 36441-2018 硬件产品与操作系统兼容性规范。
-
GB/T 36465-2018 网络终端操作系统总体技术要求。
-
GB/T 25645-2010 信息技术 中文Linux服务器操作系统技术要求。
-
GB/T 25655-2010 信息技术 中文Linux桌面操作系统技术要求。
-
GB18030-2005《信息技术中文编码字符集》。
-
GB/T 16260-2006 软件工程产品质量。
-
GB/T 25645-2010 中文 Linux 服务器操作系统技术要求。
-
GB/T 32394-2015 中文 Linux 操作系统运行环境扩充要求。
-
GB/T 25000.1-2010《软件工程软件产品质量要求与评价》。
使用方法
kernel
- 在统信服务器操作系统(版本为10xxa时)中
141安装操作系统的最新版本。
142查看“/boot/config-*”中如下配置是否为y。若为y,则sm4已经在内核,如下以x86_64为例查看/boot/config-x86_64:CONFIG_CRYPTO_SM4、CONFIG_CRYPTO_SM4_AESNI_AVX_X86_64、CONFIG_CRYPTO_SM4_AESNI_AVX2_X86_64。
- 在统信服务器操作系统(版本为10xxe时)中
143安装操作系统的最新版本。
144执行modprobe sm4_generic命令,加载该模块。
145执行lsmod | grep sm4命令,查看sm4_generic模块是否加载成功。
openssl
- SM2
146执行如下命令,检查椭圆曲线是否包含SM2。
openssl ecparam -list_curves | grep SM2
147执行如下命令,使用openssl生成SM2公钥和私钥。
openssl ecparam -genkey -name SM2 -out priv.key
openssl ec -in priv.key -pubout -out pub.key
148查看SM2公钥和私钥。
- SM3:SM3是一种利用单向函数构建的密码,只能正向加密,不能逆推解密。
149执行如下命令,进行hamc校验。
echo -n "abc" | openssl dgst -sm3 -hmac "01234567890123456789012345678901"
150执行如下命令,进行非hamc校验。
echo -n "abc" | openssl dgst -SM3
[root@localhost~]#echo -n"abc"| openssldgst -SM3 (stdin)=66c7fof462eeedd9d1f2d46bdc10e4e24167c4875cf2f7a2297da02b8f4ba8e0 [root@localhost~]#)
- SM4
151以1070a x86_64环境为例执行如下命令,检查SM4对称算法。
openssl enc -ciphers | grep sm4
152通过SM4国密算法进行数据加密、解密,并验证是否成功。
(9)执行如下命令,创建文件。
echo UOS > msg.txt
(10)执行如下命令,进行加密。
openssl enc -e -sm4-cbc -pbkdf2 -k 123456 -in msg.txt -out enc_msg.txt
(11)执行如下命令,进行解密。
openssl enc -d -sm4-cbc -pbkdf2 -k 123456 -in enc_msg.txt -out dee_msg.txt
(12)执行如下命令,进行验证。
diff dee_msg.txt msg.txt
cat dee_msg.txt
Openssh
:::note sw64和loongarch64暂不支持。
■SM2:执行如下命令,检查算法key类型是否包含SM2算法。 :::
ssh -Q key
- SM3:执行如下命令,检查密钥交换算法的类型是否包含SM3算法。
ssh -Q kex
- SM4:执行如下命令,检查密码套件的类型是否包含SM4算法。
ssh -Q cipher
- 使用国密算法进行openssh连接
◆配置服务端
(13)在服务端中,执行如下命令,调用ssh-keygen生成主机密钥。
ssh-keygen -t sm2 -m PEM -f /etc/ssh/ssh_host_sm2_key
(14)在“/etc/crypto-policies/back-ends/opensshserver.config”文件中,增加算法标识,示例如下:
CRYPTO_POLICY='-oCiphers=aes256-gcm@openssh.com,chacha20-poly1305@openssh.com,aes256-ctr,aes128-gcm@openssh.com,aes128-ctr,sm4-ctr -oMACs=hmac-sha2-256-etm@openssh.com,hmac-sha1-etm@openssh.com,umac-128-etm@openssh.com,hmac-sha2-512-etm@openssh.com,hmac-sha2-256,hmac-sha1,umac-128@openssh.com,hmac-sha2-512,hmac-sm3 -oGSSAPIKexAlgorithms=gss-curve25519-sha256-,gss-nistp256-sha256-,gss-group14-sha256-,gss-group16-sha512-,gss-gex-sha1-,gss-group14-sha1- -oKexAlgorithms=curve25519-sha256,curve25519-sha256@libssh.org,ecdh-sha2-nistp256,ecdh-sha2-nistp384,ecdh-sha2-nistp521,diffie-hellman-group-exchange-sha256,diffie-hellman-group14-sha256,diffie-hellman-group16-sha512,diffie-hellman-group18-sha512,diffie-hellman-group-exchange-sha1,diffie-hellman-group14-sha1,sm2-sm3 -oHostKeyAlgorithms=ecdsa-sha2-nistp256,ecdsa-sha2-nistp256-cert-v01@openssh.com,ecdsa-sha2-nistp384,ecdsa-sha2-nistp384-cert-v01@openssh.com,ecdsa-sha2-nistp521,ecdsa-sha2-nistp521-cert-v01@openssh.com,ssh-ed25519,ssh-ed25519-cert-v01@openssh.com,rsa-sha2-256,rsa-sha2-256-cert-v01@openssh.com,rsa-sha2-512,rsa-sha2-512-cert-v01@openssh.com,ssh-rsa,ssh-rsa-cert-v01@openssh.com,sm2 -oPubkeyAcceptedKeyTypes=ecdsa-sha2-nistp256,ecdsa-sha2-nistp256-cert-v01@openssh.com,ecdsa-sha2-nistp384,ecdsa-sha2-nistp384-cert-v01@openssh.com,ecdsa-sha2-nistp521,ecdsa-sha2-nistp521-cert-v01@openssh.com,ssh-ed25519,ssh-ed25519-cert-v01@openssh.com,rsa-sha2-256,rsa-sha2-256-cert-v01@openssh.com,rsa-sha2-512,rsa-sha2-512-cert-v01@openssh.com,ssh-rsa,ssh-rsa-cert-v01@openssh.com,sm2 -oCASignatureAlgorithms=ecdsa-sha2-nistp256,ecdsa-sha2-nistp384,ecdsa-sha2-nistp521,ssh-ed25519,rsa-sha2-256,rsa-sha2-512,ssh-rsa -oFingerprintHash=sm3'
(15)在“/etc/ssh/sshd_config”文件中,添加如下内容。
HostKey /etc/ssh/ssh_host_sm2_key
MACs hmac-sm3
KexAlgorithms sm2-sm3
Ciphers sm4-ctr
HostKeyAlgorithms +sm2
PubkeyAcceptedKeyTypes +sm2
FingerprintHash sm3
(16)执行如下命令,重启sshd服务。
systemctl restart sshd
◆配置客户端
(17)在客户端中,执行如下命令,调用ssh-keygen生成主机密钥。
ssh-keygen -t sm2 -m PEM
:::note
系统会将主机密钥默认保存为“/.ssh/id_sm2”和“/.ssh/id_sm2.pub”。
:::
(18)执行如下命令,将公钥发送到服务端。
ssh-copy-id root@${server_ip}
:::note
此处的${server_ip}指的是服务端的IP地址,请根据实际情况填写。
:::
(19)执行如下命令,使用国密算法进行ssh无密码登录。
ssh -o PreferredAuthentications=publickey -o HostKeyAlgorithms=sm2 -o PubkeyAcceptedKeyTypes=sm2 -o Ciphers=sm4-ctr -o MACs=hmac-sm3 -o KexAlgorithms=sm2-sm3 -o FingerprintHash=sm3 -i ~/.ssh/id_sm2 root@${server_ip}
:::note
此处的${server_ip}指的是服务端的IP地址,请根据实际情况填写。
:::
M2key ingerprint is SM:5cAhrtYXOxYyI+yeNZjcFvi36Cwd/f624ms3jmNFE Are you sure you want to continue connecting (yes/no/[fingerprint])? yes Warning: Permanent1y added '10.20.33.43'(SM2) to the list of known hosts, UnionTech 0S Server 20 1060e We1come to OS Server 20 Upgradable packages:0 Upgrade command 1ine: yum upgrade Activate the web console with:systemct1 enable--now cockpit. socket Last login: Wed Oct 18 16:02:51 2023 from 10.20.33.119 Welcome to 4.19.90-2305.1.0.0199.56.ue120.x86_64 2023年10月18日星期三16:06:30CST System information as of time: 0.00 System 1oad: Processes: 211 Memory used: 22.2% Swap used: 0.0% Usage On: 18% IP address: 10.20.33.43 Users online: 3)
No comments to display
No comments to display