首页 > 编程语言 >Python 加密算法详解与应用

Python 加密算法详解与应用

时间:2024-09-10 23:23:04浏览次数:10  
标签:AES 加密 key Python RSA 详解 哈希 data 加密算法

引言

随着互联网的普及,数据传输与存储中的安全性问题变得尤为重要。加密算法是一种有效保护数据的方法,广泛应用于文件加密、网络通信以及身份认证等场景中。Python作为一种易于上手且功能强大的编程语言,提供了多种加密库供开发者使用,如cryptographypycryptodome等库。本篇文章将详细介绍Python中的加密算法,包括对称加密、非对称加密和哈希算法,并提供示例代码演示如何实现这些算法。


加密算法分类

加密算法主要分为以下三大类:

  1. 对称加密算法:加密和解密使用相同的密钥。该类算法速度快,适用于大规模数据加密。常见算法包括AES、DES。
  2. 非对称加密算法:使用一对密钥,公钥用于加密,私钥用于解密。这类算法安全性高,但速度相对较慢,适合加密少量数据或进行数字签名。常见算法有RSA、DSA。
  3. 哈希算法:通过散列函数生成固定长度的哈希值,用于数据完整性校验和密码存储。常见的哈希算法包括MD5、SHA-1、SHA-256等。

对称加密算法——AES

AES 算法原理

AES(Advanced Encryption Standard)是一种对称加密算法,因其高效的性能和安全性,成为数据加密的标准。AES支持128位、192位和256位的密钥长度,并采用分组加密的方式,即将数据分割为固定长度(128位)的块,逐块加密。

AES 工作模式:AES提供了多种工作模式,常见的包括:

  • ECB(Electronic Codebook)模式:直接对每个数据块进行加密,简单易用,但存在数据模式泄露的风险。
  • CBC(Cipher Block Chaining)模式:将前一个数据块的密文与下一个明文块进行异或,增加了安全性。
  • CFB(Cipher Feedback)模式:一种反馈模式,将密文的一部分反馈到加密过程。
  • GCM(Galois/Counter Mode)模式:提供了认证和加密功能的组合。

Python AES 实现

使用cryptography库可以轻松实现AES加密和解密操作。以下是一个使用CBC模式的AES加密解密示例。

from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes
from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives import padding
import os

# AES加密函数
def aes_encrypt(key, plaintext):
    backend = default_backend()
    iv = os.urandom(16)  # 生成16字节的初始化向量
    cipher = Cipher(algorithms.AES(key), modes.CBC(iv), backend=backend)
    encryptor = cipher.encryptor()
    
    # PKCS7填充,确保数据块长度为128位
    padder = padding.PKCS7(algorithms.AES.block_size).padder()
    padded_data = padder.update(plaintext) + padder.finalize()
    
    # 执行加密
    ciphertext = encryptor.update(padded_data) + encryptor.finalize()
    return iv + ciphertext

# AES解密函数
def aes_decrypt(key, ciphertext):
    backend = default_backend()
    iv = ciphertext[:16]
    ciphertext = ciphertext[16:]
    cipher = Cipher(algorithms.AES(key), modes.CBC(iv), backend=backend)
    decryptor = cipher.decryptor()
    
    decrypted_data = decryptor.update(ciphertext) + decryptor.finalize()
    
    # 移除填充
    unpadder = padding.PKCS7(algorithms.AES.block_size).unpadder()
    plaintext = unpadder.update(decrypted_data) + unpadder.finalize()
    return plaintext

# 示例用法
key = b'0123456789abcdef'  # 密钥长度为16字节
plaintext = b'Hello, AES encryption!'
encrypted_data = aes_encrypt(key, plaintext)
print("加密后的数据:", encrypted_data.hex())

decrypted_data = aes_decrypt(key, encrypted_data)
print("解密后的数据:", decrypted_data.decode('utf-8'))

在这个示例中,我们使用AES CBC模式对数据进行加密。os.urandom(16)生成随机的初始化向量(IV),确保每次加密结果不同。使用PKCS7填充确保输入的数据长度是块大小的倍数,避免加密出错。


非对称加密算法——RSA

RSA 算法原理

RSA(Rivest-Shamir-Adleman)是一种非对称加密算法,通过一对密钥(公钥和私钥)实现加密和解密。公钥可以公开用于加密数据,私钥则用于解密。RSA的安全性基于大整数分解的困难性,因此需要较大的密钥长度(通常为2048位或以上)来确保足够的安全性。

RSA的工作过程如下:

  1. 密钥生成:生成一对公钥和私钥。
  2. 加密:使用接收方的公钥对数据进行加密。
  3. 解密:接收方使用私钥解密数据。
  4. 数字签名:发送方使用私钥对消息签名,接收方使用公钥验证签名。

Python RSA 实现

使用cryptography库可以方便地实现RSA加密、解密和签名操作。以下是一个RSA加密解密的示例代码:

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

# RSA密钥生成函数
def rsa_key_generation():
    private_key = rsa.generate_private_key(
        public_exponent=65537,
        key_size=2048,  # 生成2048位密钥
        backend=default_backend()
    )
    public_key = private_key.public_key()
    return private_key, public_key

# RSA加密函数
def rsa_encrypt(public_key, plaintext):
    ciphertext = public_key.encrypt(
        plaintext,
        padding.OAEP(
            mgf=padding.MGF1(algorithm=hashes.SHA256()),
            algorithm=hashes.SHA256(),
            label=None
        )
    )
    return ciphertext

# RSA解密函数
def rsa_decrypt(private_key, ciphertext):
    plaintext = private_key.decrypt(
        ciphertext,
        padding.OAEP(
            mgf=padding.MGF1(algorithm=hashes.SHA256()),
            algorithm=hashes.SHA256(),
            label=None
        )
    )
    return plaintext

# 示例用法
private_key, public_key = rsa_key_generation()
plaintext = b'Hello, RSA encryption!'
encrypted_data = rsa_encrypt(public_key, plaintext)
print("加密后的数据:", encrypted_data.hex())

decrypted_data = rsa_decrypt(private_key, encrypted_data)
print("解密后的数据:", decrypted_data.decode('utf-8'))

在这个示例中,我们首先生成了一对RSA密钥,使用公钥对明文进行加密,再使用私钥解密得到原始数据。RSA加密过程中使用了OAEP填充,这是RSA中的一种安全填充模式,并使用SHA-256作为哈希算法,确保数据的完整性和安全性。


哈希算法

MD5 与 SHA 系列

哈希算法是一种将任意长度的输入转换为固定长度的输出的算法,输出称为“哈希值”或“摘要”。哈希算法在密码学中广泛用于校验数据完整性、数字签名以及密码存储。常见的哈希算法包括:

  • MD5(Message Digest Algorithm 5):输出128位哈希值,虽然速度快,但不适用于安全场景。
  • SHA(Secure Hash Algorithm)系列:SHA-1输出160位哈希值,但已已不安全,推荐使用SHA-256及更高版本,如SHA-512。

Python 哈希算法实现

Python标准库中的hashlib模块提供了MD5、SHA等常用哈希算法的实现。以下是一个简单的SHA-256哈希示例:

import hashlib

def hash_sha256(data):
    sha256 = hashlib.sha256()
    sha256.update(data)
    return sha256.hexdigest()

# 示例用法
data = b'Hello, hash algorithm!'
hash_value = hash_sha256(data)
print("SHA-256哈希值:", hash_value)

在这个示例中,我们使用hashlib.sha256()生成了一个SHA-256哈希值,适用于数据完整性校验等场景。


总结

本文详细介绍了Python中常用的三大类加密算法——对称加密、非对称加密以及哈希算法。通过具体示例代码展示了如何使用AES和RSA进行加密和解密操作,以及如何使用哈希算法进行数据完整性校验。

在实际项目中,选择合适的加密算法至关重要。例如,AES适用于大规模数据加密,RSA适合小规模数据加密及密钥交换,而SHA等哈希算法则用于验证数据完整性。通过合理组合使用这些算法,可以有效提升系统的安全性。

标签:AES,加密,key,Python,RSA,详解,哈希,data,加密算法
From: https://blog.51cto.com/u_16170163/11974257

相关文章

  • Python在DevOps中的应用 - 提高自动化和效率的利器
    引言在当今快速发展的IT世界中,DevOps已成为提高软件开发和运维效率的关键方法。Python,作为一种多功能且易于学习的编程语言,在DevOps实践中扮演着越来越重要的角色。本文将深入探讨Python如何在DevOps中发挥作用,以及一些常用的Python库和工具,帮助您提高自动化程度和工作效率。作者:ht......
  • 【教程】如何使用 MYScrcpy,一行Python代码获取Android设备 屏幕/摄像头 H264/H265 原
    MYScrcpy1.5.8Github/Gitee1.5.8版本新增获取原始视频流(H264/H265)方法,供小伙伴们在需要原生H264/H265串流时使用要求MYScrcpy>1.5.8pipinstall-Umysc安卓设备开启调试模式,安卓版本>5(摄像头需>11)H265需安卓设备支持H265编码步骤MYScrcpy从设计之初......
  • Python Pyqt5 将ui文件转换成py文件
    命令行pyuicyour_ui_file.ui-ooutput_file.py如果是虚拟环境,则需要提前进入虚拟环境中执行pyuic命令uitopy文件的使用如果是ui文件转换过来的py文件,不要直接在此py文件中编写代码。如果你的ui文件发生变换就需要重新生成py文件,这个时候新的py文件就会覆盖历史的。正确使......
  • Java API 之 String类详解(掌握字符串操作的利器)
    深入剖析JavaString类:掌握字符串操作的艺术String类是Java中最基础、最常用的类之一,它用于表示文本字符串。String类提供了丰富的API,可以用来操作字符串,例如连接、分割、查找、替换等。本篇博客将深入剖析String类,并通过详细的代码示例展示其所有常用方法的用途,让......
  • SciTech-Mathmatics-Probability+Statistics-Sampling : Learn Stats for Python III:
    LearnStatsforPythonIII:ProbabilityandSamplingBYIVÁNPALOMARESCARRASCOSAPOSTEDONSEPTEMBER9,2024ProbabilityandSamplingAboutPartIII:ProbabilityandSamplingPartIIIdivesintoappliedprobabilitytheory,concretelybymodelingdiscrete......
  • Python 网络编程
    什么是Socket?socket()函数参数Socket对象(内建)方法简单实例服务端客户端PythonInternet模块Python提供了两个级别访问的网络服务:低级别的网络服务支持基本的Socket,它提供了标准的BSDSocketsAPI,可以访问底层操作系统Socket接口的全部方法。高级别的网络......
  • 解决python封装Logging模块后,log位置显示错误的问题
    引入今天由于项目需要,要将logging库二次封装成一个类,以实现一些自定义的功能。我将二次封装了一个logService类,然后在其中同样也实现info,warn,error等日志函数。额外加了一个将日志存入数据库的功能。大概是像下面这样子:但是在封装的过程中,出现了一个问题:log中,不能正确显......
  • 【Python篇】matplotlib超详细教程-由入门到精通(下篇)
    文章目录前言第六部分:保存与导出图表6.1保存为图片文件示例:保存图表为PNG文件解释:关键点:6.2保存为高分辨率图片示例:保存为高分辨率图片解释:6.3保存为不同文件格式示例:保存为不同文件格式解释:6.4调整图表的保存尺寸示例:设置图片尺寸并保存解释:6.5解决中文乱码......
  • Java集合——Queue详解
    Queue详解基本概念功能分类主要方法普通队列双端队列阻塞队列使用示例总结基本概念Java中的Queue接口表示一种先进先出(FIFO,FirstInFirstOut)的数据结构,但实际上它也支持其他插入和删除策略。Queue是Java集合框架的一部分,它继承自Collection接口,并且定义......
  • python爬虫连载17
    文本属性设置行高、缩进、字符间距。text-align:设置文本对齐方式,属性值取left、center、right。line-height:设置文本行高,属性值取具体数值来设置具体行高。text-indent:代表首行缩进,text-indent:100px,意思是首行缩进100个像素。letter-spacing:设置字符间距。默认是normal,字符之间没......