Python使用Crypto库实现加密解密的示例详解

   2023-02-08 学习力0
核心提示:目录一:crypto库安装二:python使用crypto1:crypto的加密解密组件des.py2:crypto组件使用知识补充一:crypto库安装pycrypto,pycryptodome是crypto第三方库,pycrypto已经停止更新三年了,所以不建议安装这个库;pycryptodome是pycrypto的延伸版本,用法和

一:crypto库安装

pycrypto,pycryptodome是crypto第三方库,pycrypto已经停止更新三年了,所以不建议安装这个库;pycryptodome是pycrypto的延伸版本,用法和pycrypto 是一模一样的;所以只需要安装pycryptodome就可以了

pip install pycryptodome

二:python使用crypto

1:crypto的加密解密组件des.py

#!/usr/bin/env python
# -*- coding: utf-8 -*-
 
from Crypto.Cipher import DES
from binascii import b2a_hex, a2b_hex
class MyDESCrypt: #自己实现的DES加密类
    def __init__(self, key = ''):
        #密钥长度必须为64位,也就是8个字节
        if key is not '':
            self.key = key.encode('utf-8')
        else:
            self.key = '12345678'.encode('utf-8')
        self.mode = DES.MODE_CBC
    # 加密函数,如果text不足16位就用空格补足为16位,
    # 如果大于16当时不是16的倍数,那就补足为16的倍数。
    def encrypt(self,text):
        try:
            text = text.encode('utf-8')
            cryptor = DES.new(self.key, self.mode, self.key)
            # 这里密钥key 长度必须为16(DES-128),
            # 24(DES-192),或者32 (DES-256)Bytes 长度
            # 目前DES-128 足够目前使用
            length = 16   #lenth可以设置为8的倍数
            count = len(text)
            if count < length:
                add = (length - count)
                # \0 backspace
                # text = text + ('\0' * add)
                text = text + ('\0' * add).encode('utf-8')
            elif count > length:
                add = (length - (count % length))
                # text = text + ('\0' * add)
                text = text + ('\0' * add).encode('utf-8')
            self.ciphertext = cryptor.encrypt(text)
            # 因为DES加密时候得到的字符串不一定是ascii字符集的,输出到终端或者保存时候可能存在问题
            # 所以这里统一把加密后的字符串转化为16进制字符串
            return b2a_hex(self.ciphertext)
        except:
            return ""
    # 解密后,去掉补足的空格用strip() 去掉
    def decrypt(self, text):
        try:
            cryptor = DES.new(self.key, self.mode, self.key)
            plain_text = cryptor.decrypt(a2b_hex(text))
            # return plain_text.rstrip('\0')
            return bytes.decode(plain_text).rstrip('\0')
        except:
            return ""

2:crypto组件使用

from . import des
msg = "password is 961223"
key = "12345678"  #key值可传可不传
des1 = des.MyDESCrypt()
#加密
cipherTxt = des1.encrypt(msg)  #返回值为bytes型
print(cipherTxt)
#解密
decTxt = des1.decrypt(cipherTxt);  #返回值为str型
print(decTxt)

知识补充

下面是小编为大家整理的一些Python利用pycrypto进行加密解密的示例,希望对大家有所帮助

AES-ECB加解密

下面是采用 ECB并以pkcs7填充的加密与解密方法

import base64

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


def aes_encrypt(secret_key, data):
    """加密数据
    :param secret_key: 加密秘钥
    :param data: 需要加密数据
    """
    data = bytes(data, encoding="utf-8")
    # 填充数据采用pkcs7
    data = pad(data, block_size=16, style="pkcs7")
    # 创建加密器
    cipher = AES.new(key=secret_key.encode("utf-8"), mode=AES.MODE_ECB)
    # 对数据进行加密
    encrypted_data = cipher.encrypt(data)
    # 对数据进行base64编码
    encrypted_data = base64.b64encode(encrypted_data)
    return encrypted_data.decode()


def aes_decrypt(secret_key, data):
    """解密数据
    """
    data = base64.b64decode(data)
    cipher = AES.new(key=secret_key.encode("utf-8"), mode=AES.MODE_ECB)
    decrypt_data = cipher.decrypt(data)
    decrypt_data = unpad(decrypt_data, 16, style="pkcs7")
    return decrypt_data.decode("utf-8")


if __name__ == '__main__':
    key = "22a1d4c4263e83d7f8c33a321eb19ae7"
    data = "asdASD73j8H9k6C1asvhBOK0PXOzJM7dsqXysssW"
    print("原始数据:%s" % data)
    r = aes_encrypt(key, data)
    print("加密数据:%s" % r)
    r = aes_decrypt("22a1d4c4263e83d7f8c33a321eb19ae7", r)
    print("解密数据:%s" % r)

执行结果如下

Python使用Crypto库实现加密解密的示例详解

AES-GCM加解密

import base64
import random
import string

from Crypto.Cipher import AES


def encrypt_aes_gcm(key, data, associated_data=None, nonce=None):
    """
    AES-GCM加密
    :param key: 密钥。16, 24 or 32字符长度的字符串
    :param data: 待加密字符串
    :param associated_data: 附加数据,一般为None
    :param nonce: 随机值,和MD5的“加盐”有些类似,目的是防止同样的明文块,始终加密成同样的密文块
    :return:
    """
    key = key.encode('utf-8')
    data = data.encode('utf-8')
    # 假如先后端约定随机值为16位长度的字符串
    nonce = nonce or "1234567812345678"
    nonce = nonce.encode("utf-8")

    # 生成加密器
    cipher = AES.new(key, AES.MODE_GCM, nonce=nonce)
    if associated_data is not None:
        cipher.update(associated_data.encode())

    # 加密数据
    cipher_data, auth_tag = cipher.encrypt_and_digest(data)

    # 拼接数据
    join_data = nonce + cipher_data + auth_tag      # 拼接数据为:前16位为nonce,后16位为验签值

    # 返回base64编码数据
    return base64.b64encode(join_data).decode('utf-8')


def decrypt_aes_gcm(key, cipher_data, associated_data=None):
    """
    AES-GCM解密
    :param cipher_data: encrypt_aes_gcm 方法返回的数据
    :return:
    """
    key = key.encode('utf-8')

    # 进行base64解码
    debase64_cipher_data = base64.b64decode(cipher_data)

    # 分割数据
    nonce = debase64_cipher_data[:16]
    cipher_data = debase64_cipher_data[16:-16]
    auth_tag = debase64_cipher_data[-16:]

    cipher = AES.new(key, AES.MODE_GCM, nonce=nonce)
    if associated_data is not None:
        cipher.update(associated_data.encode())

    # 解密数据
    plaintext = cipher.decrypt_and_verify(cipher_data, auth_tag)
    return plaintext.decode()


if __name__ == '__main__':
    aes_key = 'DnKRYZbvVzdhPlF10rtcxmi5Cj36AbCd'
    associated_data = "1234567812345678"
    nonce = ''.join(random.sample(string.ascii_letters + string.digits, 16))
    data = '{"lang":"zh-CN","pageNumber":1,"pageSize":10,"cycleId":"1522973936269266945"}'
    print("原始数据:" + data)

    cipher_data = encrypt_aes_gcm(aes_key, data, associated_data=associated_data, nonce=nonce)
    print("加密数据:" + cipher_data)

    de_data = decrypt_aes_gcm(aes_key, cipher_data, associated_data)
    print("解密数据:" + de_data)

执行结果如下:

Python使用Crypto库实现加密解密的示例详解

使用RAS实现非对称加解密

# -*- coding: utf-8 -*-

from Crypto import Random
from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_v1_5
import base64


def get_key():
    """生成公私钥"""
    # 生成rsa算法实例
    rsa = RSA.generate(1024, Random.new().read)
    # 生成公钥私钥
    private_pem = rsa.exportKey()
    public_pem = rsa.publickey().exportKey()

    return {
        "public_key": public_pem.decode(),
        "private_key": private_pem.decode()
    }


def rsa_encrypt(data, public_key):
    """公钥加密"""
    # 加载公钥
    rsakey = RSA.importKey(public_key)
    # 生成密码器
    cipher = PKCS1_v1_5.new(rsakey)
    # 加密数据。注意,在python3中加密的数据必须是bytes类型的数据,不能是str类型的数据
    encrypt_data = cipher.encrypt(data.encode(encoding="utf-8"))
    # # 对数据进行base64编码
    encrypt_data = base64.b64encode(encrypt_data)
    # 公钥每次加密的结果不一样。原因是每次padding的数据不一样
    return encrypt_data.decode()


def rsa_decrypt(cipher_data, private_key):
    """私钥解密"""
    # 加载私钥
    rsakey = RSA.importKey(private_key)
    # 生成密码器
    cipher = PKCS1_v1_5.new(rsakey)
    # 将密文解密成明文,返回的是一个bytes类型数据,需要自己转换成str
    decrypt_data = cipher.decrypt(base64.b64decode(cipher_data), "解密失败")
    return decrypt_data.decode()


if __name__ == '__main__':
    # k = get_key()
    # public_key = k.get("public_key")
    # private_key = k.get("private_key")
    #
    # print(public_key)
    # print(private_key)

    public_key = """-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDKF7UTc5K61xMUKrCtld0dYJf/
KjT5P+R3H8n8my8aEYqUaWQjO3CkQGsLN//5Tbs8g5Of4vAkqytoleWxSQxFGO7T
YuOQ7UtvRhKqTKvX8PvDnKX7ebKzw3zIXt1QDRbc2bJTqVAbPDdT1DNvyocQdCMC
BtPA2algMRs4Zq0qpwIDAQAB
-----END PUBLIC KEY-----
    """
    private_key = """-----BEGIN RSA PRIVATE KEY-----
MIICWwIBAAKBgQDKF7UTc5K61xMUKrCtld0dYJf/KjT5P+R3H8n8my8aEYqUaWQj
O3CkQGsLN//5Tbs8g5Of4vAkqytoleWxSQxFGO7TYuOQ7UtvRhKqTKvX8PvDnKX7
ebKzw3zIXt1QDRbc2bJTqVAbPDdT1DNvyocQdCMCBtPA2algMRs4Zq0qpwIDAQAB
AoGAE3LSn0uZDFgUYvV0yU/J1sDr/8dtD6uhbgFmK+Q3VTfo8T1vQKDAx13Xr121
SaW8Zid3doSdfbnnVIpQb45LGtM5GLLDEslSBVJ/u2pNaUF/JmwK+PZVe02g2zCX
rtmceROdOQZo66Iq3jlV3PWcuZdTr1n6XLgbXNyMyeQHf7ECQQDNfJN/ifeXZIk6
ouqWMGdlW6kFTCHXBGeSETqG5otfJWyvGDPOpN+950VXEObcU5y+yyGMX9CEyMNX
B65U/nY5AkEA+8WLBoz2orSptQTB8aDsBfy7rzOnqC7cPepSzsu5oIkNxe1ZJC3j
p0m/0UYpKOgb6RWGi4MhtdfYubMpRQ2n3wJACPoLO4Qcc9mpgQ1C8EK3EZ96d8fG
pq0DlUb5ZpFFv2dUIyYMhVeAirxCtDYBz9g7Pb6D/azl4BchKXklbYMcSQJAViwr
xGc090V8nG9vbiNVBUuWdYXpiV/Yk/yCsTL7at3d7/OnwgFO3PAaDifEaLLg8qsi
bNfKDvI8xHp00qS04wJAeNJg/6C4Xwo1GYeAg2HIy0yHIQ9gs1hwA5zXdUc/7t+9
UkZj7rd2ySQJmXsO2LU0/SvmLIjiNoG3frjWS+dqLA==
-----END RSA PRIVATE KEY-----
    """

    data = "hello python!"
    cipher_data = rsa_encrypt(data, public_key)
    print(cipher_data)

    decrypt_data = rsa_decrypt(cipher_data, private_key)
    print(decrypt_data)

执行结果如下

Python使用Crypto库实现加密解密的示例详解

原文地址:https://blog.csdn.net/huaweichenai/article/details/128645685
 
反对 0举报 0 评论 0
 

免责声明:本文仅代表作者个人观点,与乐学笔记(本网)无关。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
    本网站有部分内容均转载自其它媒体,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责,若因作品内容、知识产权、版权和其他问题,请及时提供相关证明等材料并与我们留言联系,本网站将在规定时间内给予删除等相关处理.

  • 如何在Abaqus的python中调用Matlab程序
    目录1. 确定版本信息2. 备份python3. 设置环境变量4. 安装程序5. 调试运行参考资料Abaqus2018操作系统Win10 64位Python版本2.7(路径C:\SIMULIA\CAE\2018\win_b64\tools\SMApy\python2.7)2. 备份python将上述的“python2.7”文件夹复制出来,避免因操作错误
    03-16
  • SICP:复数的直角和极坐标的表示(Python实现)
    SICP:复数的直角和极坐标的表示(Python实现)
    数据抽象屏障是控制复杂性的强有力工具,然而这种类型的数据抽象还不够强大有力。从一个另一个角度看,对于一个数据对象可能存在多种有用的表示方式,且我们希望所设计的系统能够处理多种表示形式。比如,复数就可以表示为两种几乎等价的形式:直角坐标形式(
    03-16
  • [个人发展] 我做了一个可以永远谈论任何事情的女士对话AI(TypeScript,Python)
    [个人发展] 我做了一个可以永远谈论任何事情的
    在个人发展中对话式人工智能服务 Eveki我做了虚构角色1这是一项以人工智能为特色的服务,可以再现并享受自然对话。这一次,作为第一个艾小姐发表了。请先尝试实物。服务概览与人工智能对话基本上只需输入您的信息是。对话是用女士的语言进行的,就像人类一样
    03-08
  • ruby写爬虫 ruby python
    ruby写爬虫 ruby python
    http://www.javaeye.com/topic/545160爬虫性能比较http://www.rubyrailways.com/data-extraction-for-web-20-screen-scraping-in-rubyrails/srcapihttp://huacnlee.com/blog/ruby-scrapi-collect-koubei  2009年4月22日 星期三用ruby写的一个网络爬虫程序前
    03-08
  • sf02_选择排序算法Java Python rust 实现
    Java 实现package common;public class SimpleArithmetic {/** * 选择排序 * 输入整形数组:a[n] 【4、5、3、7】 * 1. 取数组编号为i(i属于[0 , n-2])的数组值 a[i],即第一重循环 * 2. 假定a[i]为数组a[k](k属于[i,n-1])中的最小值a[min],即执行初始化 min =i
    02-09
  • Python vs Ruby: 谁是最好的 web 开发语言?
    Python 和 Ruby 都是目前用来开发 websites、web-based apps 和 web services 的流行编程语言之一。 这两种语言在许多方面有相似之处。它们都是高级的面向对象的编程语言,都是交互式脚本语言、都提供标准库且支持持久化。但是,Python 和 Ruby 的解决方法却
    02-09
  • 详解Python手写数字识别模型的构建与使用
    详解Python手写数字识别模型的构建与使用
    目录一:手写数字模型构建与保存1 加载数据集2 特征数据 标签数据3 训练集 测试集4 数据流图 输入层5 隐藏层6 损失函数7 梯度下降算法8 输出损失值 9 模型 保存与使用10 完整源码分享二:手写数字模型使用与测试一:手写数字模型构建与保存1 加载数据集# 1加
  • Python asyncore socket客户端实现方法详解
    Python asyncore socket客户端实现方法详解
    目录介绍1.定义类并且继承 asyncore.dispatcher2.实现类中的回调代码调用父类方法创建socket对象连接服务器3.创建对象并且执行asyncore.loop进入运行循环服务端示例代码运行结果注意介绍asyncore库是python的一个标准库,提供了以异步的方式写入套接字服务的
  • Python+Sklearn实现异常检测
    目录离群检测 与 新奇检测Sklearn 中支持的方法孤立森林 IsolationForestLocal Outlier FactorOneClassSVMElliptic Envelope离群检测 与 新奇检测很多应用场景都需要能够确定样本是否属于与现有的分布,或者应该被视为不同的分布。离群检测(Outlier detectio
  • Python基础教程之while循环用法讲解 Python中的while循环
    Python基础教程之while循环用法讲解 Python中的
    目录1.while 循环2.无限循环3、while 循环使用 else 语句4、简单语句组附小练习:总结1.while 循环Python 中 while 语句的一般形式:while 判断条件(condition):    执行语句(statements)……执行流程图如下:同样需要注意冒号和缩进。另外,在 Python 中
点击排行