思路:

软件安装后,运行软件时,通过电脑机器码的唯一性实现授权码的唯一性。(机器码:由cpu序列号、硬盘序列号、mac地址、主板序列号组成的字符串截取部分字符)

方案:

1、运行软件,检测注册文件,若未检测到注册文件或者注册文件中的注册码与机器码进行DES+base64加密后的编码不一致,则提醒用户输入注册码或重新获取注册码。重新获取注册码会将程序运行后显示的机器组合码 发送给指定管理员,管理员经过编码生成注册码给回用户,用户输入,生成注册文件,进入软件。

2、注册文件中注册码与机器码进行DES+base64加密后的编码一致,则通过认证 进入软件。

代码:

# -*- coding: utf-8 -*-import wmi
import base64
from pyDes import *class Register:def __init__(self):self.Des_key = "abcdefgh" #Key,需八位self.Des_IV = "\x11\2\x2a\3\1\x27\2\0"  # 自定IV向量# 获取硬件信息,输出macode# 1、CPU序列号(ID)  2、本地连接 无线局域网 以太网的MAC  3.硬盘序列号(唯一) 4.主板序列号(唯一)global ss = wmi.WMI()#cpu序列号def get_CPU_info(self):cpu = []cp = s.Win32_Processor()for u in cp:cpu.append({"Name": u.Name,"Serial Number": u.ProcessorId,"CoreNum": u.NumberOfCores})return cpu#硬盘序列号def get_disk_info(self):disk = []for pd in s.Win32_DiskDrive():disk.append({"Serial": s.Win32_PhysicalMedia()[0].SerialNumber.lstrip().rstrip(),  # 获取硬盘序列号,调用另外一个win32 API"ID": pd.deviceid,"Caption": pd.Caption,"size": str(int(float(pd.Size)/1024/1024/1024))})return disk#mac地址(包括虚拟机的)def get_network_info(self):network = []for nw in s.Win32_NetworkAdapterConfiguration():if nw.MacAddress != None:network.append({"MAC": nw.MacAddress,"ip": nw.IPAddress})return network#主板序列号def get_mainboard_info(self):mainboard = []for board_id in s.Win32_BaseBoard():mainboard.append(board_id.SerialNumber.strip().strip('.'))return mainboard# 由于机器码矿太长,故选取机器码字符串部分字符def getCombinNumber(self):a = self.get_network_info()b = self.get_CPU_info()c = self.get_disk_info()d = self.get_mainboard_info()machinecode_str = ""machinecode_str = machinecode_str + a[0]['MAC'] + b[0]['Serial Number'] + c[0]['Serial'] + d[0]selectIndex = [8,10,15,16,17,30,32,38,43,46]macode = ""for i in selectIndex:macode = macode + machinecode_str[i]return macode#DES+base64加密def Encryted(self,tr):k = des(self.Des_key, CBC, self.Des_IV, pad=None, padmode=PAD_PKCS5)EncryptStr = k.encrypt(tr)return base64.b32encode(EncryptStr)  # 转base64编码返回# 获取注册码,验证成功后生成注册文件def regist(self):key = input('please input your register code:')#由于输入类似“12”这种不符合base64规则的字符串会引起异常,所以需要增加输入判断if key:ontent = self.getCombinNumber()tent = bytes(ontent, encoding='utf-8')#得到加密后机器码content = self.Encryted(tent)key_decrypted = bytes(key, encoding='utf-8')if content!=0 and key_decrypted!=0:if content != key_decrypted:print("wrong register code, please check and input your register code again")self.regist()elif content == key_decrypted:print("register succeed.")#读写文件要加判断with open('register.txt', 'w') as f:f.write(key)f.close()return Trueelse:return Falseelse:return Falseelse:self.regist()return False# 打开程序先调用注册文件,比较注册文件中注册码与此时的硬件信息编码后是否一致def checkAuthored(self):ontent = self.getCombinNumber()tent = bytes(ontent, encoding='utf-8')# 获得加密后的机器码content = self.Encryted(tent)# 读写文件要加判断try:f = open('register.txt','r')if f:key = f.read()if key:key_decryted = bytes(key, encoding='utf-8')if key_decryted:if key_decryted == content:print("register succeed.")else:print('请重新输入注册码,或发送', ontent,'到13900000000获取注册码')self.regist()else:self.regist()else:self.regist()else:self.regist()except:print('请发送', ontent, '到13900000000获取注册码')self.regist()if __name__ == '__main__':register = Register()#print(register.get_disk_info())#print(register.get_network_info())#print(register.get_mainboard_info())#print(register.getCombinNumber())#print(register.Encryted(register.getCombinNumber()))#register.regist()register.checkAuthored()

参考地址:python读取电脑识别码_三更雪的博客-CSDN博客_python获取机器码

软件授权码方案(附Python示例代码)相关推荐

  1. python实战应用讲解-【numpy科学计算】scikits-statsmodels模块(附python示例代码)

    目录 Numpy 安装scikits-statsmodels 具体步骤 用scikits-statsmodels做正态性检验 具体步骤 攻略小结 Numpy 安装scikits-image 具

  2. python软件代码示例-python 示例代码1

    第一章 python基础一 ​在此不再赘述为什么学习python这门编程,网上搜索一箩筐.我在此仅说一句python的好,用了你就会爱上它. 本python示例代码1000+带你由浅入深的了解pyth ...

  3. Py的smtplib应用:如何获取QQ邮箱授权码(附源代码)

    Py的smtplib应用:如何获取QQ邮箱授权码(附源代码) 在Python开发中,发送邮件是非常常见的一项任务.smtplib是Python自带的邮件发送库,通过它可以轻松地实现邮件发送功能.本文将 ...

  4. Python示例代码之邮件发送

    定时邮件发送或告警邮件实时发送是工作中常用的功能之一,该功能需要调用发送邮件模块,如下为亲测可用的Python编写的邮件发送代码,该代码使用qq邮箱可正常发送邮件,使用163邮箱时提示554错误码邮件 ...

  5. python代码示例-python 示例代码1

    第一章 python基础一 ​在此不再赘述为什么学习python这门编程,网上搜索一箩筐.我在此仅说一句python的好,用了你就会爱上它. 本python示例代码1000+带你由浅入深的了解pyth ...

  6. 【机器视觉案例】(5) AI视觉,手势调节物体尺寸,附python完整代码

    各位同学好,今天和大家分享一下如何使用opencv+mediapipe完成远程手势调节图片尺寸的案例.先放张图看效果.当拇指和食指竖起时,根据食指间的连线的长度自由缩放图片尺寸.图片的中点始终位于指尖 ...

  7. 【机器视觉案例】(5) AI视觉,远程手势控制虚拟计算器,附python完整代码

    各位同学好,今天和大家分享一下如何使用MediaPipe+Opencv完成虚拟计算器,先放张图看效果.FPS值为29,食指和中指距离小于规定阈值则认为点击按键,为避免重复数字出现,规定每20帧可点击一 ...

  8. 【MediaPipe】(4) AI视觉,远程手势调节电脑音量,附python完整代码

    各位同学好,今天和大家分享一下如何使用MediaPipe完成手势调节电脑音量,先放张图看效果. 注意!! 本节需要用到手部关键点的实时跟踪,我已经在之前的文章中详细写过了,本节会直接使用,有疑问的同学 ...

  9. 【深度学习】(2) 数据加载,前向传播2,附python完整代码

    生成数据集: tf.data.Dataset.from_tensor_slices(tensor变量) 创建一个数据集,其元素是给定张量的切片 生成迭代器: next(iter()) next() 返 ...

最新文章

  1. Android进程间通信的方式
  2. Photoshop 隐藏的快捷键
  3. 打开一个解决方案时弹出“项目所需的应用程序未安装,确保已安装项目类型(.csproj)的应用程序”问题的解决方案
  4. SAP CRM IBASE头部字段读取的具体实现
  5. leetcode 1579. 保证图可完全遍历(并查集)
  6. 微软亚马逊联手发布深度学习库Gluon,适合所有段位的炼丹师
  7. java怎么对用户做自定义模版打印_Printing tools 自定义模板打印的实现
  8. C++中带默认参数的函数定义及使用总结
  9. 实现一个文本文件的解析类(vector,字符串解析的应用)
  10. C# 简单管理系统模板 控制台应用程序
  11. 音视频直播推流和拉流到底是什么意思?
  12. springboot+vue旅行社旅游拼团系统java
  13. 在局域网内主动封堵BT下载使用
  14. 2018CVPR_Future Frame Prediction for Anomaly Detection – A New Baseline
  15. html如何实现空格?
  16. C#使用iTextSharp合并pdf,添加页码
  17. 一直都是技术,今天来点儿文艺范儿……
  18. 加载css文件的几种方法,CSS 引入方式
  19. react-native调用Android原生UI组件
  20. c语言中生日蛋糕图片大全,简单生日蛋糕图片大全

热门文章

  1. C# Bitmap GetPixel 效率太低,太慢的替代方法
  2. 蓝色TADF分子3DPyM-pDTC,2DPyM-mDTC,2DPyM-mDBr ,3DPyM-pDBr:蓝色热激活延迟荧光材料
  3. HyperLPR车牌识别技术算法之车牌粗定位与训练
  4. 七种PDF转Excel的转换方法,分分钟提高你的工作效率
  5. 海思3516DV300系列HiPQTools工具ISP图像调试_AWB校定
  6. 顾泽苍:新一代人工智能——产业推动的核心理论
  7. 概率论基础 —— 3.离散型、连续型概率模型,及其概率密度与概率分布函数
  8. 【思特奇杯·云上蓝桥-算法集训营】第1周——了解算法与数据结构
  9. 微软第四朵智能云:低代码平台Power Platform
  10. 动态规划-泰波那契序列