手把手教你用Python实现一个简易的软件License生成器(RSA+DES版)

张开发
2026/4/21 20:38:48 15 分钟阅读

分享文章

手把手教你用Python实现一个简易的软件License生成器(RSA+DES版)
手把手教你用Python实现一个简易的软件License生成器RSADES版在软件开发领域License授权机制是保护知识产权的重要手段。今天我们将通过Python代码一步步构建一个结合RSA非对称加密与DES对称加密的混合License生成系统。这个实战项目不仅能帮助理解加密算法的实际应用还能为你的软件产品添加基础的授权验证功能。1. 环境准备与核心库安装首先需要配置Python开发环境推荐3.8版本并安装必要的加密库。打开终端执行以下命令pip install pycryptodome这个库提供了我们需要的所有加密算法实现。如果遇到安装问题可以尝试pip install pycryptodomex注意在Windows系统可能需要以管理员身份运行命令提示符验证安装是否成功from Crypto.Cipher import DES, PKCS1_OAEP from Crypto.PublicKey import RSA print(库导入成功)2. 生成RSA密钥对RSA算法需要公钥和私钥配对使用。我们将创建2048位长度的密钥对from Crypto.PublicKey import RSA def generate_rsa_keys(): key RSA.generate(2048) private_key key.export_key() public_key key.publickey().export_key() with open(private.pem, wb) as f: f.write(private_key) with open(public.pem, wb) as f: f.write(public_key) return private_key, public_key执行后会生成两个PEM格式的文件private.pem需严格保密的私钥public.pem可公开分发的公钥密钥安全要点私钥绝对不能包含在客户端代码中生产环境建议使用硬件安全模块(HSM)管理私钥定期轮换密钥对增强安全性3. 模拟机器码生成实际项目中机器码通常基于硬件信息生成。这里我们简化实现import hashlib import uuid def generate_machine_code(): # 模拟组合硬件信息 cpu_id str(uuid.getnode()) disk_id DISK- str(abs(hash(C:))) board_id MB- str(abs(hash(BaseBoard))) # MD5哈希生成固定长度机器码 combined cpu_id disk_id board_id return hashlib.md5(combined.encode()).hexdigest()典型机器码示例a1b2c3d4e5f67890123456789abcdef04. DES密钥生成与加密使用机器码作为种子生成DES密钥from Crypto.Cipher import DES from Crypto.Util.Padding import pad, unpad def get_des_key(machine_code): # 取机器码前8字节作为DES密钥 return machine_code[:8].encode() def des_encrypt(data, key): cipher DES.new(key, DES.MODE_ECB) padded_data pad(data.encode(), DES.block_size) return cipher.encrypt(padded_data) def des_decrypt(encrypted_data, key): cipher DES.new(key, DES.MODE_ECB) decrypted cipher.decrypt(encrypted_data) return unpad(decrypted, DES.block_size).decode()提示实际项目建议使用更安全的AES代替DES这里为演示保持简单5. License信息组装与加密定义License数据结构并实现核心加密逻辑import json import base64 from datetime import datetime from Crypto.Cipher import PKCS1_OAEP class LicenseGenerator: def __init__(self): self.private_key, self.public_key generate_rsa_keys() def generate_license(self, features): # 1. 生成机器码 machine_code generate_machine_code() # 2. 准备License数据 license_data { machine_code: machine_code, expire_date: features.get(expire_date, 2099-12-31), max_users: features.get(max_users, 1), features: features.get(features, []) } # 3. DES加密License内容 des_key get_des_key(machine_code) encrypted_data des_encrypt(json.dumps(license_data), des_key) # 4. RSA加密DES密钥 rsa_key RSA.import_key(self.private_key) cipher_rsa PKCS1_OAEP.new(rsa_key) encrypted_des_key cipher_rsa.encrypt(des_key) # 5. 组装最终License license_package { data: base64.b64encode(encrypted_data).decode(), key: base64.b64encode(encrypted_des_key).decode(), pub_key: self.public_key.decode() } return base64.b64encode(json.dumps(license_package).encode()).decode()6. License验证实现完整的验证流程实现class LicenseValidator: staticmethod def validate(license_str, current_machine_codeNone): try: # 1. Base64解码 decoded json.loads(base64.b64decode(license_str).decode()) # 2. 获取各组件 encrypted_data base64.b64decode(decoded[data]) encrypted_des_key base64.b64decode(decoded[key]) public_key decoded[pub_key] # 3. RSA解密DES密钥 rsa_key RSA.import_key(public_key) cipher_rsa PKCS1_OAEP.new(rsa_key) des_key cipher_rsa.decrypt(encrypted_des_key) # 4. DES解密License数据 license_data json.loads(des_decrypt(encrypted_data, des_key)) # 5. 验证机器码 if current_machine_code and license_data[machine_code] ! current_machine_code: return False, 机器码不匹配 # 6. 验证有效期 expire_date datetime.strptime(license_data[expire_date], %Y-%m-%d) if datetime.now() expire_date: return False, License已过期 return True, license_data except Exception as e: return False, f验证失败: {str(e)}7. 完整使用示例下面展示从生成到验证的完整流程# 生成License generator LicenseGenerator() features { expire_date: 2025-12-31, max_users: 5, features: [premium, multi_user] } license_key generator.generate_license(features) print(f生成的License: {license_key}) # 验证License machine_code generate_machine_code() # 实际应从目标机器获取 is_valid, result LicenseValidator.validate(license_key, machine_code) if is_valid: print(License验证通过) print(授权信息:, result) else: print(License无效:, result)8. 生产环境增强建议实际项目中需要考虑更多安全因素防篡改措施添加数字签名验证使用HMAC校验数据完整性密钥管理改进# 密钥轮换示例 def rotate_keys(old_private_key): new_key RSA.generate(2048) # 迁移加密数据到新密钥的逻辑 return new_key增强的机器码生成结合更多硬件指纹添加盐值(salt)防止逆向性能优化缓存解密结果异步验证机制防调试保护检测调试器存在关键代码混淆这个实现虽然简化但涵盖了License系统的核心逻辑。在我的实际项目中这种混合加密方案成功抵御了常见的破解尝试特别是配合定期更新的密钥策略后系统安全性得到了显著提升。

更多文章