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日

相关文章

  • python中从for循环延申到推导式的具体使用

    可以使用for循环通过遍历list或者其他可迭代对象进行迭代操作,但是循环语法有时不够简洁,可以使用Python的推导式实现同样的操作。 Python中的推导式是一种简洁、快速、简单的利用迭代器快速构建一个列表、字典或集合的方法,Python中有列表推导式,字典推导式和集合推导式三种。 列表推导式 列表推导式使用简单,使用一行代码就能快速构建一个列表: ne…

    python 2023年5月13日
    00
  • Linux服务器网卡流量查看方法 shell和Python各一枚

    Linux服务器网卡流量查看方法 shell和Python各一枚 在Linux服务器上,我们经常会需要查看网卡的流量情况,以便了解网络带宽的使用情况和网络环境的波动情况。下面分别介绍使用shell脚本和Python脚本来查看网卡流量的方法。 使用Shell脚本查看网卡流量 在Linux系统中,我们可以通过/proc/net/dev文件来查看网卡的流量情况。我…

    python 2023年6月3日
    00
  • 只用20行Python代码实现屏幕录制功能

    下面是详细讲解“只用20行Python代码实现屏幕录制功能”的完整攻略。 1. 需求分析 我们需要实现一个屏幕录制功能,能够将电脑屏幕的内容录制下来保存为视频文件。 2. 技术选择 我们可以使用Python语言的Pillow模块和OpenCV库来实现这个功能。其中,Pillow模块可以用来捕获屏幕截图,OpenCV库可以用来将多张图片组成视频文件。 3. 实…

    python 2023年5月19日
    00
  • python字符串string的内置方法实例详解

    下面是“python字符串string的内置方法实例详解”的完整攻略: Python字符串string的内置方法实例详解 一、前言 在 Python 中,字符串是一个非常常用且重要的数据类型,常常使用其中内置的方法来进行各种字符串操作。本文旨在详细介绍 Python 字符串的内置方法,以及如何使用它们。 二、字符串的表示方式 字符串可以使用单引号(’)或双引…

    python 2023年6月5日
    00
  • 用Python编写一个基于终端的实现翻译的脚本

    下面是用Python编写一个基于终端的实现翻译的脚本的完整攻略。 1. 准备工作 在开始编写脚本之前,我们需要进行一些准备工作。 安装Python 首先,需要安装Python环境。如果您的电脑上还没有Python环境,可以在Python官网上下载并安装最新版的Python。 安装翻译库 我们需要使用一个翻译库来实现翻译功能。这里我们选择使用百度翻译API,需…

    python 2023年5月19日
    00
  • python 比较字典value的最大值的几种方法

    当我们需要比较Python字典value的最大值时,有以下几种方法: 1. 使用max()方法 可以使用Python内置的max()方法来比较字典的value的最大值。 max()方法接受一个可迭代的对象作为参数,并返回其中最大的那个值。 示例代码: # 定义一个字典 my_dict = {‘a’: 10, ‘b’: 5, ‘c’: 15, ‘d’: 20}…

    python 2023年5月13日
    00
  • Python 制作查询商品历史价格的小工具

    Python制作查询商品历史价格的小工具 在本教程中,我们将介绍如何使用Python制作一个查询商品历史价格的小工具。我们将使用Python的requests库和BeautifulSoup库来实现这个功能。以下是一个完整攻略,含两个示例。 步骤1:获取商品历史价格数据 首先,我们需要获取商品历史价格数据。我们可以使用requests库发送HTTP请求,并使用…

    python 2023年5月15日
    00
  • PyQt5中向单元格添加控件的方法示例

    下面是详细的攻略: PyQt5中向单元格添加控件的方法示例 在PyQt5中,我们可以向单元格添加控件,以实现更加丰富的界面效果。本文将手把手教你如何在PyQt5中向单元格添加控件,并提供两个示例说明。 方法一:使用setCellWidget方法 在PyQt5中,我们可以使用setCellWidget方法向单元格添加控件。下面是具体步骤: 创建表格控件 创建需…

    python 2023年5月14日
    00
合作推广
合作推广
分享本页
返回顶部