天天看点

C#上位机开发(十八)—— 基于RSA算法实现数字签名与认证(私钥签名,公钥认证)

一、数字签名

数字签名可以识别消息是否被篡改,并验证消息的可靠性,也可以防止否认。

数字签名类似于现实世界中的盖章和签字,它具有以下四大特征:

  • 可验证性:接收者可以验证发送者签名的真实性和有效性;
  • 不可伪造性:除签名者之外,任何人不可伪造签名;
  • 不可否认性:发送方不能否认自己所发送的签名;
  • 数据完整性:能够提供对所签消息的完整性校验;

二、使用openssl生成RSA密钥对

数字签名使用私钥签名,使用公钥验证签名。使用openssl生成签名。

1. 生成私钥

openssl genrsa -out ./rsa_private_key.pem 2048      

2. 私钥转换为PKCS8格式

openssl pkcs8 -topk8 -inform PEM -in ./rsa_private_key.pem -outform PEM -nocrypt -out ./rsa_private_key_pkcs8.pem      

3. 生成公钥

openssl rsa -in ./rsa_private_key.pem -pubout -out rsa_public_key_2048.pub      

最终生成的密钥文件如下:

C#上位机开发(十八)—— 基于RSA算法实现数字签名与认证(私钥签名,公钥认证)

三、C#中使用RSA算法签名与验签

这里折腾了很久,发现了一个比较好的开源仓库,感谢大佬。

仓库链接:​​ WindowsForms私钥签名公钥验签​​。

1. BouncyCastle包

C#上位机开发(十八)—— 基于RSA算法实现数字签名与认证(私钥签名,公钥认证)

2. 运行效果——签名

签名只需要私钥,将PKCS8格式的私钥(rsa_private_key_pkcs8.pem)文件内容复制到工具,对消息进行签名:

C#上位机开发(十八)—— 基于RSA算法实现数字签名与认证(私钥签名,公钥认证)

3. 运行效果——验签

验签需要公钥,将公钥内容(rsa_public_key_2048.pub)复制到工具: