|
|
|
@ -0,0 +1,152 @@
|
|
|
|
|
import base64
|
|
|
|
|
import win32api
|
|
|
|
|
from pyDes import *
|
|
|
|
|
import binascii
|
|
|
|
|
from PyQt5.QtCore import QSize, Qt
|
|
|
|
|
from PyQt5.QtWidgets import QMainWindow, QApplication, QFileDialog, QWidget, QLineEdit, QPushButton, QHBoxLayout, QVBoxLayout, QMessageBox, QLabel
|
|
|
|
|
from PyQt5 import QtCore, QtGui, QtWidgets
|
|
|
|
|
import os
|
|
|
|
|
import sys
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class Window(QWidget):
|
|
|
|
|
def __init__(self):
|
|
|
|
|
super().__init__()
|
|
|
|
|
self.initUI()
|
|
|
|
|
# self.setupUi()
|
|
|
|
|
|
|
|
|
|
def setupUi(self):
|
|
|
|
|
|
|
|
|
|
layout = QVBoxLayout()
|
|
|
|
|
# 第一行
|
|
|
|
|
label1 = QLabel('Label 1')
|
|
|
|
|
#第二行
|
|
|
|
|
input1 = QLineEdit()
|
|
|
|
|
|
|
|
|
|
# 第三行
|
|
|
|
|
label2 = QLabel('Label 2')
|
|
|
|
|
# 第四行
|
|
|
|
|
input2 = QLineEdit()
|
|
|
|
|
# 第五行
|
|
|
|
|
button = QPushButton('Button')
|
|
|
|
|
|
|
|
|
|
layout.addWidget(button, alignment=Qt.AlignCenter)
|
|
|
|
|
self.show()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def initUI(self):
|
|
|
|
|
# 创建两个 QLineEdit 控件
|
|
|
|
|
self.line_edit1 = QLineEdit()
|
|
|
|
|
self.line_edit2 = QLineEdit()
|
|
|
|
|
self.label1 = QLabel('输入盘符号:')
|
|
|
|
|
self.label2 = QLabel('激活码:')
|
|
|
|
|
self.reg = register()
|
|
|
|
|
|
|
|
|
|
self.button2 = QPushButton('生成激活码')
|
|
|
|
|
self.button2.clicked.connect(self.check_license)
|
|
|
|
|
|
|
|
|
|
spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
|
|
|
|
|
spacerItem2 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
|
|
|
|
|
vbox = QVBoxLayout()
|
|
|
|
|
vbox.addItem(spacerItem2)
|
|
|
|
|
vbox.addWidget(self.label1)
|
|
|
|
|
vbox.addWidget(self.line_edit1)
|
|
|
|
|
vbox.addWidget(self.label2)
|
|
|
|
|
vbox.addWidget(self.line_edit2)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
vbox.addItem(spacerItem2)
|
|
|
|
|
vbox1 = QHBoxLayout()
|
|
|
|
|
vbox1.addItem(spacerItem)
|
|
|
|
|
vbox1.addWidget(self.button2)
|
|
|
|
|
vbox1.addItem(spacerItem)
|
|
|
|
|
|
|
|
|
|
vbox2 = QVBoxLayout()
|
|
|
|
|
vbox2.addLayout(vbox)
|
|
|
|
|
vbox2.addLayout(vbox1)
|
|
|
|
|
vbox2.addItem(spacerItem2)
|
|
|
|
|
# 设置窗口布局,并设置窗口的标题和大小
|
|
|
|
|
self.setLayout(vbox2)
|
|
|
|
|
self.setWindowTitle('产品许可激活')
|
|
|
|
|
self.resize(300, 300)
|
|
|
|
|
|
|
|
|
|
# 显示窗口
|
|
|
|
|
self.show()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def check_license(self):
|
|
|
|
|
if self.line_edit1.text():
|
|
|
|
|
licese = self.line_edit1.text()
|
|
|
|
|
code = self.reg.DesEncrypt(licese).decode('utf-8')
|
|
|
|
|
self.line_edit2.setText(code)
|
|
|
|
|
else:
|
|
|
|
|
reply = QMessageBox.question(self.parent(),
|
|
|
|
|
'提示',
|
|
|
|
|
"请输入盘符号",
|
|
|
|
|
QMessageBox.Yes)
|
|
|
|
|
return
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class register:
|
|
|
|
|
def __init__(self):
|
|
|
|
|
self.Des_Key = b"BHC#@*AW" # Key(可换)
|
|
|
|
|
self.Des_IV = b"\x22\x33\x35\x81\xBC\x38\x5A\xE7" # 自定义IV向量(可换)
|
|
|
|
|
|
|
|
|
|
# 获取C盘卷序列号
|
|
|
|
|
def getCVolumeSerialNumber(self):
|
|
|
|
|
CVolumeSerialNumber = win32api.GetVolumeInformation("C:\\")[1]
|
|
|
|
|
# print(CVolumeSerialNumber)
|
|
|
|
|
if CVolumeSerialNumber:
|
|
|
|
|
return str(CVolumeSerialNumber)
|
|
|
|
|
else:
|
|
|
|
|
return 0
|
|
|
|
|
|
|
|
|
|
# 使用DES加base64的形式加密
|
|
|
|
|
def DesEncrypt(self, str):
|
|
|
|
|
# str = str
|
|
|
|
|
k = des(self.Des_Key, CBC, self.Des_IV, pad=None, padmode=PAD_PKCS5)
|
|
|
|
|
EncryptStr = k.encrypt(str)
|
|
|
|
|
print(type(EncryptStr))
|
|
|
|
|
return base64.b64encode(EncryptStr) # 转base64编码返回
|
|
|
|
|
|
|
|
|
|
# 获取注册码,验证
|
|
|
|
|
def regist(self, key):
|
|
|
|
|
key = key
|
|
|
|
|
self.str1 = base64.b64decode(key)
|
|
|
|
|
|
|
|
|
|
# 由于输入不符合base64规则的字符串会引起异常,所以需要增加输入判断
|
|
|
|
|
|
|
|
|
|
if key:
|
|
|
|
|
content = self.getCVolumeSerialNumber()
|
|
|
|
|
|
|
|
|
|
key_decrypted = str(self.DesDecrypt())
|
|
|
|
|
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:
|
|
|
|
|
return True
|
|
|
|
|
|
|
|
|
|
else:
|
|
|
|
|
return False
|
|
|
|
|
else:
|
|
|
|
|
return False
|
|
|
|
|
else:
|
|
|
|
|
self.regist()
|
|
|
|
|
return False
|
|
|
|
|
|
|
|
|
|
# des解码
|
|
|
|
|
def DesDecrypt(self):
|
|
|
|
|
k = des(self.Des_Key, CBC, self.Des_IV, pad=None, padmode=PAD_PKCS5)
|
|
|
|
|
DecryptStr = k.decrypt(self.str1)
|
|
|
|
|
return DecryptStr.decode('utf-8')
|
|
|
|
|
if __name__ == '__main__':
|
|
|
|
|
app = QApplication(sys.argv)
|
|
|
|
|
window = Window()
|
|
|
|
|
sys.exit(app.exec_())
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|