SECURE BOOT 04 加密学基础:数字签名收发

62 阅读2分钟

生成密钥对

rsa

# 生成2048位的RSA私钥(PEM格式, rsa_private_key.pem)
openssl genpkey -algorithm RSA -out rsa_key/rsa_private_key.pem -pkeyopt rsa_keygen_bits:2048

# 从私钥提取公钥 (rsa_public_key.pem)
openssl rsa -pubout -in rsa_key/rsa_private_key.pem -out rsa_key/rsa_public_key.pem

ecc

# 生成secp256k1曲线的ECC私钥
openssl ecparam -name secp256k1 -genkey -noout -out ecc_private_key.pem

# 从私钥提取公钥
openssl ec -in ecc_private_key.pem -pubout -out ecc_public_key.pem

数字签名

准备待发送文件

echo "This is a secret message." > original_data.txt
# 计算文件的SHA-256哈希并用私钥签名(RSA示例)
openssl dgst -sha256 -sign private_key.pem -out signature.bin original_data.txt

# 或使用ECC私钥签名
openssl dgst -sha256 -sign ecc_private_key.pem -out signature.bin original_data.txt

(可选)将签名转为Base64文本方便传输

openssl base64 -in signature.bin -out signature.txt

验证签名

# 使用RSA公钥验证
openssl dgst -sha256 -verify public_key.pem -signature signature.bin document.txt

# 使用ECC公钥验证
openssl dgst -sha256 -verify ecc_public_key.pem -signature signature.bin document.txt



完整例子

image.png 这是一个bash脚本,可以直接在bash中运行。若显示Verified OK 签名有效,数据未被篡改。交互步骤可以参考脚本里的注释。

若显示 Verification Failure 签名无效(数据或签名被修改)

mkdir -p rsa_key/
# 生成2048位的RSA私钥(PEM格式, rsa_private_key.pem)
openssl genpkey -algorithm RSA -out rsa_key/rsa_private_key.pem -pkeyopt rsa_keygen_bits:2048

# 从私钥提取公钥 (rsa_public_key.pem)
openssl rsa -pubout -in rsa_key/rsa_private_key.pem -out rsa_key/rsa_public_key.pem

# 准备待发送文件
echo "This is a secret message." > original_data.txt

# 计算文件的SHA-256哈希并用私钥签名(RSA示例,产生签名文件signature.bin)     
openssl dgst -sha256 -sign rsa_key/rsa_private_key.pem -out signature.bin original_data.txt

# (可选)将签名转为Base64文本方便传输
openssl base64 -in signature.bin -out signature.txt

# 注意:发送给对方的文件包括 原始文件original_data.txt、签名文件signature.txt 、公钥rsa_kay/rsa_public_key.pem
mkdir -p recv
cp ./original_data.txt ./recv/
cp ./signature.txt ./recv/
cp ./rsa_key/rsa_public_key.pem ./recv/

# 接收方验证签名
# 如果签名是Base64格式,先解码为二进制
cd ./recv/
openssl base64 -d -in signature.txt -out received_signature.bin

# 使用公钥验证签名
# 若显示Verified OK 签名有效,数据未被篡改。
# 若显示 Verification Failure 签名无效(数据或签名被修改)
openssl dgst -sha256 -verify rsa_public_key.pem -signature received_signature.bin original_data.txt