找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 文档 工具 设计
查看: 108|回复: 0

python之初学RAS库实现:简单一机一码验证

[复制链接]

2万

主题

1249

回帖

2万

积分

超级版主

教育辅助界扛把子

附加身份标识
精华
1
热心
7
听众
1
威望
48
贡献
14329
违规
0
书币
50008
注册时间
2020-4-8

论坛元老灌水之王

发表于 2022-9-30 00:30 | 显示全部楼层 |阅读模式
通过RSA私钥签名,公钥验签的原理进行简单实现一机一码授权。

RSA实例2.1实现一机一码客服端.py

[Python] 纯文本查看 复制代码
import wmi  # wmi依赖pywin32,python3.5以上版本安装pywin32需要手动安装
import hashlib
import os
import rsa
 
 
class c_一机一码验证:
    def __init__(self):
        pass
 
    def m_获取处理器信息(self):
        v_处理器信息列表 = []
        for u in wmi.WMI().Win32_Processor():
            v_处理器信息列表.append(
                {
                    "Name": u.Name,
                    "Serial Number": u.ProcessorId,
                    "CoreNum": u.NumberOfCores
                }
            )
        return v_处理器信息列表
 
    def m_生成机器码(self):
        v_处理器信息 = self.m_获取处理器信息()
        v_处理器序列号 = v_处理器信息[0]['Serial Number']
        v_处理器核心数量 = v_处理器信息[0]['CoreNum']
 
        # 计算得到数字码
        v_处理器数字码 = int(bytes(v_处理器序列号, 'UTF-8').hex(), 16) ** v_处理器核心数量
        v_数字码哈希值 = hashlib.md5(str(v_处理器数字码).encode(encoding='UTF-8')).hexdigest()
        v_机器码 = f'{v_数字码哈希值[0:5]}-{v_数字码哈希值[5:10]}-{v_数字码哈希值[10:15]}-{v_数字码哈希值[15:20]}'.upper()
 
        return v_机器码
 
    def m_公钥(self):
        v公钥b64 = '''
                -----BEGIN RSA PUBLIC KEY-----
        MIICCgKCAgEAlRr4y/mxct7pYMcbhuW3kW4uN4EoYRLNEPoOJhuQhvgOp/9mJyXC
        sRq/k0WZIa56Zs2ulOUIGYuOptQ6dlCHVKx1OG+dMBufRPlJJht9pw0ZU4sdcEBd
        Lssrw1nzwNeMOfqGWmiIifB3ERGMQvq8M3wrB6XSOmI6HWShHKiXggHaWNKiZ8WS
        AiK0cBx8Uu8GuOTVYZLdwtPBdqwj4z0Trxi1+fvXJxL4mPBPN3gLxUyVAdV8ancO
        sAQdnxxgkt5WX5bi6JVVMQaTtlCGag1THP3y3Poy+sNDn39DnvDaZBOOF2ZMZSlk
        clzQ9WjcBvXz/Ou48MwtxceTaQuIcbFebafHjeARXQ6Lp3P+oBBuAfjdHPdNsho1
        qd/1g+Fa1972HHmcpgzo3d6xc1DoPYnwINeNTDr9iGRR95tXYud+waZp1qMcL46O
        xprlJ7qtXH+XYBpUkrUavkYPNFJyKhq32tijDAnm9T2eAZ1HRn4nwOmBqT+CiRUy
        48fb97JxUuNV2hN7Z37rliIzEBT3ergBRWIihxpeqvYC/6Aoi8o1gdfh9fiNBVJj
        p98HeiNSUNay4foY+G0prbozzGaVHw5x/ZpszySh3JBMM/yGIcZPA6odgQe4+9iN
        Q22Nt7E6ppaT5WIDVBpebTNfgKapISdMkrcLkYUKCQuLAFU3OpZfEakCAwEAAQ==
        -----END RSA PUBLIC KEY-----
        '''
 
        v_公钥 = rsa.PublicKey.load_pkcs1(v公钥b64.encode())
        return v_公钥
 
    def m_验证激活(self):
        v_机器码 = self.m_生成机器码()
        if os.path.isfile('激活码'):
            with open(file='激活码', mode='rb') as f:
                v_激活码 = f.read()
            try:
                xx = rsa.verify(v_机器码.encode(), v_激活码, self.m_公钥())
                if xx == 'SHA-1':
                    # print('激活成功')
                    return True
            except BaseException as e:
                print(f'激活失败:{v_机器码}')
        else:
            print(f'未激活:{v_机器码}')
 
 
if c_一机一码验证().m_验证激活():
    print('验证通过,')



RSA实例2.2实现一机一码服务端.py
[Python] 纯文本查看 复制代码
import rsa
 
v_私钥b64 = '''
-----BEGIN RSA PRIVATE KEY-----
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
/FENCT5S7PrZYg==
-----END RSA PRIVATE KEY-----
'''
v_私钥 = rsa.PrivateKey.load_pkcs1(v_私钥b64.encode())
v_需要签名的信息 = input('输入机器码:')
v_签名数据 = rsa.sign(v_需要签名的信息.encode(), v_私钥, 'SHA-1')
with open(file='激活码', mode='wb') as f:
    f.write(v_签名数据)


你可以把客户端的代码添加到你自己写的代码前,启动的时候验证一下,验证成功就执行。失败则退出。
只要保管好服务端的签名秘钥就行了。把激活码文件发个客服端就可以了。

客服端:获取CPU信息,简单加密,生产一串机器码。
服务端:签名机器码,生产激活码文件。发给客服端
如果需要更改公钥和私钥,可以参考我的上一条:python之初学RAS库实现:加密,解密,签名,验签,RSA实例1.1生产秘钥.py 代码


Great works are not done by strength, but by persistence! 历尽艰辛的飞升者,成了围剿孙悟空的十万天兵之一。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则 需要先绑定手机号


免责声明:
本站所发布的第三方软件及资源(包括但不仅限于文字/图片/音频/视频等仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢某程序或某个资源,请支持正版软件及版权方利益,注册或购买,得到更好的正版服务。如有侵权请邮件与我们联系处理。

Mail To: admin@cdsy.xyz

QQ|Archiver|手机版|小黑屋|城东书院 ( 湘ICP备19021508号-1|湘公网安备 43102202000103号 )

GMT+8, 2024-11-23 17:32 , Processed in 0.037426 second(s), 27 queries .

Powered by Discuz! CDSY.XYZ

Copyright © 2019-2023, Tencent Cloud.

快速回复 返回顶部 返回列表