原理
- 判斷路徑下是否存在識別文件,若存在就解密對比,若不存在就進入機器碼注冊:
- 獲取系統C盤序列號作為識別ID,並添加隨機數作為混淆,生成最終機器碼。
- 將機器碼發給軟件開發者,開發者將機器碼解密后,添加自己的標識符號並加密生成key,發給用戶。
- 用戶輸入key,程序對比並保存。
- 用戶下次打開軟件時,重新開始步驟‘1’。
說明
- 加密:將序列號經過Des加密,再經過base64編碼。
- 解密:將密碼經過base64解碼,再經過Des解密。
- 寫文件:將二進制字符轉為十六進制保存。
- 讀文件:將十六進制轉為二進制。
代碼
1 # coding: utf-8 2 3 import win32api 4 import pyDes 5 from binascii import b2a_hex, a2b_hex 6 import base64 7 import os 8 def getCVolumeSerialNumber(): 9 CVolumeSerialNumber=win32api.GetVolumeInformation("C:\\")[1] 10 # print(CVolumeSerialNumber) 11 if CVolumeSerialNumber: 12 return str(CVolumeSerialNumber) 13 else: 14 return 0 15 16 def DesEncrypt(str): 17 k = pyDes.des(Des_Key, pyDes.CBC, Des_IV, pad=None, padmode=pyDes.PAD_PKCS5) 18 encryptStr = k.encrypt(str) 19 string = base64.b64encode(encryptStr) 20 # print(string) 21 return string # 轉base64編碼返回 22 23 def DesDecrypt(string): 24 string = base64.b64decode(string) 25 k = pyDes.des(Des_Key, pyDes.CBC, Des_IV, pad=None, padmode=pyDes.PAD_PKCS5) 26 decryptStr = k.decrypt(string) 27 # print(decryptStr) 28 return decryptStr 29 30 Des_Key = "12345678" # Key 31 Des_IV = "12345678" # 自定IV向量 32 def Register(): 33 if os.path.isfile('conf.bin'): 34 with open('conf.bin', 'rb') as fp: 35 key = a2b_hex(fp.read()) 36 print(key) 37 serialnumber = getCVolumeSerialNumber() 38 decryptstr = DesDecrypt(key).decode('utf8') 39 print(decryptstr) 40 if serialnumber in decryptstr: 41 if 'Buy' in decryptstr: 42 print('>> Buy') 43 print(">> 驗證完成") 44 return 1 45 elif 'Trial' in decryptstr: 46 print('>> Trial') 47 return 2 48 rand = str(random.randrange(1, 1000)) 49 serialnumber = getCVolumeSerialNumber() + rand 50 print(serialnumber) 51 encryptstr = DesEncrypt(serialnumber).decode('utf8') 52 print(">> 序列號:", encryptstr) 53 while True: 54 key = input(">> 驗證碼:") 55 try: 56 decryptstr = DesDecrypt(key.encode('utf8')).decode('utf8') 57 print(decryptstr) 58 if serialnumber in decryptstr: 59 if 'Buy' in decryptstr: 60 print('>> Buy') 61 with open('conf.bin', 'wb') as fp: 62 fp.write(b2a_hex(key.encode('utf8'))) 63 print(">> 驗證完成") 64 return 1 65 elif 'Trial' in decryptstr: 66 print('>> Trial') 67 return 2 68 except Exception as e: 69 print(e) 70 print(">> 輸入錯誤") 71 continue
效果
歡迎關注↓↓↓
-
頭條號:小鋒學長
-
微信公眾號:xfxuezhang