python项目加密和增加时间许可证

在这里插入图片描述

1.bat,执行如下的命令,第一句是更新或增加许可证
第二句是加密draw_face.py

python offer.py
pyarmor obfuscate -O dist draw_face.py

绘制自制人脸.py,调用加密的代码draw_face代码

import sys
import os
import cv2

# 添加加密模块所在的路径
sys.path.append('C:\\Users\\67099\PycharmProjects\pythonProject1\dist')

try:
    import draw_face  # 导入加密后的模块
except ImportError:
    print("Failed to import draw_face module.")
    sys.exit(1)

# 示例代码调用
image_path = "C:\\Demos\\face_detection1\\imghand\\frame_80.jpg"
input_str = """290 206 119 154 318.0 254.0 1 372.0 255.0 1 341.0 288.0 1 323.0 317.0 1 371.0 317.0 1 0.8"""

resized_image = draw_face.process_image(image_path, input_str)
if resized_image is not None:
    # 显示缩小后的图像
    cv2.imshow("Bounding Box and Key Points", resized_image)
    cv2.waitKey(0)
else:
    cv2.destroyAllWindows()
    print("Failed to process the image.")

offer.py,新增许可证

#!/usr/bin/env python3
from Crypto.Cipher import AES
from binascii import b2a_hex

# 定义加密函数
def encrypt(content):
    # 校验密钥是否为16或16的倍数
    while len(content) % 16:
        content += ' '
    # 把密钥编码为utf-8
    content = content.encode('utf-8')
    # cwillchris123321为加密密钥(必须16位)
    aes = AES.new(b'cwillchris123321', AES.MODE_CBC, b'cwillchris123321')
    # 对密钥进行aes加密
    encrypted_content = aes.encrypt(content)
    # 返回二进制数据的十六进制表示
    return b2a_hex(encrypted_content)

# 生成许可证文件
def gen_license_file(username, expiry_date):
    license_file = './License.dat'
    # 设置用户名和脚本使用的有效期
    with open(license_file, 'w') as LF:
        # 写入用户名
        LF.write(f'Username : {username}\n')
        # 写入有效期
        LF.write(f'Date : {expiry_date}\n')
        # 生成签名,防止篡改
        sign = encrypt(f'{username}#{expiry_date}')
        # 将生成的签名进行utf-8编码后写入许可证文件
        LF.write(f'Sign : {sign.decode("utf-8")}\n')

if __name__ == '__main__':
    # 示例调用,生成许可证文件
    gen_license_file('example_user', '20240624')

在这里插入图片描述
draw_face.py,要加密的程序,注意要加密的程序上面增加下面这段话

from Crypto.Cipher import AES
from binascii import a2b_hex
import datetime

def decrypt(encrypted_content):
    encrypted_content = a2b_hex(encrypted_content)
    aes = AES.new(b'cwillchris123321', AES.MODE_CBC, b'cwillchris123321')
    decrypted_content = aes.decrypt(encrypted_content)
    return decrypted_content.decode('utf-8').strip()

def verify_license_file():
    license_file = './License.dat'
    try:
        with open(license_file, 'r') as LF:
            lines = LF.readlines()
            username = lines[0].split(' : ')[1].strip()
            date = lines[1].split(' : ')[1].strip()
            sign = lines[2].split(' : ')[1].strip()

            expected_sign = decrypt(sign)
            if expected_sign == f'{username}#{date}':
                current_date = datetime.datetime.now().strftime('%Y%m%d')
                if current_date <= date:
                    return True
                else:
                    print('License has expired.')
            else:
                print('License is invalid.')
    except Exception as e:
        print(f'Error verifying license: {e}')
    return False

if not verify_license_file():
    raise SystemExit('Invalid or expired license. Please contact support.')

完整的代码如下所示

from Crypto.Cipher import AES
from binascii import a2b_hex
import datetime

def decrypt(encrypted_content):
    encrypted_content = a2b_hex(encrypted_content)
    aes = AES.new(b'cwillchris123321', AES.MODE_CBC, b'cwillchris123321')
    decrypted_content = aes.decrypt(encrypted_content)
    return decrypted_content.decode('utf-8').strip()

def verify_license_file():
    license_file = './License.dat'
    try:
        with open(license_file, 'r') as LF:
            lines = LF.readlines()
            username = lines[0].split(' : ')[1].strip()
            date = lines[1].split(' : ')[1].strip()
            sign = lines[2].split(' : ')[1].strip()

            expected_sign = decrypt(sign)
            if expected_sign == f'{username}#{date}':
                current_date = datetime.datetime.now().strftime('%Y%m%d')
                if current_date <= date:
                    return True
                else:
                    print('License has expired.')
            else:
                print('License is invalid.')
    except Exception as e:
        print(f'Error verifying license: {e}')
    return False

if not verify_license_file():
    raise SystemExit('Invalid or expired license. Please contact support.')


import cv2
import numpy as np

def process_image(image_path, input_str):
    # 读取图像
    image = cv2.imread(image_path)

    # 检查图像是否成功加载
    if image is None:
        print(f"Error: Unable to load image from {image_path}")
        return None

    # 将输入字符串按行分割
    lines = input_str.strip().split('\n')

    # 遍历每行
    for line in lines:
        # 将每行按空格分割,获取所有数字
        values = line.split()

        # 提取前4个数字,代表框的范围
        box = [int(values[i]) for i in range(4)]

        # 将浮点数列表分组成(x, y)坐标对,每组保留第1、2个数字,去掉第3个数字,直到第19个数字
        keypoints = [(float(values[i]), float(values[i + 1]), float(values[i + 2])) for i in range(4, 19, 3)]

        # 将坐标转换为整数
        keypoints = np.array(keypoints, dtype=np.int32)

        # 遍历关键点,使用不同颜色进行标记
        for point in keypoints:
            if point[2] == 1.0:
                cv2.circle(image, (point[0], point[1]), 5, (0, 0, 255), -1)  # 红色
            else:
                cv2.circle(image, (point[0], point[1]), 5, (0, 255, 0), -1)  # 绿色

        # 在图像上绘制边界框
        cv2.rectangle(image, (box[0], box[1]), (box[0] + box[2], box[1] + box[3]), (0, 0, 255), 2)

    # 等比例缩小图像
    scale_factor = 0.5  # 缩小50%
    width = int(image.shape[1] * scale_factor)
    height = int(image.shape[0] * scale_factor)
    dim = (width, height)

    resized_image = cv2.resize(image, dim, interpolation=cv2.INTER_AREA)

    return resized_image

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/739665.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

[MYSQL] 数据库基础

1.什么是数据库 从数据库的名字可以看出,它是用来操作(增删查改....)数据的,事实上也的确如此,通过数据库,我们可以更方便.更高效的来操作.管理数据 以文件形式存储数据的缺点 文件的安全问题文件不利于数据的查询和删除文件不利于存储海量数据操作文件并不方便 为了解决上述问…

煤矿运输新篇章:数字孪生模型引领智能化转型

在科技日新月异的今天&#xff0c;煤矿行业也迎来了前所未有的发展机遇。在这个充满挑战与机遇的时代&#xff0c;煤矿运输数字孪生模型以其独特的魅力和巨大的潜力&#xff0c;引领着煤矿运输领域走向智能化、高效化的新时代。 数字孪生模型&#xff0c;就是在虚拟世界中构建一…

喜讯:ISO年度审核通过!

在数字化时代&#xff0c;质量是我们不变的追求。近日&#xff0c;矩阵起源迎来了一个值得庆祝的时刻——三项ISO体系年度考核顺利通过&#xff01;分别为&#xff1a;ISO9001 质量管理体系标准认证、ISO20000信息技术服务管理体系认证及ISO27001 信息安全管理体系认证。 ISO标…

【分布式事务】分布式事务理论

CAP 理论 一致性&#xff08;Consistency&#xff09; 分布式系统中所有数据备份&#xff0c;在同一时刻是否是同样的值 可用性&#xff08;Availability&#xff09; 集群中一部分节点故障后&#xff0c;集群整体是否还能响应客户端的读写请求 分区容错性&#xff08;Partit…

移动硬盘损坏无法读取:故障解析与数据恢复策略

一、现象描述&#xff1a;移动硬盘损坏无法读取的困境 在数字化时代&#xff0c;移动硬盘作为数据存储的重要工具&#xff0c;广泛应用于个人和企业中。然而&#xff0c;当移动硬盘突然损坏&#xff0c;无法被系统正常读取时&#xff0c;往往会带来极大的困扰。用户可能会遇到…

《2024天猫618大促-首波男装销售报告》

这份报告主要分析了2024年天猫618大促期间的首波男装销售情况,从多个维度进行了深入的复盘和分析。报告中不仅包含了销售数据的统计分析,还对消费者行为、品牌表现、产品趋势等方面进行了详细的解读。通过对这些数据和信息的深入挖掘,报告揭示了当前男装市场的一些重要趋势和特…

冻干食品市场飙升至新高度,预计到 2030 年将达到 717 亿美元

冻干食品市场&#xff0c;近年来经历了显著增长&#xff0c;2021 年价值 372 亿美元&#xff0c;预计到 2030 年将达到 717 亿美元。 从2022年到2030年&#xff0c;这一强劲的扩张是由7.7%的复合年增长率推动的&#xff0c;这是由于多种因素造成的&#xff0c;包括食品加工行…

Linux命令重温

目录 Linux安装基础命令lsllcdpwdmkdirrmdirtouchcpmvrmvi/vim>和>>catheadlessmoretailechoclearwhich 进阶命令其他命令 Linux安装 通过vmware设置模拟硬件环境安装centos系统进行相应的网络配置安装xshell bin 存放二进制可执行文件(ls,cat,mkdir等) boot 存放用…

【STM32+FPGA】先进算力+强安全+边缘AI,64位STM32MP2聚焦工业4.0应用

工业应用数字化和智能化程度&#xff0c;是衡量新质生产力的重要标准。STM32最新一代64位微处理器STM32MP2凭借先进算力、丰富接口和高安全性&#xff0c;为高性能和高度互联的工业4.0应用赋能。 STM32MP2四大关键特性&#xff0c;为工业4.0应用赋能 STM32MP2系列的第一颗产品S…

Java项目:基于SSM框架实现的电子竞技管理平台【ssm+B/S架构+源码+数据库+毕业论文】

一、项目简介 本项目是一套基于SSM框架实现的电子竞技管理平台 包含&#xff1a;项目源码、数据库脚本等&#xff0c;该项目附带全部源码可作为毕设使用。 项目都经过严格调试&#xff0c;eclipse或者idea 确保可以运行&#xff01; 该系统功能完善、界面美观、操作简单、功能…

【Python时序预测系列】基于LSTM实现单变量时序序列多步预测(案例+源码)

这是我的第307篇原创文章。 一、引言 单站点单变量输入单变量输出多步预测问题----基于LSTM实现。 单输入就是输入1个特征变量 单输出就是预测出1个标签的结果 多步就是利用过去N天预测未来M天的结果 二、实现过程 2.1 读取数据集 # 读取数据集 data pd.read_csv(data.c…

超级内卷时代,这样做,刻不容缓

分享一个月入十万的赚钱项目 别再抱怨手上项目不好做&#xff0c;生意不好做了&#xff0c;这只是个开始&#xff0c;长远来看&#xff0c;2024应该是未来几年中经济环境最好的一年&#xff0c;我们所有人都已经进入到“超级内卷”时代&#xff01; 随着竞争环境越来越激烈&…

欢乐钓鱼大师游戏攻略:内置免费辅助工具的云手机!自动钓鱼!

《欢乐钓鱼大师》是一款极具趣味性和挑战性的钓鱼模拟游戏&#xff0c;玩家可以在虚拟的世界中体验到真实钓鱼的乐趣。本文将详细介绍游戏的各个方面&#xff0c;包括基本操作、鱼种识别、装备选择、技巧提升等&#xff0c;帮助玩家快速上手并逐步提升钓鱼技能。 《欢乐钓鱼大师…

010-基于Sklearn的机器学习入门:聚类(上)

本节及后续章节将介绍深度学习中的几种聚类算法&#xff0c;所选方法都在Sklearn库中聚类模块有具体实现。本节为上篇&#xff0c;将介绍几种相对基础的聚类算法&#xff0c;包括K-均值算法和均值漂移算法。 目录 10.1 聚类概述 10.1.1 聚类的种类 10.1.2 Sklearn聚类子模…

前年升2区,去年升TOP,目前扩刊中,投稿难度较小,这本SSCI可纳入考虑~

【SciencePub学术】今天给大家推荐的是一本经济管理领域的SSCI&#xff0c;大家都称之为TOP刊中的易中“水刊”。据说很多人已经靠信息差吃上了这本TOP刊的红利&#xff0c;接下来给大家解析一下这本期刊。 《Socio-Economic Planning Sciences》是一本国际性的学术期刊&#x…

数据分析:微生物组差异丰度方法汇总

欢迎大家关注全网生信学习者系列&#xff1a; WX公zhong号&#xff1a;生信学习者Xiao hong书&#xff1a;生信学习者知hu&#xff1a;生信学习者CDSN&#xff1a;生信学习者2 介绍 微生物数据具有一下的特点&#xff0c;这使得在做差异分析的时候需要考虑到更多的问题&…

文本批量高效编辑神器:空格秒变分隔符,提升工作效率

在信息爆炸的时代&#xff0c;文本处理已成为我们日常工作中不可或缺的一部分。然而&#xff0c;面对海量的文本数据&#xff0c;如何高效、准确地进行编辑和整理&#xff0c;成为了我们面临的难题。今天&#xff0c;我要向大家介绍一款文本批量高效编辑神器——首助编辑高手&a…

员工不会写OKR,有没有好的方法可以帮助他们?

在做 OKR 辅导的过程中&#xff0c;我发现很多公司在 OKR 制定的环节出现了问题&#xff0c;比如目标的方向不清晰、关键结果不如何 SMART 原则、描述冗长复杂、不够聚焦等。他们可能会认为刚刚开始推行&#xff0c;制定上出现一些问题无伤大雅&#xff0c;但这会对之后的 OKR …

材料科学SCI期刊,中科院2区,影响因子4.7

一、期刊名称 Progress in Natural Science-Materials International 二、期刊简介概况 期刊类型&#xff1a;SCI 学科领域&#xff1a;材料科学 影响因子&#xff1a;4.7 中科院分区&#xff1a;2区 三、期刊征稿范围 由中国材料研究会负责的同行评议 由中国材料研究会&…

设计模式原则——里氏替换原则

设计模式原则 设计模式示例代码库地址&#xff1a; https://gitee.com/Jasonpupil/designPatterns 里氏替换原则 继承必须确保父类所拥有的性质在子类中依然成立 与开闭原则不同的是开闭原则可以改变父类原有的功能&#xff0c;里氏替换原则不能修改父类的原有的性质&#…