【Python加密与解密】深入了解Python中的数据加密技术!

news2024/10/20 15:34:44

Python加密与解密:深入了解Python中的数据加密技术

在现代信息时代,数据加密成为保障网络和通信安全的重要手段之一。无论是在保护个人隐私还是在保证企业数据的安全性方面,加密技术都发挥着关键作用。Python 作为一种流行的编程语言,不仅广泛用于数据分析和机器学习,同时也是进行数据加密与解密的强大工具。

本文将通过深入解析Python中的几种常用加密与解密技术,结合代码实例,帮助您掌握如何在项目中实现数据的安全传输与存储。
在这里插入图片描述

1. 数据加密的重要性

随着数字化时代的发展,数据安全已经成为至关重要的问题。无论是银行交易、用户登录、电子邮件通信,还是商业机密传输,未经加密的数据一旦被黑客拦截,后果将不堪设想。

数据加密的目的在于通过加密算法将明文转化为密文,只有授权方才能通过密钥解密获得原始数据。这种方式有效防止了未经授权的访问,确保信息的机密性、完整性与不可篡改性。
在这里插入图片描述

2. 对称加密与非对称加密

在讨论具体的加密技术之前,先介绍两种常见的加密方法:

  • 对称加密:加密和解密使用同一密钥。常见的对称加密算法包括 AES、DES 等。对称加密速度快,适合大数据量的加密场景,但密钥管理复杂。

  • 非对称加密:加密和解密使用不同的密钥,通常称为公钥和私钥。常见的非对称加密算法包括 RSA 和 ECC。非对称加密适合用于数字签名和密钥交换。
    在这里插入图片描述

3. Python中的加密库

Python 提供了丰富的库来实现加密与解密操作,常用的加密库包括:

  • PyCryptodome:最受欢迎的加密库之一,提供对称加密、非对称加密、哈希算法和随机数生成等功能。
  • cryptography:另一个功能强大的库,支持多种高级加密算法,适用于更高安全性要求的应用场景。

接下来,我们将通过具体代码实例展示如何使用这些库进行加密与解密。
在这里插入图片描述

4. 对称加密:使用 AES 算法

AES(Advanced Encryption Standard)是一种广泛使用的对称加密算法,它的安全性和效率使其成为首选。我们将使用 PyCryptodome 库来实现 AES 加密和解密。

示例代码:

from Crypto.Cipher import AES
from Crypto.Random import get_random_bytes
import base64

# 生成密钥和随机IV
key = get_random_bytes(16)  # AES-128, key大小为16字节
iv = get_random_bytes(16)   # 生成16字节的初始向量

def aes_encrypt(plaintext):
    cipher = AES.new(key, AES.MODE_CFB, iv=iv)  # 使用CFB模式
    ciphertext = cipher.encrypt(plaintext.encode('utf-8'))
    return base64.b64encode(iv + ciphertext).decode('utf-8')

def aes_decrypt(ciphertext):
    ciphertext = base64.b64decode(ciphertext)
    iv = ciphertext[:16]  # 获取前16字节的IV
    cipher = AES.new(key, AES.MODE_CFB, iv=iv)
    plaintext = cipher.decrypt(ciphertext[16:]).decode('utf-8')
    return plaintext

# 测试加密解密
encrypted = aes_encrypt("Hello, World!")
print(f"Encrypted: {encrypted}")
decrypted = aes_decrypt(encrypted)
print(f"Decrypted: {decrypted}")

在这段代码中,我们使用AES的CFB模式来加密和解密字符串。密钥和初始向量是通过随机生成的,密文以Base64编码的形式输出以便于传输和存储。
在这里插入图片描述

5. 非对称加密:使用 RSA 算法

RSA 是一种经典的非对称加密算法,广泛用于安全通信中。它使用一对密钥:公钥加密,私钥解密。我们可以使用 cryptography 库来实现 RSA 加密和解密。

示例代码:

from cryptography.hazmat.primitives.asymmetric import rsa, padding
from cryptography.hazmat.primitives import serialization, hashes

# 生成 RSA 密钥对
private_key = rsa.generate_private_key(public_exponent=65537, key_size=2048)
public_key = private_key.public_key()

# 公钥加密
def rsa_encrypt(plaintext):
    ciphertext = public_key.encrypt(
        plaintext.encode('utf-8'),
        padding.OAEP(
            mgf=padding.MGF1(algorithm=hashes.SHA256()),
            algorithm=hashes.SHA256(),
            label=None
        )
    )
    return base64.b64encode(ciphertext).decode('utf-8')

# 私钥解密
def rsa_decrypt(ciphertext):
    ciphertext = base64.b64decode(ciphertext)
    plaintext = private_key.decrypt(
        ciphertext,
        padding.OAEP(
            mgf=padding.MGF1(algorithm=hashes.SHA256()),
            algorithm=hashes.SHA256(),
            label=None
        )
    )
    return plaintext.decode('utf-8')

# 测试 RSA 加密解密
encrypted = rsa_encrypt("Hello, RSA!")
print(f"Encrypted: {encrypted}")
decrypted = rsa_decrypt(encrypted)
print(f"Decrypted: {decrypted}")

在上述代码中,我们首先生成一对 RSA 密钥,使用公钥进行加密,私钥进行解密。RSA 的加密效率相对较低,因此在大数据加密场景下,通常与对称加密结合使用。
在这里插入图片描述

6. 哈希算法:MD5、SHA-256

哈希算法不是用来加密数据,而是生成固定长度的消息摘要,常用于数据完整性校验和密码存储。常见的哈希算法包括 MD5、SHA-1 和 SHA-256。

示例代码:

import hashlib

def hash_md5(data):
    return hashlib.md5(data.encode('utf-8')).hexdigest()

def hash_sha256(data):
    return hashlib.sha256(data.encode('utf-8')).hexdigest()

# 测试哈希算法
print(f"MD5: {hash_md5('Hello, Hash!')}")
print(f"SHA-256: {hash_sha256('Hello, Hash!')}")

MD5 和 SHA-256 都能将任意长度的数据映射到固定长度的哈希值。尽管 MD5 存在安全问题,但仍然广泛应用于文件校验等场景。SHA-256 安全性更高,广泛应用于区块链和数字签名。
在这里插入图片描述

7. 密钥管理与安全性

无论对称加密还是非对称加密,密钥的管理都是确保数据安全的核心问题。密钥一旦泄露,攻击者就可以轻易解密数据。因此,妥善保存密钥并定期更换显得尤为重要。

  • 对于对称加密,可以使用密钥库(如 AWS KMS)来存储密钥。
  • 对于非对称加密,公钥可以公开,而私钥必须严格保密,且最好存储在硬件安全模块(HSM)中。
    在这里插入图片描述

8. 数据加密与性能

数据加密往往伴随着性能的开销,尤其是对于大规模数据传输或存储,必须考虑加密算法的效率。对称加密的效率远高于非对称加密,因此通常在实际应用中使用混合加密:即对称加密用于数据加密,非对称加密用于加密对称密钥。
在这里插入图片描述

9. Python中的SSL/TLS加密

除了手动加密数据外,Python还提供了用于网络通信中的SSL/TLS加密支持。通过 ssl 模块,Python 可以安全地实现加密的网络连接,广泛应用于HTTPS、加密邮件传输等场景。

示例代码:

import ssl
import socket

hostname = 'example.com'
context = ssl.create_default_context()

with socket.create_connection((hostname, 443)) as sock:
    with context.wrap_socket(sock, server_hostname=hostname) as ssock:
        print(ssock.version())

在这里插入图片描述

10. 未来的加密趋势:量子加密

随着量子计算技术的发展,传统的加密算法面临着巨大的挑战。量子计算机能够快速破解现有的非对称加密算法,因此量子加密技术和量子密钥分发(QKD)逐渐成为研究的热点。
在这里插入图片描述

总结

本文深入探讨了Python中的数据加密与解密技术,涵盖了对称加密、非对称加密、哈希算法等多个方面,并通过代码实例展示了如何使用Python库进行数据加密。随着信息安全需求的不断提升,了解并掌握这些技术将在实际项目中为您提供坚实的安全保障。未来,量子加密可能会颠覆现有的加密体系,因此我们也需要持续关注该领域的发展。
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2219381.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

(10) GTest c++单元测试(mac版)

文章目录 概要安装实现机制-断言(简单、独立的测试)实现机制-测试套件实现机制-Test Fixture和事件 概要 官方文档 https://google.github.io/googletest/ 安装 git clone https://github.com/google/googletestcd googletestmkdir build && c…

鸿蒙开发 四十五 鸿蒙状态管理(嵌套对象界面更新)

当运行时的状态变量变化,UI重新渲染,在ArkUI中称为状态管理机制,前提是变量必须被装饰器修饰。不是状态变量的所有更改都会引起刷新,只有可以被框架观测到的更改才会引起UI刷新。其中boolen、string、number类型,可观察…

PyQt 入门教程(3)基础知识 | 3.2、加载资源文件

文章目录 一、加载资源文件1、PyQt5加载资源文件2、PyQt6加载资源文件 一、加载资源文件 常见的资源文件有图像、图标、样式表,下面分别介绍下加载资源文件的常用方法 1、PyQt5加载资源文件 创建.qrc文件: 可以使用QtCreator或手动创建一个.qrc文件&…

注意LED亚型号区分

一. 前言 最近产品试产遇到一次批量事故:全部绿光LED的光功率不达标。最终定位到的原因就是未注意LED的细分型号,试产采用的批次与研发时的亚型号不一样,光功率范围不一致。在此记录下来,供大家做参考,避免走弯路。 …

桂林旅游一点通:SpringBoot平台应用

3系统分析 3.1可行性分析 通过对本桂林旅游景点导游平台实行的目的初步调查和分析,提出可行性方案并对其一一进行论证。我们在这里主要从技术可行性、经济可行性、操作可行性等方面进行分析。 3.1.1技术可行性 本桂林旅游景点导游平台采用SSM框架,JAVA作…

uniapp结合uview-ui创建项目

准备工作: 下载HBuilderX;官网地址:HBuilderX-高效极客技巧 安装node.js;官网地址:Node.js — 在任何地方运行 JavaScript,下载所需版本,安装后配置好环境变量即可 方式一(NPM安装方式): 1、打开开发者…

OpenRTP 乱序排包和差分抖动计算

OpenRTP 开源地址 OpenRTP 开源地址 暂时使用h264 aac 的音频去测试,点开配置去选择 1 音视频同步问题 先要解决一个音视频同步问题,否则包排不排序都不对,这是因为视频时间戳不一定能够对上音频,为什么呢?因为大部…

前端考试总结

1HTML标签 h标题标签 块级标签 独占一行 p段落标签 同上 br换行标签 单标签 img图片标签 内联标签:不独占一行(src图片地址 alt图片的替代文字 title鼠标悬停提示文字) a超链接标签 同上 (href跳转路径 target属性{_blank新窗口打开 _self在当前窗口打开}) 列表标签(ul无…

诺贝尔物理学奖与机器学习、神经网络:一场跨时代的融合与展望

诺贝尔物理学奖与机器学习、神经网络:一场跨时代的融合与展望 机器学习与神经网络的崛起 机器学习与神经网络的发展前景 机器学习和神经网络的研究与传统物理学的关系 总结 2024年,诺贝尔物理学奖颁给了机器学习与神经网络,这一具有里程碑…

JAVA就业笔记5——第二阶段(2)

课程须知 A类知识:工作和面试常用,代码必须要手敲,需要掌握。 B类知识:面试会问道,工作不常用,代码不需要手敲,理解能正确表达即可。 C类知识:工作和面试不常用,代码不…

房屋租赁管理系统|基于java和小程序的房屋租赁管理系统小程序设计与实现(源码+数据库+文档)

房屋租赁管理系统小程序 目录 基于java和小程序的房屋租赁管理系统小程序设计与实现 一、前言 二、系统功能设计 三、系统实现 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取: 博主介绍:✌️大厂码农|毕设…

asp.net core _ViewStart.cshtml 和 _ViewImports.cshtml

_ViewStart.cshtml asp.net mvc 就出现了 》》/Views/ViewStart.cshtml _ViewStart.cshtml 是默认模板,当页面没有指定 Layout 时,会自动调用此默认模板‌,如果要取消 在当页面设定 (如下),则表示 当前页面…

线下陪玩导游系统软件源码,家政预约服务源码(h5+小程序+app)

游戏陪玩系统源码陪玩小程序源码搭建基于PHP+MySQL陪玩系统app源码陪玩系统定制开发服务、成品陪玩系统源码 系统基于Nginx或者Apache PHP7.3 数据库mysql5.6 前端为uniapp-vue2.0 后端为thinkphp6 有域名授权加密,其他开源可二开 演示源码下载 开…

Collection 单列集合 List Set

集合概念 集合是一种特殊类 ,这些类可以存储任意类对象,并且长度可变, 这些集合类都位于java.util中,使用的话必须导包 按照存储结构可以分为两大类 单列集合 Collection 双列集合 Map 两种 区别如下 Collection 单列集合类的根接口,用于存储一系列符合某种规则的元素,它有两…

包子凑数

类似完全背包求方案数&#xff0c;再加上点数论知识&#xff0c;裴蜀定理。 #include<bits/stdc.h> using namespace std; #define int long long #define endl \n const int N300000; bool f[N]; int a[120]; signed main() {ios::sync_with_stdio(0);cin.tie(0);cout.…

华为ICT大赛2024-2025网络赛道考试分析

华为ICT大赛2024-2025正在报名中&#xff0c;网络赛道的同学如何备考&#xff0c;了解考试内容呢&#xff1f; 一、考试概况 华为ICT大赛分为4个赛段&#xff0c;分别为省赛初赛、省赛复赛、中国总决赛&#xff0c;全球总决赛。其中对应的能力级别分别如下&#xff1a; 省赛…

PHP爬虫API:获取商品详情的新利器

为什么选择PHP爬虫API 灵活的数据处理&#xff1a;PHP强大的数据处理能力&#xff0c;使得从API获取的数据可以被快速地处理和分析。丰富的库支持&#xff1a;PHP拥有如cURL、Guzzle等库&#xff0c;这些库简化了HTTP请求的发送和响应的接收。易于集成&#xff1a;PHP作为服务…

无人机搭载激光雷达在地形测绘中的多元应用

一、高精度地形测量 无人机激光雷达能够发射激光脉冲并接收其回波&#xff0c;通过精确计算激光脉冲的往返时间来确定目标物的距离。这一特性使得无人机激光雷达在地形测绘中能够实现高精度的三维地形测量。通过快速获取大量地形数据&#xff0c;可以生成高精度的数字高程模型…

pytorh学习笔记——cifar10(一)生成数据

CIFAR&#xff08;Canadian Institute For Advanced Research&#xff09;是一个用于图像识别研究的数据集。CIFAR数据集包含多个子数据集&#xff0c;最常用的是CIFAR-10和CIFAR-100。 CIFAR-10数据集包含60000张32x32彩色图像&#xff0c;分为10个类别&#xff0c;每…

SpringCloud无介绍快使用,单机Eureka服务注册中心cloud-eureka-server7001搭建(十)

TOC 问题背景 从零开始学springcloud微服务项目 注意事项&#xff1a; 约定 > 配置 > 编码IDEA版本2021.1这个项目&#xff0c;我分了很多篇章&#xff0c;每篇文章一个操作步骤&#xff0c;目的是显得更简单明了controller调service&#xff0c;service调dao项目源码以及…