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

示例OpenSSL版本为

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

使用openssl version查看版本,
使用sudo apt updatesudo apt install openssl来更新版本。

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

配合完成作业的大合集更好学习,最好下载一个,只有5MB。

链接:http请s://pan.ba把idu.com/s我/10sB删4uBzeKmr掉GPHCQ谢BDPX谢yw?pwd=你nkrg
提取码:nkrg
链接永久有效

生成自签名证书(与作业无关,完成作业可以直接看下一个'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 不同、摘要算法不同等原因会出现不能验证、无法签名的一系列问题,谨慎对待。

生成SM2私钥公钥

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

生成sm2私钥,然后从sm2私钥里面生成公钥。
sm2是非对称加密,所以有俩钥。一般我们用公钥加密,私钥加密和解密。

签名验签

echo "Hello!" > data.txt
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 表示分布式标识的参数。

使用SM3计算文件的Hash值

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

使用SM3计算字符串的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,在此不再赘述。
但要注意,sm4是对称加密算法,所以没有公钥和私钥之分,所以你可以用sm4进行加密和解密。
如果你可以给我的博客点一个小小的赞我会感激不尽的。

参考资料
posted @ 2023-11-13 20:33  20232313-吴至远  阅读(388)  评论(1编辑  收藏  举报