生成密钥对
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
完整例子
这是一个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