OpenSSL学习(Secure Socket Layer)2023/11/13

发布时间 2023-11-13 20:37:17作者: 20232313-吴至远

示例OpenSSL版本为

OpenSSL 3.0.2 15 Mar 2022 (Library: OpenSSL 3.0.2 15 Mar 2022)

别搞错了!搞错容易在sm2签名验签出问题

生成自签名证书

openssl req -x509 -newkey rsa:2048 -keyout mykey.pem -out mycert.pem -days 365

req: 表示进行证书请求和生成。
-x509: 表示生成自签名证书。
-newkey rsa:2048: 表示使用 RSA 算法生成一个新的私钥,长度为 2048 位。
-keyout mykey.pem: 表示将生成的私钥保存到 mykey.pem 文件中。
-out mycert.pem: 表示将生成的证书保存到 mycert.pem 文件中。
-days 365: 表示证书的有效期为 365 天

sm2加密解密

openssl ecparam -name SM2 -genkey -out sm2-key.pem
生成一个包含 SM2 密钥对的文件 'sm2-key.pem'.

echo "Hello, SM2 encryption!" > plaintext.txt
openssl pkeyutl -in plaintext.txt -out ciphertext.sm2 -inkey sm2-key.pem -encrypt//加密
openssl pkeyutl -in ciphertext.sm2 -out decrypted.txt -inkey sm2-key.pem -decrypt//解密

密钥由 SM2 私钥派生。使用 SM2 公钥对明文进行加密。加密后的结果存储在 ciphertext.sm2 文件中。
decrypted.txt 是解密后的明文文件,从而还原出原始的明文。

额外的批注:sm2由于OpenSSL傻逼版本的原因,很多指令是混淆的,而且由于签名算法不同、userid 不同、摘要算法不同等原因会出现不能验证、无法签名的一系列问题,谨慎对待。

生成私钥公钥

openssl ecparam -genkey -name SM2 -out pri.key
openssl ec -in pri.key -pubout -out pub.key

生成sm2私钥,然后从sm2私钥里面生成公钥。

签名验签

openssl pkeyutl -sign -in data -inkey pri.key -out pkeysig -rawin -digest sm3
openssl pkeyutl -verify -pubin -in data -inkey pub.key -sigfile pkeysig -rawin -digest sm3

使用 OpenSSL 中的 pkeyutl 工具进行 SM2 数字签名,使用 SM2 公钥验证数字签名.

openssl dgst -sm3 -sign pri.key -out dgstsig -sigopt distid:1234567812345678 data
openssl dgst -sm3 -verify pub.key -signature dgstsig -sigopt distid:1234567812345678 data

对数据进行 SM3 散列,然后使用 SM2 私钥对该散列值进行数字签名,并将签名输出到 dgstsig 文件中.再使用 OpenSSL 中的 openssl dgst 工具进行 SM3 摘要验证,验证 data 文件的 SM3 摘要是否与 dgstsig 中的数字签名相匹配,使用的公钥为 pub.key。签名选项中的 distid:1234567812345678 表示分布式标识的参数。

计算文件的Hash值

echo -n "Hello, SM3 hash!" | openssl dgst -sm3 -binary | xxd -p

计算字符串的Hash值。

echo -n "File content for SM3 hash" > myfile.txt
openssl dgst -sm3 -binary -out hash.sm3 myfile.txt

这将创建一个名为 myfile.txt 的文件,并将字符串 "File content for SM3 hash" 写入其中。
计算 myfile.txt 文件的 SM3 哈希值,并将结果保存在名为"hash.sm3"的文件中。

sm4加密解密

生成 SM4 密钥和 初始化向量IV
openssl rand -hex 16 > sm4-key.txt//生成密钥
openssl rand -hex 16 > sm4-iv.txt//生成初始化向量IV
字符串加密解密
echo -n "Hello, SM4 encryption!" | openssl enc -sm4-cbc -e -K $(cat sm4-key.txt) -iv $(cat sm4-iv.txt) -out encrypted.sm4
openssl enc -sm4-cbc -d -K $(cat sm4-key.txt) -iv $(cat sm4-iv.txt) -in encrypted.sm4

文件加密解密
echo -n "File content for SM4 encryption" > myfile.txt
openssl enc -sm4-cbc -e -K $(cat sm4-key.txt) -iv $(cat sm4-iv.txt) -in myfile.txt -out encrypted-file.sm4
openssl enc -sm4-cbc -d -K $(cat sm4-key.txt) -iv $(cat sm4-iv.txt) -in encrypted-file.sm4 -out decrypted-file.txt

类似sm2,在此不再赘述。

参考资料