数字签名工作流程

    如果利用非对称加密算法进行双方通信,会引入第三方攻击。比如有通信双方A和B,A和B的公钥大家都可以得到。

A主动和B通信,先获取B的公钥

 

A -->B , 用B的公钥加密,并且把自己的公钥附在后面

B-->A,  B接收到后,同时也获取A的公钥,用A的公钥加密发送回A

 

这样就可以防止第三者监听发送者的内容。但问题是无法解决第三者攻击,比如中间有一个M,M冒充A给B发送内容。

事实上无法解决对方到底是谁的问题!

 

解决方法是发送内容进行二次加密,并且通讯双方有可靠的途径知道对方的公钥

A发送给B时候,先用A的私钥加密,然后再用B的公钥加密

B收到后,先用B的私钥解密,再用A的公钥解密,得到明文。

 

获取公钥的可靠途径不一样,就可以有不容的实现方式

1。通信双方事先有对方的公钥,这种方法比较麻烦,要面对面交换。显然不适合大规模应用,用在夫妻之间到是比较好的!

2。第三方的数字签名,这个就比较好了,大家都把公钥放在第三方CA那里,通信发起方问CA要双方的公钥,并传给对方。

比如A发起请求给B。 A先去第三放CA那边请求B的公钥,CA返回给A后,A用私钥加密给B,B收到后在传给CA解密,解密后传回给B。B由此知道A的公钥,同时也可以验证A传过的来的自己的公钥对不对。

 

中间人攻击不可能了:无法冒充A了,B无法用A的公钥解开任何冒充A的中间人。

A抵赖不可能:B收到后,出示加密后的报文即可,只有A有自己的私钥。 

B不能说没收到:去过第三方了,或者已经A把收到的B过来过的报文出示就行,因为只有B自己有私钥。 

 

这篇文章用java实现了, 不错 http://blog.youkuaiyun.com/lijiecong/archive/2011/04/21/6337932.aspx

 

数字签名工作流程主要包含签名生成和签名验证两个阶段: ### 签名生成阶段 1. **生成密钥对**:使用非对称加密算法(如 RSA、ECC 等)生成一对密钥,即私钥和公钥。私钥由签名者秘密保存,公钥则可以公开。 2. **计算消息摘要**:对要签名的消息使用哈希函数(如 SHA - 256)计算出消息的摘要。哈希函数会将任意长度的消息转换为固定长度的摘要,不同的消息通常会产生不同的摘要。 3. **使用私钥加密摘要**:签名者使用自己的私钥对计算得到的消息摘要进行加密加密后的结果就是数字签名。 以下是一个使用 Python 的`cryptography`库生成数字签名的示例代码: ```python from cryptography.hazmat.backends import default_backend from cryptography.hazmat.primitives.asymmetric import rsa, padding from cryptography.hazmat.primitives import hashes # 生成私钥 private_key = rsa.generate_private_key( public_exponent=65537, key_size=2048, backend=default_backend() ) # 获取公钥 public_key = private_key.public_key() # 待签名的消息 message = b"Hello, World!" # 计算消息摘要并签名 signature = private_key.sign( message, padding.PSS( mgf=padding.MGF1(hashes.SHA256()), salt_length=padding.PSS.MAX_LENGTH ), hashes.SHA256() ) ``` ### 签名验证阶段 1. **接收消息和签名**:接收者收到消息和对应的数字签名。 2. **计算消息摘要**:接收者使用与签名者相同的哈希函数对收到的消息计算摘要。 3. **使用公钥解密签名**:接收者使用签名者的公钥对数字签名进行解密,得到签名者计算的消息摘要。 4. **比较摘要**:将自己计算的消息摘要与解密得到的消息摘要进行比较,如果两者相同,则签名验证通过,说明消息在传输过程中未被篡改,且确实是由持有对应私钥的签名者发出的;否则,签名验证失败。 以下是验证数字签名的示例代码: ```python try: public_key.verify( signature, message, padding.PSS( mgf=padding.MGF1(hashes.SHA256()), salt_length=padding.PSS.MAX_LENGTH ), hashes.SHA256() ) print("签名验证成功") except: print("签名验证失败") ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值