简单理解数字签名和验签

数字签名:

         “数字签名(又称公钥数字签名、电子签章)是一种类似写在纸上的普通的物理签名,但是使用了公钥加密领域的技术实现,用于鉴别数字信息的方法。一套数字签名通常定义两种互补的运算,一个用于签名,另一个用于验证。数字签名,就是只有信息的发送者才能产生的别人无法伪造的一段数字串,这段数字串同时也是对信息的发送者发送信息真实性的一个有效证明。数字签名是非对称密钥加密技术与数字摘要技术的应用。”

 

简解签名和验签:

          服务器有两把钥匙一把公钥、一把私钥。客户端想和服务器达到秘密交流就需要服务器特有的公钥进行加密这样别人就不知道你发送的是什么,服务器收到客户端的信息后用特有的私钥解密就能看到信息内容。服务器要给客户端返回消息,这时候就会使用Hash函数对信息生成一个摘要(Digest),用私钥对摘要加密生成数字签名(Signature),将消息和数字签名一起返回给客户端。客户端收到返回后,先使用公钥对数字签名解密得到摘要,再将信息通过Hash函数生成摘要,只要这两个摘要相同则证明该信息是中途没有被篡改过的。

         值得注意的是,这样也容易出现信息泄漏。因为数字签名一被更换也就不能确定是否为真实的信息发起者发出的信息了。所以为了证明服务器的数字签名是否为真实的,服务器需要将公钥进行认证,会有一个数字证书,这个证书证明了这个公钥就是这台服务器独有的。服务器返回消息的时候会将数字证书一起发送过来,客户端接收到后就可以使用证书中心声明的公钥去解开数字证书来得到这台服务器的公钥。就能判断是否为真实的公钥了。然后客户端就可以使用证书中的服务器公钥,对信息进行加密,然后与服务器交换加密信息。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
RSA数字签名和验是一种非对称加密技术,可以实现对数据的安全传输和验证。在C++中可以通过openssl库来实现RSA数字签名和验。 下面是RSA数字签名和验的C++代码示例: ```c++ #include <openssl/rsa.h> #include <openssl/pem.h> #include <openssl/err.h> #include <string> using namespace std; // RSA数字签名 string rsa_sign(const string& data, const string& private_key_file) { RSA* rsa = NULL; FILE* fp = NULL; string sign_data; if ((fp = fopen(private_key_file.c_str(), "r")) == NULL) { return ""; } rsa = PEM_read_RSAPrivateKey(fp, NULL, NULL, NULL); if (rsa == NULL) { ERR_print_errors_fp(stderr); fclose(fp); return ""; } unsigned char sha256_data[SHA256_DIGEST_LENGTH]; SHA256((const unsigned char*)data.c_str(), data.length(), sha256_data); unsigned int sign_len = RSA_size(rsa); unsigned char* sign = new unsigned char[sign_len]; memset(sign, 0, sign_len); if (RSA_sign(NID_sha256, sha256_data, SHA256_DIGEST_LENGTH, sign, &sign_len, rsa) == 1) { sign_data.assign((char*)sign, sign_len); } RSA_free(rsa); fclose(fp); delete[] sign; return sign_data; } // RSA验签 bool rsa_verify(const string& data, const string& sign_data, const string& public_key_file) { RSA* rsa = NULL; FILE* fp = NULL; bool result = false; if ((fp = fopen(public_key_file.c_str(), "r")) == NULL) { return false; } rsa = PEM_read_RSA_PUBKEY(fp, NULL, NULL, NULL); if (rsa == NULL) { ERR_print_errors_fp(stderr); fclose(fp); return false; } unsigned char sha256_data[SHA256_DIGEST_LENGTH]; SHA256((const unsigned char*)data.c_str(), data.length(), sha256_data); result = RSA_verify(NID_sha256, sha256_data, SHA256_DIGEST_LENGTH, (unsigned char*)sign_data.c_str(), sign_data.length(), rsa); RSA_free(rsa); fclose(fp); return result; } ``` 其中,`rsa_sign`函数实现RSA数字签名,`data`参数为需要名的数据,`private_key_file`参数为私钥文件路径,函数返回名后的数据。`rsa_verify`函数实现RSA验签,`data`参数为原始数据,`sign_data`参数为名后的数据,`public_key_file`参数为公钥文件路径,函数返回验签结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值