Python编程密码学文件加密与解密代码解析

Python编程密码学文件加密与解密代码解析

介绍

在网络上传输敏感信息时,我们往往需要对数据进行加密保护。本文将介绍如何使用Python编写密码学文件加密和解密的代码。

密码学基础

在进行加密和解密操作时,我们常常需要使用一些基础的密码学知识。本节将简单介绍一下这些知识。

对称加密

对称加密是指同一个密钥既用于加密明文,又用于解密密文的加密方式。常见的对称加密算法包括AES、DES等。

非对称加密

非对称加密是指使用一对密钥,其中一个用于加密明文,另一个用于解密密文的加密方式。常见的非对称加密算法包括RSA、ElGamal等。

数字签名

数字签名是指使用私钥对数据签名,然后使用公钥进行验证的过程。数字签名可以用来验证消息来源是否合法,以及消息是否被篡改过。

文件加密

我们可以使用Python的cryptography库来进行文件加密和解密操作。该库提供了高级加密标准(AES)等常见的对称加密算法。具体步骤如下:

  1. 生成密钥
from cryptography.fernet import Fernet
key = Fernet.generate_key()
  1. 使用密钥加密文件
from cryptography.fernet import Fernet

with open('file.txt', 'rb') as f:
    data = f.read()

key = b'...'
f = Fernet(key)
encrypted_data = f.encrypt(data)

with open('file.txt.encrypted', 'wb') as f:
    f.write(encrypted_data)
  1. 使用密钥解密文件
from cryptography.fernet import Fernet

with open('file.txt.encrypted', 'rb') as f:
    encrypted_data = f.read()

key = b'...'
f = Fernet(key)
decrypted_data = f.decrypt(encrypted_data)

with open('file.txt', 'wb') as f:
    f.write(decrypted_data)

数字签名

我们可以使用Python的cryptography库来进行数字签名和验证操作。该库提供了RSA等常见的非对称加密算法。具体步骤如下:

  1. 生成公私钥对
from cryptography.hazmat.primitives.asymmetric import rsa, padding
from cryptography.hazmat.primitives import serialization
from cryptography.hazmat.backends import default_backend

private_key = rsa.generate_private_key(
    public_exponent=65537,
    key_size=2048,
    backend=default_backend()
)
public_key = private_key.public_key()

private_key_bytes = private_key.private_bytes(
    encoding=serialization.Encoding.PEM,
    format=serialization.PrivateFormat.PKCS8,
    encryption_algorithm=serialization.NoEncryption()
)
public_key_bytes = public_key.public_bytes(
    encoding=serialization.Encoding.PEM,
    format=serialization.PublicFormat.SubjectPublicKeyInfo
)

with open('private_key.pem', 'wb') as f:
    f.write(private_key_bytes)
with open('public_key.pem', 'wb') as f:
    f.write(public_key_bytes)
  1. 对数据进行签名
from cryptography.hazmat.primitives import hashes
from cryptography.hazmat.primitives.asymmetric import padding
from cryptography.hazmat.primitives.serialization import load_pem_private_key

with open('private_key.pem', 'rb') as f:
    private_key_bytes = f.read()

private_key = load_pem_private_key(
    private_key_bytes,
    password=None,
    backend=default_backend()
)

data = b'...'
signature = private_key.sign(
    data,
    padding.PSS(
        mgf=padding.MGF1(hashes.SHA256()),
        salt_length=padding.PSS.MAX_LENGTH
    ),
    hashes.SHA256()
)

with open('signature', 'wb') as f:
    f.write(signature)
  1. 验证签名
from cryptography.hazmat.primitives.asymmetric import padding
from cryptography.hazmat.primitives.serialization import load_pem_public_key

with open('public_key.pem', 'rb') as f:
    public_key_bytes = f.read()

public_key = load_pem_public_key(
    public_key_bytes,
    backend=default_backend()
)

with open('file.txt', 'rb') as f:
    data = f.read()

with open('signature', 'rb') as f:
    signature = f.read()

try:
    public_key.verify(
        signature,
        data,
        padding.PSS(
            mgf=padding.MGF1(hashes.SHA256()),
            salt_length=padding.PSS.MAX_LENGTH
        ),
        hashes.SHA256()
    )
    print('Signature is valid')
except:
    print('Signature is invalid')

示例

文件加密示例

我们有一个名为file.txt的文件,现在需要对其进行加密。

首先,我们需要生成密钥:

from cryptography.fernet import Fernet
key = Fernet.generate_key()

接着,我们需要使用密钥对文件进行加密:

with open('file.txt', 'rb') as f:
    data = f.read()

f = Fernet(key)
encrypted_data = f.encrypt(data)

with open('file.txt.encrypted', 'wb') as f:
    f.write(encrypted_data)

最后,如果需要解密文件,可以使用以下代码:

with open('file.txt.encrypted', 'rb') as f:
    encrypted_data = f.read()

f = Fernet(key)
decrypted_data = f.decrypt(encrypted_data)

with open('file.txt', 'wb') as f:
    f.write(decrypted_data)

数字签名示例

我们有一个文件file.txt,现在需要对其进行签名,并保存签名结果到signature文件中。

首先,我们需要生成公私钥对:

from cryptography.hazmat.primitives.asymmetric import rsa, padding
from cryptography.hazmat.primitives import serialization
from cryptography.hazmat.backends import default_backend

private_key = rsa.generate_private_key(
    public_exponent=65537,
    key_size=2048,
    backend=default_backend()
)
public_key = private_key.public_key()

private_key_bytes = private_key.private_bytes(
    encoding=serialization.Encoding.PEM,
    format=serialization.PrivateFormat.PKCS8,
    encryption_algorithm=serialization.NoEncryption()
)
public_key_bytes = public_key.public_bytes(
    encoding=serialization.Encoding.PEM,
    format=serialization.PublicFormat.SubjectPublicKeyInfo
)

with open('private_key.pem', 'wb') as f:
    f.write(private_key_bytes)
with open('public_key.pem', 'wb') as f:
    f.write(public_key_bytes)

接着,我们可以对文件进行签名:

from cryptography.hazmat.primitives import hashes
from cryptography.hazmat.primitives.asymmetric import padding
from cryptography.hazmat.primitives.serialization import load_pem_private_key

with open('private_key.pem', 'rb') as f:
    private_key_bytes = f.read()

private_key = load_pem_private_key(
    private_key_bytes,
    password=None,
    backend=default_backend()
)

with open('file.txt', 'rb') as f:
    data = f.read()

signature = private_key.sign(
    data,
    padding.PSS(
        mgf=padding.MGF1(hashes.SHA256()),
        salt_length=padding.PSS.MAX_LENGTH
    ),
    hashes.SHA256()
)

with open('signature', 'wb') as f:
    f.write(signature)

最后,我们可以验证签名:

from cryptography.hazmat.primitives.asymmetric import padding
from cryptography.hazmat.primitives.serialization import load_pem_public_key

with open('public_key.pem', 'rb') as f:
    public_key_bytes = f.read()

public_key = load_pem_public_key(
    public_key_bytes,
    backend=default_backend()
)

with open('file.txt', 'rb') as f:
    data = f.read()

with open('signature', 'rb') as f:
    signature = f.read()

try:
    public_key.verify(
        signature,
        data,
        padding.PSS(
            mgf=padding.MGF1(hashes.SHA256()),
            salt_length=padding.PSS.MAX_LENGTH
        ),
        hashes.SHA256()
    )
    print('Signature is valid')
except:
    print('Signature is invalid')

以上就是文件加密和数字签名的完整代码。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python编程密码学文件加密与解密代码解析 - Python技术站

(0)
上一篇 2023年5月18日
下一篇 2023年5月18日

相关文章

  • 云计算之路-阿里云 vs Azure:创建Windows虚拟机

    1. 提供的操作系统;2. 虚拟机创建界面;3. 远程连接创建好的虚拟机;4. 管理控制台界面。感言:国际巨头一旦全面进入国内市场,不会给国内厂商任何喘息的机会;1年后,不存在是否要坚守的问题,只存在选择谁的问题。 1. 提供的操作系统 阿里云提供的Windows操作系统有:Windows Server 2003, Windows Server 2008, …

    云计算 2023年4月11日
    00
  • SOA、ESB、NServiceBus、云计算 总结

    SOA SOA 是通过功能组件化、服务化,来实现系统集成、解决信息孤岛,这是其主要目标。而更进一步则是实现更快响应业务的变化、更快推出新的应用系统。与此同时,SOA 还实现了整合资源,资源复用。 SOA 服务的设计标准是粗粒度、高重用、灵活、标准。性能则并非首要考虑因素。 SOA 的两大功能是集成、服务编排(BPEL、BPM)。WF 在 SOA 架构中,实现…

    云计算 2023年4月13日
    00
  • ASP.NET Core 5.0中的Host.CreateDefaultBuilder执行过程解析

    下面是关于“ASP.NET Core 5.0中的Host.CreateDefaultBuilder执行过程解析”的完整攻略,包含两个示例说明。 简介 在ASP.NET Core 5.0中,我们可以使用Host.CreateDefaultBuilder方法来创建主机。本文将详细讲解Host.CreateDefaultBuilder方法的执行过程,并以两个示例说…

    云计算 2023年5月16日
    00
  • 《Hadoop云计算实战》读书笔记

      <h2>《Hadoop云计算实战》读书笔记</h2> 开始整理和总结自己的读书笔记 <ol> <li><a href=”http://www.wangyuxiong.com/archives/51895″ target=”_blank”>ZooKeeper 概述</a></li…

    云计算 2023年4月10日
    00
  • OpenFunction v1.0.0 发布:集成 WasmEdge,支持 Wasm 函数和更完整的 CI/CD

    OpenFunction 是一个开源的云原生 FaaS(Function as a Service,函数即服务)平台,旨在帮助开发者专注于业务逻辑的研发。今天,我们非常高兴地宣布 OpenFunction 迎来了一次重要的更新,即 v1.0.0 版本的发布! In this update, we continue to focus on providing …

    云计算 2023年4月18日
    00
  • 腾讯“云+未来”峰会西安站:当秦始皇遇到云计算

    腾讯“云+未来”峰会要来西安啦!10月18日,西安市政府、西安软件园发展中心、创投机构及众多腾讯云技术专家,将齐聚西安,共同探讨云计算如何助力西安开拓数字丝绸之路。 西安,一座被历史不断眷顾的千年古都,如今正依托高新技术产业不断焕发新的生机。小编不禁脑洞大开,如果2200多年前,秦始皇遇上了云计算,会是什么样子? 快来一起天马行空: ————————————…

    云计算 2023年4月13日
    00
  • 闲谈“云计算”

        云计算的讨论已经持续四年时间,可是“云计算”仍旧像天边的云彩一样令人难以琢磨。“云计算”宣传也做了、概念也打了、股票也涨了,到底何时落地呢?俗话说“光说不练假把式”,似乎是一夜之间,厂商真将“云”落地了。搞运输的改叫“云物流”了,卖歌的改卖“云音乐”了,聊天的改为“社交云”了,购物的改为“交易云”了,卖打印机的改卖“云打印”了,卖电脑的改卖“云宝盒”…

    云计算 2023年4月10日
    00
  • T 客研报:调研了 1200 企业用户,这是 2016 云计算市场发展规律

    云计算为企业 IT 战略的构建提供了一条资产服务化、按需付费的新方式。在产业多方角色的共同推动下,国内云计算产业生态日渐清晰完善,并且借助移动互联网+云的模式,云计算正在改变着本土企业信息化的发展进程。 移动信息化中心正式发布 2016 年《云计算中国市场实践专题研究报告》。 本研究报告通过对国内云计算市场发展的背景和企业用户的实践情况做出梳理,初步理清了目…

    云计算 2023年4月13日
    00
合作推广
合作推广
分享本页
返回顶部