1. 生成授权码
# -*- coding: utf-8 -*-
import uuid
import socket
import base64
from pyDes import *
# bin(ord("="))
class Register:
def __init__(self):
self.Des_key = "abcdefgh" # Key,需八位
self.Des_IV = "\x11\2\x2a\3\1\x27\2\0" # 自定IV向量
# cpu信息
def get_CPU_info(self):
num = 0
with open('/proc/cpuinfo') as fd:
for line in fd:
if line.startswith('processor'):
num += 1
if line.startswith('model name'):
cpu_model = line.split(':')[1].strip().split()
cpu_model = cpu_model[0] + ' ' + cpu_model[2] + ' ' + cpu_model[-1]
cpu = {'cpu_num': num, 'cpu_model': cpu_model}
return cpu
# mac地址
def get_mac_address(self):
node = uuid.getnode()
mac = uuid.UUID(int=node).hex[-12:]
return mac
# 获取内网ip和hostname
def get_ip_info(self):
hostname = socket.gethostname()
ipaddr = socket.gethostbyname(hostname)
host = {"hostname":hostname, "ipaddr":ipaddr}
return host
# 授权码
def getCombinNumber(self):
a = self.get_ip_info()
b = self.get_CPU_info()
c = self.get_mac_address()
machinecode_str = ""
#ip, hostname, cpu ,mac结合
machinecode_str = machinecode_str + a['hostname'] +a["ipaddr"]+ b['cpu_model'] + c
maxindex = len(machinecode_str)
#让授权码麻烦一点
selectIndex = [7, 16, 17, 30, 32, 38, 43, 46]
macode = ""
for i in selectIndex:
if i > maxindex:
break
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)
# 生成授权文件
def regist(self):
ontent = self.getCombinNumber()
# print("ontent ", ontent)
tent = bytes(ontent, encoding='utf-8')
# print("tent ", tent)
# 得到加密后机器码
content = self.Encryted(tent)
cont = ""
for i in content:
#cont += bin(ord(i))
cont += bin(i)#转为二进制
with open('register.txt', 'w') as f:
f.write(cont)
f.close()
if __name__ == '__main__':
register = Register()
register.regist()
2.验证授权码
组合方式与生成授权码一样, 比较register.txt文件中的授权码与此时的电脑信息编码后是否一致
此文件名为Register.py
# -*- coding: utf-8 -*-
import uuid
import socket
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向量
# cpu信息
def get_CPU_info(self):
num = 0
with open('/proc/cpuinfo') as fd:
for line in fd:
if line.startswith('processor'):
num += 1
if line.startswith('model name'):
cpu_model = line.split(':')[1].strip().split()
cpu_model = cpu_model[0] + ' ' + cpu_model[2] + ' ' + cpu_model[-1]
cpu = {'cpu_num': num, 'cpu_model': cpu_model}
return cpu
# mac地址
def get_mac_address(self):
node = uuid.getnode()
mac = uuid.UUID(int=node).hex[-12:]
return mac
# 获取内网ip和hostname
def get_ip_info(self):
hostname = socket.gethostname()
ipaddr = socket.gethostbyname(hostname)
host = {"hostname":hostname, "ipaddr":ipaddr}
return host
# 授权码
def getCombinNumber(self):
a = self.get_ip_info()
b = self.get_CPU_info()
c = self.get_mac_address()
machinecode_str = ""
#ip, hostname, cpu ,mac结合
machinecode_str = machinecode_str + a['hostname'] +a["ipaddr"]+ b['cpu_model'] + c
maxindex = len(machinecode_str)
#让授权码麻烦一点
selectIndex = [7, 16, 17, 30, 32, 38, 43, 46]
macode = ""
for i in selectIndex:
if i > maxindex:
break
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)
# 打开程序先调用授权码文件,比较文件中的授权码与此时的硬件信息编码后是否一致
def checkAuthored(self):
if os.path.exists("register.txt"):
pass
else:
print("-------请先注册-------")
return False
f = open('register.txt', 'r')
ontent = self.getCombinNumber()
# print("ontent ", ontent)
tent = bytes(ontent, encoding='utf-8')
# print("tent ", tent)
# 得到加密后机器码
content = self.Encryted(tent)
# print("content ", content)
cont = ""
for i in content:
#cont += bin(ord(i))
cont += bin(i)
file = f.read()
if file == cont:
f.close()
return True
else:
print("register.txt error")
f.close()
return False
3. 测试
from Register import Register
register = Register()
if register.checkAuthored():
pass# 文件中的授权码与此时电脑信息一致,接着执行下面的代码
else:
os._exit(0)#不一致,退出
print("ok")
最好对python代码在加密,例如生成.pyc或者.so