脚本之家,脚本语言编程技术及教程分享平台!
分类导航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|shell|

服务器之家 - 脚本之家 - Python - python基于crypto实现加密与解密

python基于crypto实现加密与解密

2023-10-07 15:07LCY133 Python

本文主要为大家介绍下python基于crypto实现加密与解密的方法,有需要的朋友可以参考下

1.安装crypto库

pip install pycryptodome

ps:

使用pip工具安装步骤:

1、直接安装pycryptodome模块即可

pip install pycryptodome

2、如果你已经通过pip install crypto命令安装了,那么需要做以下两步:

(1)切换到python安装目录的liib\site-packages目录下,将crypto目录名称修改为Crypto,即将首字母小写改成大写。

(2)安装pycryptodome,使用命令pip install pycryptodome。安装pycryptodome后Crypto目录会多出很多实际程序要用到的文件目录。

2.实现AES的加密解密

from Crypto.Cipher import AES
from Crypto.Util.Padding import pad, unpad
from Crypto.Random import get_random_bytes

def encrypt(plain_text, key):
    iv = get_random_bytes(AES.block_size)
    cipher = AES.new(key, AES.MODE_CBC, iv)
    cipher_text = cipher.encrypt(pad(plain_text, AES.block_size))
    return iv + cipher_text

def decrypt(cipher_text, key):
    iv = cipher_text[:AES.block_size]
    cipher = AES.new(key, AES.MODE_CBC, iv)
    plain_text = unpad(cipher.decrypt(cipher_text[AES.block_size:]), AES.block_size)
    return plain_text

key = get_random_bytes(16)  # 16字节(128位)的随机密钥

plain_text = b'hello world'
cipher_text = encrypt(plain_text, key)
decrypted_text = decrypt(cipher_text, key)

print('Plain text:', plain_text)
print('Decrypted text:', decrypted_text)

不过要注意的是,在pycharm使用需要注意,直接import Crypto会报错,因为安装后再文件夹内的文件名是crypto,全是小写,而我们直接import crypto也是会出错,需要我们手动修改库文件名字为Crypto,参考文章:

https://blog.csdn.net/weixin_44133008/article/details/107102575

3.实现3DES加密解密

from Crypto.Cipher import DES3
from Crypto.Util.Padding import pad, unpad

# 加密函数
def encrypt(key, plaintext):
    # 创建3DES加密器
    cipher = DES3.new(key, DES3.MODE_ECB)
    # 填充明文
    plaintext = pad(plaintext, DES3.block_size)
    # 加密明文
    ciphertext = cipher.encrypt(plaintext)
    return ciphertext

# 解密函数
def decrypt(key, ciphertext):
    # 创建3DES解密器
    cipher = DES3.new(key, DES3.MODE_ECB)
    # 解密密文
    plaintext = cipher.decrypt(ciphertext)
    # 去除填充
    plaintext = unpad(plaintext, DES3.block_size)
    return plaintext

# 示例用法
key = b"0123456789abcdef"
plaintext = b"Hello, world!"
ciphertext = encrypt(key, plaintext)
decrypted_plaintext = decrypt(key, ciphertext)
print("明文:", plaintext)
print("密文:", ciphertext)
print("解密后明文:", decrypted_plaintext)

4.通过cryptography库实现3DES加密解密

其中需要指定加密方式为CBC,补码方式为PKCS7,不过以下代码解密后的内容有部分为乱码,有待解决。

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

# 3DES加密函数
def des_3_encrypt(data, key):
    # 创建3DES加密器
    cipher = Cipher(algorithms.TripleDES(key), modes.CBC(os.urandom(8)), backend=default_backend())
    # 加密数据
    encryptor = cipher.encryptor()
    padded_data = pad(data, 8, style='pkcs7')
    encrypted_data = encryptor.update(padded_data) + encryptor.finalize()
    return encrypted_data

# 3DES解密函数
def des_3_decrypt(data, key):
    # 创建3DES解密器
    cipher = Cipher(algorithms.TripleDES(key), modes.CBC(os.urandom(8)), backend=default_backend())
    # 解密数据
    decryptor = cipher.decryptor()
    decrypted_data = decryptor.update(data) + decryptor.finalize()
    unpadded_data = unpad(decrypted_data, 8, style='pkcs7')
    return unpadded_data

# PKCS7补码函数
def pad(data, block_size, style='pkcs7'):
    padding_size = block_size - len(data) % block_size
    padding = bytes([padding_size] * padding_size)
    if style == 'pkcs7':
        return data + padding
    elif style == 'x923':
        return b'\x80' + data + padding
    else:
        raise ValueError('Invalid padding style')

# PKCS7去码函数
def unpad(data, block_size, style='pkcs7'):
    if style == 'pkcs7':
        padding_size = data[-1]
    elif style == 'x923':
        padding_size = data[-1]
        if padding_size > block_size:
            raise ValueError('Invalid padding')
        if data[-padding_size:]!= bytes([padding_size] * padding_size):
            raise ValueError('Invalid padding')
    else:
        raise ValueError('Invalid padding style')
    return data[:-padding_size]

key = b"0123456789abcdef"
data = b"01234567890ABCDEF"
encrypted_data = des_3_encrypt(data, key)
decrypted_data = des_3_decrypt(encrypted_data, key)
print("Original data:", data)
print("Encrypted data:", encrypted_data)
print("Decrypted data:", decrypted_data)
print(decrypted_data.decode("ascii"))

到此这篇关于python基于crypto实现加密与解密的文章就介绍到这了,更多相关内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文地址:https://blog.csdn.net/LCY133/article/details/131801166

延伸 · 阅读

精彩推荐
  • Python使用python绘制二元函数图像的实例

    使用python绘制二元函数图像的实例

    今天小编就为大家分享一篇使用python绘制二元函数图像的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...

    阳光伴我们成长9302021-05-27
  • Python用vscode开发python的步骤详解

    用vscode开发python的步骤详解

    这篇文章主要介绍了用vscode开发python的步骤详解,本文分步骤给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...

    leoppeng7812021-12-17
  • Python利用一个简单的例子窥探CPython内核的运行机制

    利用一个简单的例子窥探CPython内核的运行机制

    这篇文章主要介绍了利用一个简单的例子窥探CPython内核的运行机制,作者通过一个简单的输出函数深入、介绍了CPython源码C代码中的一些函数,需要的朋友可...

    flowerhack2702020-05-26
  • PythonPython实现的在特定目录下导入模块功能分析

    Python实现的在特定目录下导入模块功能分析

    这篇文章主要介绍了Python实现的在特定目录下导入模块功能,结合实例形式分析了Python基于系统函数及import语句实现模块导入的相关操作技巧,需要的朋友可...

    徐为波5922021-05-27
  • Pythonpython 实现A*算法的示例代码

    python 实现A*算法的示例代码

    本篇文章主要介绍了python 实现A*算法的示例代码,A*作为最常用的路径搜索算法,值得我们去深刻的研究,具有一定的参考价值,感兴趣的小伙伴们可以参...

    未完代码9032021-03-27
  • Pythonpython自动生成证件号的方法示例

    python自动生成证件号的方法示例

    这篇文章主要给大家介绍了关于python自动生成证件号的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需...

    书院小先生7352021-08-25
  • Python12个Python数据处理常用内置函数

    12个Python数据处理常用内置函数

    在python数据分析中,经常需要对字符串进行各种处理,例如拼接字符串、检索字符串等。下面我将对python中常用的内置字符串操作函数进行介绍。...

    python数据分析之禅7502021-03-16
  • PythonPython实现socket库网络通信套接字

    Python实现socket库网络通信套接字

    socket又叫套接字,实现网络通信的两端就是套接字。分为服务器对应的套接字和客户端对应的套接字,本文给大家介绍Python实现socket库网络通信套接字的相...

    一天一篇Python库9232021-11-23