Python案例分享:如何实现信息的加解密

本文涉及的产品
密钥管理服务KMS,1000个密钥,100个凭据,1个月
简介: Python案例分享:如何实现信息的加解密

在Python中实现信息的加解密,我们可以使用多种加密算法,但为了简单起见,这里我将展示如何使用AES(高级加密标准)算法进行信息的加密和解密。AES是一种广泛使用的对称加密算法,意味着加密和解密使用相同的密钥。

为了使用AES算法,我们将使用Python的pycryptodome库,它是PyCrypto的一个分支,提供了更广泛的加密算法支持。如果你还没有安装pycryptodome,你可以通过pip安装它:

bash复制代码
pip install pycryptodome

下面是使用AES算法进行信息加解密的Python代码示例:

from Crypto.Cipher import AES  
from Crypto.Random import get_random_bytes  
from Crypto.Util.Padding import pad, unpad  
from binascii import hexlify, unhexlify  
  
class AESCipher:  
    def __init__(self, key=None):  
        """  
        初始化AES加密器。如果未提供密钥,则自动生成一个AES-128位密钥。  
        """  
        if key is None:  
            self.key = get_random_bytes(16)  # AES-128位密钥  
        else:  
            if len(key) not in [16, 24, 32]:  
                raise ValueError("密钥长度必须是16(AES-128)、24(AES-192)或32(AES-256)字节")  
            self.key = key  
  
    def encrypt(self, plaintext):  
        """  
        加密明文并返回密文的十六进制字符串。  
        """  
        # 生成一个随机的初始化向量(IV)  
        iv = get_random_bytes(AES.block_size)  
        # 创建一个AES cipher对象,使用CBC模式  
        cipher = AES.new(self.key, AES.MODE_CBC, iv)  
        # 对明文进行填充  
        padded_data = pad(plaintext.encode('utf-8'), AES.block_size)  
        # 加密  
        encrypted = cipher.encrypt(padded_data)  
        # 将IV和加密后的数据拼接在一起,但这里我们只返回加密数据的十六进制字符串  
        # 在实际应用中,你可能需要将IV和加密数据一起存储或传输  
        return iv.hex() + ':' + encrypted.hex()  # 使用冒号分隔IV和加密数据,仅作为示例  
  
    def decrypt(self, ciphertext_hex):  
        """  
        解密密文的十六进制字符串并返回明文。  
        """  
        # 从十六进制字符串中分离出IV和加密后的数据  
        iv_hex, encrypted_hex = ciphertext_hex.split(':', 1)  
        iv = unhexlify(iv_hex)  
        encrypted_data = unhexlify(encrypted_hex)  
        # 创建一个AES cipher对象,使用相同的IV和密钥  
        cipher = AES.new(self.key, AES.MODE_CBC, iv)  
        # 解密  
        decrypted_padded = cipher.decrypt(encrypted_data)  
        # 去除填充  
        try:  
            decrypted_text = unpad(decrypted_padded, AES.block_size).decode('utf-8')  
        except ValueError:  
            raise ValueError("解密失败,可能是密钥错误或密文被篡改")  
        return decrypted_text  
  
# 使用示例  
if __name__ == "__main__":  
    # 自动生成密钥(或你可以提供一个)  
    key = get_random_bytes(16)  
    cipher = AESCipher(key)  
  
    # 要加密的信息  
    plaintext = "Hello, this is a secret message!"  
    print(f"原文: {plaintext}")  
  
    # 加密  
    ciphertext_hex = cipher.encrypt(plaintext)  
    print(f"密文(十六进制): {ciphertext_hex}")  
  
    # 解密  
    decrypted_text = cipher.decrypt(ciphertext_hex)  
    print(f"解密后的文本: {decrypted_text}")

注意

  1. 在这个例子中,我们使用了CBC模式,它需要一个初始化向量(IV)来确保即使相同的明文块也被加密成不同的密文块。IV不需要保密,但必须与密文一起存储或传输,以便解密时能够重新构造相同的加密环境。
  2. 我们使用了padunpad函数来处理明文,因为AES要求明文长度必须是块大小的整数倍。pad函数会在明文末尾添加必要的填充,而unpad函数则在解密后去除这些填充。
  3. 密钥(key)是加密和解密的关键,必须保密且随机生成。在示例中,我们使用了get_random_bytes函数来生成一个随机的密钥,但在实际应用中,你可能需要从一个安全的密钥管理系统中获取密钥。
  4. 加密后的数据(密文)是二进制数据,因此我们以十六进制字符串的形式打印出来以便于查看。在实际应用中,你可能需要将密文编码为Base64或其他适合传输和存储的格式。
  5. decrypt方法现在接受一个十六进制字符串作为输入,并使用split方法将其拆分为IV和加密数据部分,然后使用unhexlify将它们转换回二进制数据进行解密。
  6. 请注意,由于密钥是随机生成的,并且每次运行程序时都可能不同,因此如果你想要解密之前加密的数据,你需要确保使用相同的密钥。在实际应用中,你应该有一个安全的密钥管理系统来管理密钥的生成、存储和分发。
目录
相关文章
|
15天前
|
存储 数据采集 数据库
用 Python 爬取淘宝商品价格信息时需要注意什么?
使用 Python 爬取淘宝商品价格信息时,需注意法律和道德规范,遵守法律法规和平台规定,避免非法用途。技术上,可选择 Selenium 和 Requests 库,处理反爬措施如 IP 限制、验证码识别和请求频率控制。解析页面数据时,确定数据位置并清洗格式。数据存储可选择 CSV、Excel、JSON 或数据库,定期更新并去重。还需进行错误处理和日志记录,确保爬虫稳定运行。
|
15天前
|
数据采集 Web App开发 iOS开发
如何利用 Python 的爬虫技术获取淘宝天猫商品的价格信息?
本文介绍了使用 Python 爬虫技术获取淘宝天猫商品价格信息的两种方法。方法一使用 Selenium 模拟浏览器操作,通过定位页面元素获取价格;方法二使用 Requests 和正则表达式直接请求页面内容并提取价格。每种方法都有详细步骤和代码示例,但需注意反爬措施和法律法规。
|
1月前
|
小程序 Python
利用Python编程提取身份证的信息
利用Python编程提取身份证的信息
|
1月前
|
数据采集 前端开发 NoSQL
Python编程异步爬虫实战案例
Python编程异步爬虫实战案例
|
1月前
|
数据采集 自然语言处理 API
Python反爬案例——验证码的识别
Python反爬案例——验证码的识别
|
17天前
|
缓存 监控 Linux
Python 实时获取Linux服务器信息
Python 实时获取Linux服务器信息
|
1月前
|
iOS开发 MacOS Python
Python编程小案例—利用flask查询本机IP归属并输出网页图片
Python编程小案例—利用flask查询本机IP归属并输出网页图片
|
1月前
|
存储 大数据 Python
案例学Python:filter()函数的用法,高级!
`filter()`函数是Python中处理序列数据的强大工具,它允许我们高效地根据条件过滤元素。通过结合匿名函数、常规函数或直接利用Python的内置逻辑,`filter()`提供了灵活且高效的过滤机制,尤其在大数据处理和内存敏感的应用中展现出其价值。掌握 `filter()`的使用,不仅能提升代码的可读性和效率,还能更好地适应Python的函数式编程风格。
33 2
|
1月前
|
IDE 开发工具 数据安全/隐私保护
Python编程--实现用户注册信息写入excel文件
Python编程--实现用户注册信息写入excel文件
|
1月前
|
Python
Python实现系统基础信息
Python实现系统基础信息
32 0