# gmssl命令行工具示例
本部分将结合一些典型的应用场景对gmssl命令行工具的具体使用方法进行介绍,具体每个命令行的功能及使用方法请参看上一部分。
# SM2算法
# SM2密钥对生成
生成SM2私钥sm2.pem,公钥sm2pub.pem
gmssl sm2keygen -pass 1234 -out sm2.pem -pubout sm2pub.pem
# SM2加密解密
首先生成SM2公私钥对
gmssl sm2keygen -pass 1234 -out sm2.pem -pubout sm2pub.pem
然后使用SM2私钥、私钥加密口令对数据进行签名
echo hello | gmssl sm2sign -key sm2.pem -pass 1234 -out sm2.sig
id默认为1234567812345678,也可以手动指定
echo hello | gmssl sm2sign -key sm2.pem -pass 1234 -out sm2.sig -id 1234567812345678
# SM2签名验签
生成SM2公私钥对
gmssl sm2keygen -pass 1234 -out sm2.pem -pubout sm2pub.pem
使用SM2私钥、私钥加密口令对数据进行签名
echo hello | gmssl sm2sign -key sm2.pem -pass 1234 -out sm2.sig
id默认为1234567812345678,也可以手动指定
echo hello | gmssl sm2sign -key sm2.pem -pass 1234 -out sm2.sig -id 1234567812345678
使用SM2公钥进行验签
echo hello | gmssl sm2verify -pubkey sm2pub.pem -sig sm2.sig -id 1234567812345678
# SM3算法
使用SM3算法对Linux 管道的数据进行哈希
echo -n abc | gmssl sm3
当指定-pubkey的时候,表示生成SM2签名所需的中间结果
gmssl sm2keygen -pass 1234 -out sm2.pem -pubout sm2pub.pem
echo -n abc | gmssl sm3 -pubkey sm2pub.pem
使用指定的key,对Linux管道的数据计算SM3 的HMAC
echo -n abc | gmssl sm3hmac -key 11223344556677881122334455667788
# SM4算法
设置SM4加密解密用到的参数
KEY=11223344556677881122334455667788
IV=11223344556677881122334455667788
使用SM4 CBC模式对管道的数据进行加密解密,可以使用-in参数指定加密的文件,-out参数指定输出的文件
echo hello | gmssl sm4 -cbc -encrypt -key $KEY -iv $IV -out sm4.cbc
gmssl sm4 -cbc -decrypt -key $KEY -iv $IV -in sm4.cbc
使用SM4 CTR模式,对管道的数据进行加密解密,可以使用-in参数指定加密的文件,-out参数指定输出的文件
echo hello | gmssl sm4 -ctr -encrypt -key $KEY -iv $IV -out sm4.ctr
gmssl sm4 -ctr -decrypt -key $KEY -iv $IV -in sm4.ctr
# SM9算法
# SM9签名验签
初始化生成SM9 主公钥sign_mpk.pem、主私钥sign_msk.pem
gmssl sm9setup -alg sm9sign -pass 1234 -out sign_msk.pem -pubout sign_mpk.pem
使用主私钥生成用户alice的用户私钥alice.pem,并使用outpass参数指定的口令加密
gmssl sm9keygen -alg sm9sign -in sign_msk.pem -inpass 1234 -id alice -out alice.pem -outpass 1234
使用用户alice的用户私钥对数据进行签名,生成签名hello.sig
echo hello | gmssl sm9sign -key alice.pem -pass 1234 -out hello.sig
使用主公钥sign_mpk.pem对签名数据进行验签
echo hello | gmssl sm9verify -pubmaster sign_mpk.pem -id alice -sig hello.sig
# SM9加密解密
初始化生成SM9 主公钥enc_mpk.pem、主私钥enc_msk.pem
gmssl sm9setup -alg sm9encrypt -pass 1234 -out enc_msk.pem -pubout enc_mpk.pem
使用主私钥生成用户bob的用户私钥bob.pem,并使用outpass参数指定的口令加密
gmssl sm9keygen -alg sm9encrypt -in enc_msk.pem -inpass 1234 -id bob -out bob.pem -outpass 1234
使用主公钥以及用户bob的id进行加密,生成加密文件hello.der
echo hello | gmssl sm9encrypt -pubmaster enc_mpk.pem -id bob -out hello.der
使用用户bob的私钥对加密文件进行解密
gmssl sm9decrypt -key bob.pem -pass 1234 -id bob -in hello.der
# ZUC算法
# ZUC加密解密
由于ZUC算法是对称加密算法,所以加密解密的操作是一样的。
设置ZUC算法加密所需的秘钥和IV
KEY=11223344556677881122334455667788
IV=11223344556677881122334455667788
使用秘钥和IV对数据进行加密和解密
echo hello | gmssl zuc -key $KEY -iv $IV -out zuc.bin
gmssl zuc -key $KEY -iv $IV -in zuc.bin
# CA
# 根CA自签发证书
首先生成CA根证书私钥rootcakey.pem,然后进行自签名,生成根证书rootcacert.pem
gmssl sm2keygen -pass 1234 -out rootcakey.pem
gmssl certgen -C CN -ST Beijing -L Haidian -O PKU -OU CS -CN ROOTCA -days 3650 -key rootcakey.pem -pass 1234 -out rootcacert.pem -key_usage keyCertSign -key_usage cRLSign
查看生成的自签名证书rootcacert.pem
gmssl certparse -in rootcacert.pem
# 根CA签发二级CA证书
首先生成二级CA的证书私钥,然后生成证书请求careq.pem,然后由根CA进行签名,生成二级CA的证书cacert.pem
gmssl sm2keygen -pass 1234 -out cakey.pem
gmssl reqgen -C CN -ST Beijing -L Haidian -O PKU -OU CS -CN "Sub CA" -days 3650 -key cakey.pem -pass 1234 -out careq.pem
gmssl reqsign -in careq.pem -days 365 -key_usage keyCertSign -path_len_constraint 0 -cacert rootcacert.pem -key rootcakey.pem -pass 1234 -out cacert.pem
查看生成的二级CA证书cacert.pem
gmssl certparse -in cacert.pem
# 二级CA签发用户证书
首先生成用户私钥,并通过用户私钥生成证书请求encreq.pem,然后由二级CA进行签发,生成用户证书enccert.pem
gmssl sm2keygen -pass 1234 -out enckey.pem
gmssl reqgen -C CN -ST Beijing -L Haidian -O PKU -OU CS -CN localhost -days 365 -key enckey.pem -pass 1234 -out encreq.pem
gmssl reqsign -in encreq.pem -days 365 -key_usage keyEncipherment -cacert cacert.pem -key cakey.pem -pass 1234 -out enccert.pem
查看生成的用户证书enccert.pem
gmssl certparse -in enccert.pem
将二级CA的证书和用户证书放在一个文件中,形成完整的用户证书文件certs.pem
cat enccert.pem > certs.pem
cat cacert.pem >> certs.pem
# 数字证书
# 生成自签名证书
生成证书公私钥对,然后使用certgen命令生成自签名证书cert.pem
gmssl sm2keygen -pass 1234 -out sm2.pem -pubout sm2pub.pem
gmssl certgen -C CN -ST Beijing -L Haidian -O PKU -OU CS -CN Alice -days 365 -key sm2.pem -pass 1234 \
-key_usage "digitalSignature" -key_usage "keyCertSign" -key_usage cRLSign \
-out cert.pem
# 解析数字证书
gmssl certparse -in cert.pem
# CMS
# CMS加密
使用数字证书cert.pem(数字证书的生成可以参考[[#生成自签名证书]]或者CA相关部分)对plain.txt文件进行加密,生成加密文件enveloped_data.pem
gmssl cmsencrypt -in plain.txt -rcptcert cert.pem -out enveloped_data.pem
# CMS解密
使用私钥key.pem对enveloped data进行解密
gmssl cmsdecrypt -key key.pem -pass 1234 -cert cert.pem -in enveloped_data.pem
# CMS签名
使用证书cert.pem对plain.txt进行签名,输出为signed_data.pem
gmssl cmssign -key key.pem -pass 1234 -cert cert.pem -in plain.txt -out signed_data.pem
# CMS验签
验证signed_data.pem,原始数据输出到signed_data.txt
gmssl cmsverify -in signed_data.pem -out signed_data.txt
# CMS解析
解析CMS签名数据signed_data.pem
gmssl cmsparse -in signed_data.pem
# PBKDF2算法
使用PBKDF2算法,对password 1234 和salt进行6000次哈希计算
gmssl pbkdf2 -pass 1234 -salt 1122334455667788 -iter 60000 -outlen 16