当前位置 : 主页 > 编程语言 > python >

Python工具箱系列(十九)

来源:互联网 收集:自由互联 发布时间:2022-12-23
有了非对称密钥、摘要、对称密钥等现代密码学算法与技术,是不是就能够保证通信的安全无虞呢,并不是。 密码学在互联网应用的四个目标:机密性、完整性、身份验证、防抵赖。到

有了非对称密钥、摘要、对称密钥等现代密码学算法与技术,是不是就能够保证通信的安全无虞呢,并不是。

密码学在互联网应用的四个目标:机密性、完整性、身份验证、防抵赖。到目前为止,我们讨论的技术中,其中防抵赖的目标并没有达到。

​假设A、B、C三个人共享一个对称加密算法密钥,现在A和B互相通信,A和B一直认为是双方在发送消息。由于C也有同样的密钥,它可以拦截A发往B的消息,然后篡改消息并用同样的密钥加密后发送给B, B能够正确解密,但是该消息其实已经被篡改。

​同样的场景,A、B、C三个人共享一个对称加密算法密钥,A向B发送了一条消息,但是A可以抵赖说这条消息并不是他发送的,理由就是C也有同样的密钥,这条加密消息可能是C发送给B的,B无法向第三方证明是A给他发送了消息。

​在公开密钥算法中,如果算法用于加密解密,也同样不能防止抵赖,以RSA加密算法举例,由于RSA的公钥是完全公开的,RSA私钥拥有者虽然能够解密,但是并不能确认是哪个客户端发送的消息,同理任何人都可以抵赖。

抵赖出现的根本原因就在于通信双方无法确认对方的身份,也就是不能进行身份验证,那么在密码学中有没有对应的解决方案呢?可以使用数字签名技术防抵赖。

在现实世界中,有哪些行为或者约定可以防止人抵赖呢?最明显的就是合同,合同一般需要人签字或者按指纹,考虑签字可以模仿伪造,这里重点用指纹签署的合同来解释。合同一旦由指纹签署了,就可以被复印多份。有了合同,合同签署人就无法否认合同的合法性,原因就在于法律规定,指纹具备唯一性,每个人的指纹是不同的,或者说指纹就代表了一个人。

回到密码学中,如果一个消息也含有特殊的指纹,是否就可以实现防抵赖呢。事实正是如此,在RSA密钥对中,私钥只有密钥对的生成者持有,如果不考虑密钥泄露的问题,私钥拥有者使用密钥(注意不是加密操作)签署一条消息,然后发送给任意的接收方,接收方只要拥有私钥对应的公钥,就能成功反解签署消息,由于只有私钥持有者才能“签署”消息,不能抵赖说这条签署消息不是他发送的,这就是数字签名技术的基本原理。

以下代码显示了签名的过程:

import base64from Crypto.PublicKey import RSAfrom Crypto.Hash import SHAfrom Crypto.Signature import PKCS1_v1_5 as PKCS1_signaturefrom Crypto.Cipher import PKCS1_v1_5 as PKCS1_cipherdef get_key(key_file): with open(key_file) as f: data = f.read() key = RSA.importKey(data) return keydef rsa_private_sign(data,key): signer = PKCS1_signature.new(key) digest = SHA.new() digest.update(data.encode("utf8")) sign = signer.sign(digest) signature = base64.b64encode(sign) signature = signature.decode('utf-8') return signatureprivate_key = get_key('demo_private_key.pem')with open("poetry.txt", "r", encoding='utf-8') as input_file: data = input_file.read() sign = rsa_private_sign(data,private_key) fo = open("sign.txt","w") fo.write(sign)

运行后,将对poetry.txt进行签名,生成签名文件sign.txt。随后使用公共信道将两个文件同时传出,接收方使用这两个文件来验证是否发生了篡改。

相关代码如下所示:

import base64from Crypto.PublicKey import RSAfrom Crypto.Hash import SHAfrom Crypto.Signature import PKCS1_v1_5 as PKCS1_signaturefrom Crypto.Cipher import PKCS1_v1_5 as PKCS1_cipherdef get_key(key_file): with open(key_file) as f: data = f.read() key = RSA.importKey(data) return keydef rsa_public_check_sign(text, sign): publick_key = get_key('demo_public_key.pem') verifier = PKCS1_signature.new(publick_key) digest = SHA.new() digest.update(text.encode("utf8")) return verifier.verify(digest, base64.b64decode(sign))public_key = get_key('demo_public_key.pem')with open("poetry.txt", "r", encoding='utf-8') as input_file: data = input_file.read() signfile = open("sign.txt","r") sign = signfile.read() print(rsa_public_check_sign(data,sign))with open("poetry-modify.txt", "r", encoding='utf-8') as input_file: data = input_file.read() signfile = open("sign.txt","r") sign = signfile.read() print(rsa_public_check_sign(data,sign))

poetry.txt将验证结果为真。而对petry.txt修改后的poetry-modify.txt的验证失败,从而达到了防篡改的作用。

上一篇:python map不一样应用
下一篇:没有了
网友评论