首页 > 编程语言 >Python 实现 AES 加密/解密

Python 实现 AES 加密/解密

时间:2024-03-07 09:44:56浏览次数:22  
标签:AES utf Python 解密 sign key encode data

AES,高级加密标准(Advanced Encryption Standard)。是用来替代 DES,目前比较流行的对称加密算法。与上一篇博文提到过的 RSA 非对称算法不同,对称加密算法也就是加密和解密用相同的密钥

# -*- coding: utf-8 -*-
# !/usr/bin/env python

import os
import sys

sys.path.append(os.path.abspath(os.path.dirname(__file__) + '/' + '..'))

import json
import rsa
import requests
import time
import uuid

from Crypto.Cipher import AES
import base64

BLOCK_SIZE = AES.block_size

pad = lambda s: s + (BLOCK_SIZE - len(s.encode()) % BLOCK_SIZE) * chr(BLOCK_SIZE - len(s.encode()) % BLOCK_SIZE)
unpad = lambda s: s[:-ord(s[len(s) - 1:])]


def sign_data_with_rsa(private_key, unsigned, digest_alg):
    pri_key = rsa.PrivateKey.load_pkcs1(open(private_key).read())

    signature = rsa.sign(unsigned, pri_key, hash_method=digest_alg)
    return base64.b64encode(signature)


def aesEncrypt(secret, data):
    '''
    AES的MODE_CBC模式加密方法
    :param key: 密钥
    :param data:被加密字符串(明文)
    :return:密文
    '''

    key = secret[0:24].encode('utf-8')
    IV = secret[24:].encode('utf-8')
    # 字符串补位
    data = pad(data)
    cipher = AES.new(key, mode=AES.MODE_CBC, IV=IV)
    # 加密后得到的是bytes类型的数据,使用Base64进行编码,返回byte字符串
    result = cipher.encrypt(data.encode())
    encodestrs = base64.b64encode(result)
    enctext = encodestrs.decode('utf-8')
    print(enctext)
    return enctext


def decrypt_aes(sSrc, key, iv):
    """
    AES 解密
    :param sSrc:
    :param key:
    :param iv:
    :return:
    """
    try:
        raw = key.encode('ASCII')
        skey_spec = AES.new(raw, AES.MODE_CBC, iv.encode())
        encrypted = base64.b64decode(sSrc)
        original = skey_spec.decrypt(encrypted)
        return original.decode("utf-8")
    except Exception as e:
        print(e)
        raise e


if __name__ == "__main__":
    # 测试服 appid 和secret
    secret = 'xxxxx'
    appid = "xxxxxxxx"

    url = "https://xxxx.test.xxxxx.com/xxxv1"
    nonce = str(uuid.uuid4()).replace("-", "")
    timestamp = time.strftime("%Y-%m-%d %H:%M:%S")
    req_data = {
        "appid": "xxxx".encode("utf-8"),  # 测试app_id
        "biz_data": "".encode("utf-8"),
        "sign_type": "SHA256".encode("utf-8"),
        # "encrypt_data": "ENCRYPTDATA".encode("utf-8"), # 此字段为加密内容 获取用户信息无需填写,如果要填写必须做加密
        "encrypt_data": "",
        "sign": "",
        "timestamp": timestamp.encode("utf-8"),
        "encrypt_type": "AES".encode("utf-8"),
        "nonce": nonce.encode("utf-8")
    }
    data = {
        "data": {"Info": {"OpenId": "xxxxxxx", "UserIdType": 0,
                          "ClientId": "xxxxxxx", "Remark": "", "IsInvoice": 0,
                          "TotalQty": "5.00",
                          "TotalValue": "495.00", "SettlementValue": "495.00", "FreightFee": 0,
                          "ExternalBillNo": "22062510297975", "OrgId": "0200000893",
                          "OrderProductModelList": "[{\"supplierProductCode\":1000046232\"supplierProductName\":\"测试手镯\"\"seqNo\":0\"price\":2,\"settlementPrice\":2,\"qty\":1\"totalValue\":2\"settlementTotalValue\":2,\"imgNormalUrl\":\"a55092a9d5c6475f99415d44eff970769900002720171115\"}]"}}}

    message = json.dumps(data, separators=(',', ':'))
    req_data["encrypt_data"] = aesEncrypt(secret, message).encode("utf-8")  # AES 采用CBC方式加密

    kv = [str(req_data[k]) for k in sorted(req_data.keys()) if req_data[k]]
    if len(kv):
        unsigned = "@".join(kv)
    else:
        unsigned = ''

    unsigned = unsigned.encode("utf-8")

    pri_full_path = "/tmp/test_private_key2.pem"

    print "unsigned:", unsigned
    sign = sign_data_with_rsa(pri_full_path, unsigned, digest_alg="SHA-256")  # 采用SHA-256方式做签名
    print "sign:", sign

    req_data["sign"] = sign.encode("utf-8")

    res = requests.post(url=url, json=req_data)
    print res.text

    # {"biz_content":"","biz_encrypt":"OL/TjVRqKAclNXYaPEw6ZC3qZ5Z6zD4SIlsx4M0c6g9p+uFMJ+86sdQpZ0NVUFILDIqrkxob7YTZIrJcf5egtk3SpTskiY9C4V1VvGTGA8k=","code":"0000","msg":"sccuess","responseid":"20240305183213591124668","sign":"FA1wZKBplc8jeeBJ9ioZqSA77nRmkrkW7XjY2hmW96KcRdvxbwCAEm0Ap4oJj6HWk/IYSPJkhDFKGauKF5M+8fqadvbvc161Eh6Oz7yMpPcE28BlrFdHiayylrNaXVuzEktclptXyt4vGasjMU9FTww4WkMFzNf6PLUDjxSWtJ8mvGs2tock9T2ZCgLzWTkn8IFpdE6YRquibBWu5LQvevGDQygfSEEZh73nhyjsg0IArDlNmhunZDU9g7aR3Zobk60L0IRxhQOhVHHR2LYc09f1u5/VQ0C+QFe2LOvLojSyuTQegifwI68IicXVTGaUCEobb6wQ9fWvVUvFM0YEkQ=="}
    data = decrypt_aes(
        "OL/TjVRqKAclNXYaPEw6ZC3qZ5Z6zD4SIlsx4M0c6g9p+uFMJ+86sdQpZ0NVUFILDIqrkxob7YTZIrJcf5egtk3SpTskiY9C4V1VvGTGA8k=",
        secret[:24], secret[24:])  # AES 解密
    print data

 

标签:AES,utf,Python,解密,sign,key,encode,data
From: https://www.cnblogs.com/zhaoyingjie/p/18058200

相关文章

  • Java开发者的Python快速进修指南:掌握T检验
    前言T检验是一种用于比较两个独立样本均值差异的统计方法。它通过计算T值和P值来判断样本之间是否存在显著性差异。通常情况下,我们会有两组数据,例如一组实验组和一组对照组。T检验的原假设是两组样本的均值相等,备假设是两组样本的均值不相等。T检验会计算一个T值,表示两组样本均......
  • Python开启线程和线程池的方法
    一.最佳线程数的获取:1、通过用户慢慢递增来进行性能压测,观察QPS(即每秒的响应请求数,也即是最大吞吐能力。),响应时间2、根据公式计算:服务器端最佳线程数量=((线程等待时间+线程cpu时间)/线程cpu时间)*cpu数量3、单用户压测,查看CPU的消耗,然后直接乘以百分比,再进行压测,一般这个值......
  • Python中判定列表是否包含某个元素的方法
    大家好,我是彭涛,今天为大家分享Python中判定列表是否包含某个元素的方法,全文4000字,阅读大约10分钟。在Python编程中,判定一个列表是否包含特定元素是一项常见任务。本文将深入研究各种方法,从基本的成员运算符到更高级的函数和库的应用,为大家提供全方位的指南和实用示例。1.成......
  • python表达式
    a,b,c=1,2,3 #1.常规ifa>b:  c=aelse:  c=b #2.表达式c=aifa>belseb#先执行中间的if,如果返回True,就是左边,False是右边。print(c)#3.二维列表c=[b,a][a>b]#实际是[b,a][False],因为False被转换为0,所以是[1,2][0],也就是[1]   ......
  • 费马素性检验(python实现)
    费马素性检验:给定奇整数n>=3和安全参数t1、随机选取整数b,(b,n)=1,2<=b<=n-22、计算r=b的n-1次方(modn)3、如果r!=1,则n是合数4、上述过程重复t次以下是python代码,如发现错误,请跟博主联系importrandom#n>=3且n是奇整数n=int(input())t=int(input())defgcd(a,b):wh......
  • 零基础python编程基础
    1.计算机:脑力劳动工具                                       2. ......
  • netcore AES同等效转java语言 加密方法
    privatestaticbyte[]Keys={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F};///<summary>///DES加密字符串///</summary>///<paramname="encryptString&qu......
  • python控制windows命令行程序
    有一些现成的库,比如WExpect,是开源的,在github上可以搜索到.但是,不知道为什么,在我自己的笔记本上不能正常工作.而其源码也比较多,懒得定位了.于是自己实现了一个,用法如下.启动和停止命令行importmy_cmdascmdcmd.start()cmd.stop()prompt命令行提示符匹......
  • Python中那些简单又好用的特性和用法
    Python作为我的主力语言帮助我开发了许多DevOps运维自动化系统,这篇文章总结几个我在编写Python代码过程中用到的几个简单又好用的特性和用法,这些特性和用法可以帮助我们更高效地编写Python代码1.链式比较x=5y=10z=15ifx<y<z:print("xislessthanyandy......
  • qgis 3.30 python开发环境搭建
     1.使用mamba加速conda下载qgiscondainstall-cconda-forge-nbasemamba2.创建qgis虚拟环境condacreate-nqgispython=3.11condaactivateqgis(管理员CMD)mambainstall-cconda-forgeqgis=3.30.0mambainstall-cconda-forgerasteriomambainstall-cco......