Python工具箱系列(十九)

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

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

假设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 base64
from Crypto.PublicKey import RSA
from Crypto.Hash import SHA
from Crypto.Signature import PKCS1_v1_5 as PKCS1_signature
from Crypto.Cipher import PKCS1_v1_5 as PKCS1_cipher

def get_key(key_file):
    with open(key_file) as f:
        data = f.read()
        key = RSA.importKey(data)
    return key


def 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 signature

private_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 base64
from Crypto.PublicKey import RSA
from Crypto.Hash import SHA
from Crypto.Signature import PKCS1_v1_5 as PKCS1_signature
from Crypto.Cipher import PKCS1_v1_5 as PKCS1_cipher

def get_key(key_file):
    with open(key_file) as f:
        data = f.read()
        key = RSA.importKey(data)
    return key


def 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工具箱系列(十九) - Python技术站

(0)
上一篇 2023年4月2日
下一篇 2023年4月2日

相关文章

  • Python工具箱系列(二十五)

    Redis是一个开源的使用ANSIC语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。从2010年3月15日起,Redis的开发工作由VMware主持。从2013年5月开始,Redis的开发由Pivotal赞助。Redis是一个nosql数据库。nosql是not-only sql的意思,泛指非关系型数据库。…

    Python开发 2023年3月31日
    00
  • Python工具箱系列(十六)

    前面介绍了对称加密算法,本文将介绍密码学中另一类重要应用:消息摘要(Digest),什么是消息摘要?简单的定义是:对一份数据,进行一个单向的Hash函数,生成一个固定长度的Hash值,这个值就是这份数据的摘要,也称为指纹。 常见的摘要算法有: MD5 SHA1 SHA256 其它 特点如下:   无论输入的消息有多长,计算出来的消息摘要的长度总是固定的。例如…

    Python开发 2023年4月2日
    00
  • Python工具箱系列(十七)

    很多软件工程师都认为MD5是一种加密算法,然而这种观点是不对的。作为一个 1992 年第一次被公开的算法,到今天为止已经被发现了一些致命的漏洞。本文讨论MD5在密码保存方面的一些问题。 假设下面一个场景:   软件产品让用户输入用户名与口令,随即使用MD5算法将口令(明文)转变成为摘要值。 用户登录时,用户输入的口令,也使用MD5进行计算,然后与存储的MD5…

    2023年4月2日
    00
  • Python工具箱系列(十八)

    非对称加解密应用广泛,它的存在是致力于解决密钥通过公共信道传输这一经典难题。对称加密有一个天然的缺点,就是加密方和解密方都要持有同样的密钥,而这个密钥在传递过程中有可能会被截获,从而使加解密失效。难不成还要为密钥的传输再做一次加密?这样不就陷入了死循环?或许有人在想,密钥即使被盗取,不还有加密算法保证信息安全吗?但任何算法最终都会被破译,所以不能依赖算法的复…

    Python开发 2023年4月2日
    00
  • Python工具箱系列(十五)

    前文讲述加解密时,直接将密钥写在了python源代码中,这肯定不是什么好的手法。应该将这类与代码加功效无关的信息保存到配置中,随时可以需要进行修改。从大的角度来看,配置无非就是以下方式: 保存到配置文件中,格式可以是txt/csv/ini/xml/yaml/json/其它特殊格式等; 保存到数据库中,数据库可以是本地的,也可以是远程的; 特殊情况下,配置信息…

    Python开发 2023年4月2日
    00
  • Python工具箱系列(十四)

    上文介绍了命令行方式来对文件进行加解密操作。本文将继续在此基础上,实现一个快速简易的GUI界面方便操作,先上代码看效果。 import argparse import configparser import json import os import struct import sys from configparser import ConfigParse…

    2023年4月2日
    00
  • Python工具箱系列(二十三)

    基于游标得操作 游标是数据库操作的相对底层的能力。简单的操作如下: import mysql.connector import random host = ‘localhost’ user = ‘root’ password = ‘8848is8848’ dbname = ‘demodb’ def fakedata(maxtimes): # 连接数据库 de…

    2023年3月31日
    00
  • Python工具箱系列(二十六)

    ClickHouse(Click Stream,Data WareHouse)是俄罗斯的 Yandex于2016年开源的用于在线分析处理查询(OLAP:Online Analytical Processing)MPP架构的列式存储数据库(DBMS:Database Management System),能够使用 SQL 查询实时生成分析数据报告。特别值得称道…

    Python开发 2023年3月31日
    00
合作推广
合作推广
分享本页
返回顶部