python的一些加密方法及python 加密模块

Python的一些加密方法及Python加密模块

在Python编程语言中,有多种加密方式和方法可以对数据和信息进行加密,保护信息安全。本文将讲解Python中一些常用的加密方法和加密模块。

常用的加密方法

哈希

哈希是将明文数据转换为一串由数字和字母组成的固定长度的代码,也称为摘要。哈希算法是不可逆的,也就是说,无法从哈希值中还原出原始明文数据。Python中常用的哈希算法模块是hashlib

import hashlib

def md5_encode(s: str) -> str:
    """
    使用MD5哈希算法对字符串s进行加密
    """
    m = hashlib.md5()
    m.update(s.encode('utf-8'))
    return m.hexdigest()

if __name__ == '__main__':
    s = "Hello, World!"
    print(f"明文: {s}")
    print(f"MD5加密后: {md5_encode(s)}")

对称加密

对称加密是指使用相同密钥进行加密和解密的加密方式。Python中常用的对称加密模块是cryptography

from cryptography.fernet import Fernet

def encrypt(s: str, key: bytes) -> bytes:
    """
    使用Fernet对称加密算法对字符串s进行加密,key是密钥
    """
    f = Fernet(key)
    return f.encrypt(s.encode('utf-8'))

def decrypt(ciphertext: bytes, key: bytes) -> str:
    """
    使用Fernet对称加密算法对密文进行解密,key是密钥
    """
    f = Fernet(key)
    return f.decrypt(ciphertext).decode('utf-8')

if __name__ == '__main__':
    key = Fernet.generate_key()
    s = "Hello, World!"
    print(f"明文: {s}")
    ciphertext = encrypt(s, key)
    print(f"加密后的密文: {ciphertext}")
    plaintext = decrypt(ciphertext, key)
    print(f"解密后的明文: {plaintext}")

非对称加密

非对称加密是指使用私钥进行加密,使用公钥进行解密,或者使用公钥进行加密,使用私钥进行解密的加密方式。Python中常用的非对称加密模块是pycryptodome

from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_OAEP

def generate_key() -> RSA.RsaKey:
    """
    生成公私钥对
    """
    key = RSA.generate(2048)
    return key

def encrypt(s: str, key: RSA.RsaKey) -> bytes:
    """
    使用公钥key进行RSA非对称加密
    """
    cipher = PKCS1_OAEP.new(key)
    return cipher.encrypt(s.encode('utf-8'))

def decrypt(ciphertext: bytes, key: RSA.RsaKey) -> str:
    """
    使用私钥key进行RSA非对称解密
    """
    cipher = PKCS1_OAEP.new(key)
    return cipher.decrypt(ciphertext).decode('utf-8')

if __name__ == '__main__':
    private_key = generate_key()
    public_key = private_key.publickey()
    s = "Hello, World!"
    print(f"明文: {s}")
    ciphertext = encrypt(s, public_key)
    print(f"加密后的密文: {ciphertext}")
    plaintext = decrypt(ciphertext, private_key)
    print(f"解密后的明文: {plaintext}")

常用的加密模块

cryptography

cryptography是Python中一个常用的加密模块。它支持多种对称和非对称加密算法,包括AES、Blowfish、RSA和DSA等。cryptography还支持密码学安全伪随机数生成器、密码哈希函数和密码学证书等。使用该模块可以快速实现各种加密需求。

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

def encrypt(s: str, key: bytes, iv: bytes) -> bytes:
    """
    使用AES对称加密算法对字符串s进行加密,key是密钥,iv是初始化向量
    """
    cipher = Cipher(algorithms.AES(key), modes.CBC(iv), backend=default_backend())
    encryptor = cipher.encryptor()
    return encryptor.update(s.encode('utf-8')) + encryptor.finalize()

def decrypt(ciphertext: bytes, key: bytes, iv: bytes) -> str:
    """
    使用AES对称加密算法对密文进行解密,key是密钥,iv是初始化向量
    """
    cipher = Cipher(algorithms.AES(key), modes.CBC(iv), backend=default_backend())
    decryptor = cipher.decryptor()
    return decryptor.update(ciphertext) + decryptor.finalize()

if __name__ == '__main__':
    key = b'0123456789abcdef'
    iv = b'0123456789abcdef'
    s = "Hello, World!"
    print(f"明文: {s}")
    ciphertext = encrypt(s, key, iv)
    print(f"加密后的密文: {ciphertext}")
    plaintext = decrypt(ciphertext, key, iv)
    print(f"解密后的明文: {plaintext}")

hashlib

hashlib模块是Python中一个常用的哈希算法模块,支持多种哈希算法,如MD5、SHA1、SHA224、SHA256、SHA384和SHA512等。使用该模块可以方便地实现哈希运算。

import hashlib

def sha256_encode(s: str) -> str:
    """
    使用SHA256哈希算法对字符串s进行加密
    """
    m = hashlib.sha256()
    m.update(s.encode('utf-8'))
    return m.hexdigest()

if __name__ == '__main__':
    s = "Hello, World!"
    print(f"明文: {s}")
    print(f"SHA256加密后: {sha256_encode(s)}")

pycryptodome

pycryptodome是Python中一个常用的加密模块。它是Cryptography及PyCrypto项目的继承者,可以支持多种对称和非对称加密算法,包括AES、Blowfish、RSA和DSA等。pycryptodome同样支持密码学安全伪随机数生成器、密码哈希函数和密码学证书等。使用该模块可以快速实现各种加密需求。

from Crypto.Cipher import AES

def encrypt(s: str, key: bytes, iv: bytes) -> bytes:
    """
    使用AES对称加密算法对字符串s进行加密,key是密钥,iv是初始化向量
    """
    cipher = AES.new(key, AES.MODE_CBC, iv)
    padded_data = s.encode() + (AES.block_size - len(s) % AES.block_size) * chr(AES.block_size - len(s) % AES.block_size)
    ciphertext = cipher.encrypt(padded_data.encode())
    return ciphertext

def decrypt(ciphertext: bytes, key: bytes, iv: bytes) -> str:
    """
    使用AES对称加密算法对密文进行解密,key是密钥,iv是初始化向量
    """
    cipher = AES.new(key, AES.MODE_CBC, iv)
    padded_data = cipher.decrypt(ciphertext)
    return padded_data.decode().rstrip(chr(AES.block_size - len(padded_data) % AES.block_size))

if __name__ == '__main__':
    key = b'0123456789abcdef'
    iv = b'0123456789abcdef'
    s = "Hello, World!"
    print(f"明文: {s}")
    ciphertext = encrypt(s, key, iv)
    print(f"加密后的密文: {ciphertext}")
    plaintext = decrypt(ciphertext, key, iv)
    print(f"解密后的明文: {plaintext}")

示例说明

哈希

在示例代码中,我们使用了hashlib模块中的md5()函数对字符串进行哈希运算,返回哈希值的16进制表示形式。

import hashlib

def md5_encode(s: str) -> str:
    """
    使用MD5哈希算法对字符串s进行加密
    """
    m = hashlib.md5()
    m.update(s.encode('utf-8'))
    return m.hexdigest()

if __name__ == '__main__':
    s = "Hello, World!"
    print(f"明文: {s}")
    print(f"MD5加密后: {md5_encode(s)}")

非对称加密

在示例代码中,我们使用了pycryptodome模块中的RSAPKCS1_OAEP类实现RSA非对称加密和解密。

from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_OAEP

def generate_key() -> RSA.RsaKey:
    """
    生成公私钥对
    """
    key = RSA.generate(2048)
    return key

def encrypt(s: str, key: RSA.RsaKey) -> bytes:
    """
    使用公钥key进行RSA非对称加密
    """
    cipher = PKCS1_OAEP.new(key)
    return cipher.encrypt(s.encode('utf-8'))

def decrypt(ciphertext: bytes, key: RSA.RsaKey) -> str:
    """
    使用私钥key进行RSA非对称解密
    """
    cipher = PKCS1_OAEP.new(key)
    return cipher.decrypt(ciphertext).decode('utf-8')

if __name__ == '__main__':
    private_key = generate_key()
    public_key = private_key.publickey()
    s = "Hello, World!"
    print(f"明文: {s}")
    ciphertext = encrypt(s, public_key)
    print(f"加密后的密文: {ciphertext}")
    plaintext = decrypt(ciphertext, private_key)
    print(f"解密后的明文: {plaintext}")

对称加密

在示例代码中,我们使用了cryptography模块中的Fernet类实现AES对称加密和解密。

from cryptography.fernet import Fernet

def encrypt(s: str, key: bytes) -> bytes:
    """
    使用Fernet对称加密算法对字符串s进行加密,key是密钥
    """
    f = Fernet(key)
    return f.encrypt(s.encode('utf-8'))

def decrypt(ciphertext: bytes, key: bytes) -> str:
    """
    使用Fernet对称加密算法对密文进行解密,key是密钥
    """
    f = Fernet(key)
    return f.decrypt(ciphertext).decode('utf-8')

if __name__ == '__main__':
    key = Fernet.generate_key()
    s = "Hello, World!"
    print(f"明文: {s}")
    ciphertext = encrypt(s, key)
    print(f"加密后的密文: {ciphertext}")
    plaintext = decrypt(ciphertext, key)
    print(f"解密后的明文: {plaintext}")

总结

Python中有多种加密方法和模块可以用于对数据和信息进行加密,保护信息安全。在选择使用加密方法和模块时,应根据实际需求和情况选择合适的方法和模块,确保加密效率和安全性,同时注意保护密钥的安全性。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python的一些加密方法及python 加密模块 - Python技术站

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

相关文章

  • Python2/3中urllib库的一些常见用法

    Python2/3中urllib库的一些常见用法 在本文中,我们将介绍Python2/3中urllib库的一些常见用法。urllib库是Python标准库中用于处理URL的模块,它包含了一些常用的模块,如urllib.request、urllib.parse、urllib.error和urllib.robotparser。 步骤1:导入必要的库 在使用Pyt…

    python 2023年5月15日
    00
  • 基于Python编写一个微博抽奖小程序

    下文为您介绍“基于Python编写一个微博抽奖小程序”的完整攻略,包括环境配置、模块安装、编写代码等。 环境配置 首先,需要在计算机上安装Python环境。打开Python官方网站 https://www.python.org/downloads/ ,下载对应版本的Python安装包,并安装。 在安装完成后,需要添加Python环境变量。将Python的安装…

    python 2023年5月23日
    00
  • 解决python使用open打开文件中文乱码的问题

    下面是“解决python使用open打开文件中文乱码的问题”的完整攻略。 问题分析 在使用Python的open函数打开文件时,如果文件名或路径中包含中文字符,就会产生乱码。这是因为在Python2.x中,默认使用ASCII编码,而对于中文字符,ASCII编码无法表示,所以出现了乱码。 解决方案 使用Unicode编码打开文件 我们可以通过在文件名或路径前加…

    python 2023年5月20日
    00
  • 带你详细了解Python GUI编程框架

    带你详细了解Python GUI编程框架 什么是Python GUI编程框架 Python是一种强大的编程语言,常用于开发Web应用、数据分析和人工智能等领域。Python GUI编程框架是用于创建图形用户界面(Graphical User Interface,GUI)应用程序的软件库。它提供了一套工具和组件,帮助开发人员构建跨平台的、高效的用户界面。 Py…

    python 2023年6月13日
    00
  • Python实现希尔排序算法的原理与用法实例分析

    Python实现希尔排序算法的原理与用法实例分析 什么是希尔排序算法? 希尔排序是一种插入排序的改进版本,也被称为缩小增量排序。希尔排序将待排元素按照一定间隔(增量)分为若干个序列,对每个序列都进行插入排序,随着增量逐渐减小,每个序列包含的元素越来越多,当增量为1时,整个序列就变为了待排序序列,此时进行的排序就是一次插入排序。希尔排序的时间复杂度为O(n^1…

    python 2023年6月5日
    00
  • 详解pandas库pd.read_excel操作读取excel文件参数整理与实例

    下面是关于“详解pandas库pd.read_excel操作读取excel文件参数整理与实例”的完整实例教程。 1. 操作简介 在Python中,使用pandas库的read_excel()函数可以便捷地读取Excel文件,并将读取的数据转换成DataFrame格式,以便对数据进行操作分析。这个函数支持各种参数,可以让我们更好地掌控读取Excel文件的过程,…

    python 2023年5月13日
    00
  • Python 获取异常(Exception)信息的几种方法

    Python获取异常(Exception)信息的几种方法 在编写Python代码时,出错是不可避免的。当程序出错时,我们通常需要获取异常(Exception)信息来对错误进行调试。 Python提供了多种方法来获取异常信息。 方法一:使用try-except语句 使用try-except语句是最常见的方法之一。在try代码块中执行代码,如果出现异常则会跳转到…

    python 2023年5月13日
    00
  • 什么是从 Python 中的大字符串中去除空格的简单且内存有效的方法

    【问题标题】:What is a simple and memory efficient way strip whitespace from a large string in Python什么是从 Python 中的大字符串中去除空格的简单且内存有效的方法 【发布时间】:2023-04-04 18:42:01 【问题描述】: 我有一个大字符串,大小>…

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