数字签名的原理和应用

1.数字签名的原理

在日常生活中,签名的意义就是签完你的名后,别人可以知道这件事是你做的,而由于每个人笔迹不同,你也无法否认这个名字是你签的。同真实的签名一样,数字签名也是用来证明某条信息是本人发的,而且本人不可抵赖,他人不可伪造。

通常是用非对称加密(RSA)实现数字签名,分为以下几个步骤:
1.计算消息的摘要M
2.发送方用自己的私钥d对M进行加密,得到S(这里叫作签名,因为M不是一个需要加密的信息,加密的目的是签名),随消息一起发出
3.消息发送之后,接收方对消息计算摘要M,再用发送方的公钥对S解密de’da,如果S==M,则说明是发送方发的,由于其他人不知道d的值,所以其他人无法仿造这个加密,而只有发送方知道d,他也无法否认这条信息是他发的

2.先加密还是先签名?

在上面这个过程中,如果在传输过程,发送方想要对M加密,只让接收方知道这个信息,那他就要对M用接收方的公钥加密,那是先签名还是先加密嘞?
1.假设先加密再签名
这时候中间人出现了,他截取到这个信息,用发送方的公钥解密后,得到消息摘要,这时候,中间人就可以用自己的私钥对这个信息再重新签名了啊!这就是中间人攻击,接收方收到的消息是正确的,但是他却无法判断消息的发送者是谁。
2.假设先签名再加密
显然更安全,只有接收方能得知这个签名后的消息摘要M2,可以保证不会被篡改。

3.应用

1.网站认证使用数字签名
我们访问csdn网站,那怎么知道这个网站是不是真的是csdn呢?
在这里插入图片描述
就是使用数字签名了,csdn将自己的公钥公开出去,并声明只有自己持有私钥,那用户就可以用公钥对签名解密,比对是否与摘要相同,来判断该网站是否为真正的csdn

2.保证数据完整性
软件厂商为了保证自己代码不被他人更改,会对数据计算摘要后签名。在运行时先检查是否解密后的S与当前数据的摘要相同,如果代码或数据被篡改过,那么解密后的签名显然不会与当前摘要相等。同时,其他人不知道我们的私钥,也无法修改后重新签名。

3.比特币
比特币是一种完全匿名的数字货币,它的身份认证是基于ECDSA。比特币的账户地址就是对公钥计算摘要得到的,向全世界公布。而确认你是账户拥有者的唯一办法就是看你有没有账户对应的私钥。对于比特币中的任意一个交易记录,只有当其中付款方的签名是有效的,它才是有效的。如果账户私钥丢失,那么你将永远地失去里面的钱(相当于银行卡丢了,没法跟别人再交易了);一旦被黑客盗取,里面的钱就完全归黑客所有(黑客可以用私钥签名,交易,相当于黑客仿造你的笔迹跟别人签合同)。

实际上不止rsa一种方法实现数字签名,非对称加密中还有DSA(基于离散对数问题),ECDSA(DSA的一个变种,基于椭圆曲线上的离散对数问题)也可用于签名,但过程较rsa更为复杂,不作讨论

  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
RSA数字签名是一种常见的数字签名算法,其基本原理是使用私钥对消息的哈希值进行加密,得到数字签名,然后将数字签名和原始消息一起发送给验证者,验证者使用相应的公钥解密数字签名,得到消息的哈希值,并重新计算消息的哈希值,如果两个哈希值一致,则说明数字签名是合法的。 在Python中,我们可以使用`cryptography`库来实现RSA数字签名。以下是一个简单的示例代码: ```python from cryptography.hazmat.primitives import hashes from cryptography.hazmat.primitives.asymmetric import padding from cryptography.hazmat.primitives.asymmetric import rsa # 生成RSA密钥对 private_key = rsa.generate_private_key( public_exponent=65537, key_size=2048 ) public_key = private_key.public_key() # 签名消息 message = b"Hello World!" hash_algorithm = hashes.SHA256() signature = private_key.sign(message, padding.PSS(mgf=padding.MGF1(hash_algorithm), salt_length=padding.PSS.MAX_LENGTH), hash_algorithm) # 验证签名 try: public_key.verify(signature, message, padding.PSS(mgf=padding.MGF1(hash_algorithm), salt_length=padding.PSS.MAX_LENGTH), hash_algorithm) print("Signature is valid.") except: print("Signature is invalid.") ``` 在上述代码中,我们首先生成了一个2048位的RSA密钥对,并使用私钥对消息进行签名,然后使用相应的公钥对签名进行验证,判断签名是否合法。在签名和验证过程中,我们使用了SHA256哈希算法和PSS填充方案。这里需要注意的是,在实际应用中,我们还需要对消息进行编码和解码,以保证数据的正确性。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值