文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

python基于crypto实现加密与解密

2023-10-10 15:54

关注

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 AESfrom Crypto.Util.Padding import pad, unpadfrom Crypto.Random import get_random_bytesdef 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_textdef 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_textkey = 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 DES3from 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, modesfrom cryptography.hazmat.backends import default_backendimport 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"))

来源地址:https://blog.csdn.net/LCY133/article/details/131801166

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     801人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     348人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     311人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     432人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     220人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯