ubuntu python项目根据系统以及硬件信息生成添加授权码,软加密

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

猜你喜欢

转载自blog.csdn.net/qq_34496674/article/details/108127532