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

news2024/12/22 22:28:03

在这里插入图片描述

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.coloradmin.cn/o/1857605.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

国内顶级汽车制造厂的创新实践:如何利用实时数据湖为更多业务提供新鲜数据?

使用 TapData&#xff0c;化繁为简&#xff0c;摆脱手动搭建、维护数据管道的诸多烦扰&#xff0c;轻量代替 OGG、DSG 等同步工具&#xff0c;「CDC 流处理 数据集成」组合拳&#xff0c;加速仓内数据流转&#xff0c;帮助企业将真正具有业务价值的数据作用到实处&#xff0c…

如何在服务器之间同步文件?

业务需求 因业务需求需要在多台服务器之间做文件资源的双向同步&#xff0c;选择 ownCloud davfs2 rsync 来实现 ownCloud ownCloud 是一个开源免费专业的私有云存储项目&#xff0c;它能帮你快速在个人电脑或服务器上架设一套专属的私有云文件同步网盘。 ownCloud 能让你…

ArkTS开发系列之导航 (2.5.2 页面组件导航)

上篇回顾: ArkTS开发系列之导航 (2.5.1 页面路由&#xff09; 本篇内容&#xff1a;主要学习页面内组件导航 一、 知识储备 1. Navigation 一般作为页面的根容器&#xff0c;包括单页面、分栏和自适应三种显示模式。 自适应模式 (NavigationMode.Auto) &#xff0c;需要注意…

三相变压器:应用和连接配置

变压器的功能和应用 变压器的类型和用途多种多样&#xff0c;可根据其应用、结构类型和尺寸进行分类。 一般来说&#xff0c;变压器的主要功能是改变交流电&#xff08;AC&#xff09;的电压水平&#xff0c;提高电压以供长距离传输或降低电压以供家庭和工业消费者使用。 它…

优先级队列模拟实现

目录 1.堆的概念 2.堆性质堆中的某个元素小于或大于他的左右孩子 3.小根堆实例 4.堆创建 4.1调整思路 4.2向下调整思路 4.3代码实现&#xff08;大根堆&#xff09; 5.堆的删除 6.堆的插入 7.常用接口 7.1PriorityQueue和PriorityBlockingQueue 1.堆的概念 如果有一…

常见硬件工程师面试题(二)

大家好&#xff0c;我是山羊君Goat。 对于硬件工程师&#xff0c;学习的东西主要和电路硬件相关&#xff0c;所以在硬件工程师的面试中&#xff0c;对于经验是十分看重的&#xff0c;像PCB设计&#xff0c;电路设计原理&#xff0c;模拟电路&#xff0c;数字电路等等相关的知识…

微服务(服务治理)

服务远程调用时存在的问题 注册中心原理 服务治理中的三个角色分别是什么&#xff1f; 服务提供者&#xff1a;暴露服务接口&#xff0c;供其它服务调用服务消费者&#xff1a;调用其它服务提供的接口注册中心&#xff1a;记录并监控微服务各实例状态&#xff0c;推送服务变更信…

软件工程体系概念

软件工程 软件工程是应用计算机科学、数学及 管理科学等原理开发软件的工程。它借鉴 传统工程的原则、方法&#xff0c;以提高质量&#xff0c;降 低成本为目的。 一、软件生命周期 二、软件开发模型 1.传统模型 瀑布模型、V模型、W模型、X 模型、H 模型 (1)瀑布模型 瀑布…

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

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

java8 将对象list中的某一个属性取出组成一个list

实体类 public class Sp {String spdm;String spmc;public Sp() {}public Sp(String spdm, String spmc) {this.spdm spdm;this.spmc spmc;}public String getSpdm() {return spdm;}public void setSpdm(String spdm) {this.spdm spdm;}public String getSpmc() {return sp…

安美数字酒店宽带运营系统——命令执行漏洞(CNVD-2021-37784)

声明&#xff1a;本文档或演示材料仅供教育和教学目的使用&#xff0c;任何个人或组织使用本文档中的信息进行非法活动&#xff0c;均与本文档的作者无关。 文章目录 漏洞描述漏洞复现测试工具 漏洞描述 安美数字酒店宽带运营系统 server_ping.php 存在远程命令执行漏洞&#…

Java-LinkedList和ArrayList的区别、Get/Add操作性能分析以及常见的遍历方式

LinkedList和ArrayList的区别、Get/Add操作性能分析以及常见的遍历方式 一、LinkedList基本特性主要方法 二、ArrayList初始化及基本操作ArrayList注意点&#xff08;待完善&#xff09;代码示例 三、ArrayList与LinkedList的区别四、Get/Add操作性能分析五、LinkedList遍历方式…

藏在十九页PPT里的“海合安之道”

6月6日&#xff0c;成立仅仅两年多的海合安集团亮相2024中国主题公园战略营销峰会&#xff0c;作为本届峰会最年轻的主题公园企业&#xff0c;备受行业关注。 海合安集团成立于2021年&#xff0c;为亚洲最大私募投资基金之一的安博凯投资基金&#xff08;MBK Partners&#xf…

Java 编程语言:过去、现在与未来

引言 自 1995 年由 Sun Microsystems 发布以来&#xff0c;Java 编程语言已经走过了漫长的道路。作为一种面向对象的编程语言&#xff0c;Java 因其“一次编写&#xff0c;到处运行”的理念而广受欢迎。本文将探讨 Java 的历史、主要特点、应用领域以及未来的发展趋势。 Java…

MacBook Pro 忘记root用户密码,重置密码步骤

一、以普通用户名登录系统&#xff0c;并打开terminal终端&#xff0c; 输入&#xff1a;sudo bash sudo bash Password:*****&#xff08;输入当前用户的密码&#xff09; 成功后进入bash-3.2#的命令模式 二、在bash-3.2#命令模式下 输入&#xff1a;sudo passwd root sud…

春招面试面经总结篇

目录 前言一&#xff0c;算法篇1.1 平拍数组1.2 括号匹配1.3 打家劫舍1.4 删除最少使字符串平衡1.5 爬楼梯 二&#xff0c;数据结构篇2.1 二叉树2.2 链表 三&#xff0c;HTML篇3.1 H5新的语义标签3.2 href和src 四&#xff0c;CSS篇4.1 居中4.2 父元素塌陷解决4.3 外边距塌陷4.…

基于SpringBoot的实习管理系统设计与实现

你好呀&#xff0c;我是计算机学姐码农小野&#xff01;如果有相关需求&#xff0c;可以私信联系我。 开发语言&#xff1a; Java 数据库&#xff1a; MySQL 技术&#xff1a; SpringBoot框架&#xff0c;B/S模式 工具&#xff1a; MyEclipse&#xff0c;Tomcat 系统展示 …

dockercompose部署redis哨兵模式并集成springboot

第一步 编写compose文件 docker-compose.yml version: 3.8networks:redis-network:driver: bridgeservices:redis-master:image: redis:7.2.4container_name: redis-mastercommand: ["sh", "-c", "redis-server --protected-mode no --slave-announ…

WSL安装的Ubuntu与docker desktop集成

WSL安装的Ubuntu与docker desktop集成 最近因为项目需要&#xff0c;要在本地利用WSL搭建一个docker和Ubuntu的部署环境。一开始并不知道docker desktop与Ubuntu可以集成使用&#xff0c;所以在Ubuntu上独立安装了docker引擎&#xff0c;但在安装docker-compose的时候出现以下…

av1支持的CU划分

av1只有4叉划分支持递归划分 只有四叉允许递归划分&#xff0c;其余划分只划分到本层。最大编码单元也扩展到128x128&#xff0c;最小编码单元4x4。