C# 注册码生成与验证机制实现方案

一、核心架构设计

graph TD A[硬件信息采集] --> B[生成机器码] B --> C{加密方式选择} C -->|对称加密| D[DES/AES加密生成注册码] C -->|非对称加密| E[RSA签名生成注册码] D --> F[注册码存储] E --> F F --> G[启动验证] G --> H[有效期检查] H --> I[在线激活验证]

二、关键实现步骤

1. 硬件信息采集(唯一性保障)
// 获取CPU序列号(需引用System.Management)
public string GetCpuId() {
    using (ManagementObjectSearcher searcher = 
           new ManagementObjectSearcher("SELECT ProcessorId FROM Win32_Processor")) {
        return searcher.Get().OfType<ManagementObject>().First()?
            .Properties["ProcessorId"].Value.ToString() ?? "N/A";
    }
}

// 获取硬盘卷标(物理磁盘)
public string GetDiskId() {
    using (ManagementObjectSearcher searcher = 
           new ManagementObjectSearcher("SELECT SerialNumber FROM Win32_PhysicalMedia")) {
        return searcher.Get().OfType<ManagementObject>().First()?
            .Properties["SerialNumber"].Value.ToString() ?? "N/A";
    }
}

// 获取网卡MAC地址(优先以太网)
public string GetMacAddress() {
    var nic = NetworkInterface.GetAllNetworkInterfaces()
        .FirstOrDefault(n => n.NetworkInterfaceType == NetworkInterfaceType.Ethernet);
    return nic?.GetPhysicalAddress().ToString() ?? "00:00:00:00:00:00";
}

硬件指纹组合策略CPUID + DiskID + MAC


2. 机器码生成算法
// 哈希算法生成(SHA256)
public string GenerateMachineCode() {
    string hardwareInfo = $"{GetCpuId()}{GetDiskId()}{GetMacAddress()}";
    using (SHA256 sha256 = SHA256.Create()) {
        byte[] hash = sha256.ComputeHash(Encoding.UTF8.GetBytes(hardwareInfo));
        return BitConverter.ToString(hash).Replace("-", "").ToLower();
    }
}

优势:抗碰撞性强,适合分布式系统


3. 注册码生成(多算法支持)
3.1 对称加密方案(DES)
// 生成带有效期的注册码
public string GenerateRegisterCode(string machineCode, int daysValid) {
    DateTime expireDate = DateTime.Now.AddDays(daysValid);
    string data = $"{machineCode}|{expireDate:yyyyMMdd}";
    
    using (DESCryptoServiceProvider des = new DESCryptoServiceProvider()) {
        des.Key = Encoding.UTF8.GetBytes("YourSecretKey123"); // 16字节密钥
        des.IV = Encoding.UTF8.GetBytes("InitVector0123");    // 16字节IV
        
        using (MemoryStream ms = new MemoryStream()) {
            using (CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(), CryptoStreamMode.Write)) {
                byte[] inputBytes = Encoding.UTF8.GetBytes(data);
                cs.Write(inputBytes, 0, inputBytes.Length);
            }
            return Convert.ToBase64String(ms.ToArray());
        }
    }
}

特点:快速加密,密钥需硬编码保护

3.2 非对称加密方案(RSA)
// 生成RSA密钥对
public void GenerateRSAKeys() {
    using (RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(2048)) {
        File.WriteAllText("PrivateKey.xml", rsa.ToXmlString(true));  // 私钥
        File.WriteAllText("PublicKey.xml", rsa.ToXmlString(false));  // 公钥
    }
}

// 生成注册码(私钥签名)
public string GenerateRSACode(string machineCode) {
    using (RSACryptoServiceProvider rsa = new RSACryptoServiceProvider()) {
        rsa.FromXmlString(File.ReadAllText("PrivateKey.xml"));
        SHA1Managed sha = new SHA1Managed();
        byte[] data = Encoding.UTF8.GetBytes(machineCode);
        byte[] hash = sha.ComputeHash(data);
        return Convert.ToBase64String(rsa.SignHash(hash, CryptoConfig.MapNameToOID("SHA1")));
    }
}

// 验证注册码(公钥验证)
public bool ValidateRSACode(string code, string machineCode) {
    using (RSACryptoServiceProvider rsa = new RSACryptoServiceProvider()) {
        rsa.FromXmlString(File.ReadAllText("PublicKey.xml"));
        SHA1Managed sha = new SHA1Managed();
        byte[] data = Encoding.UTF8.GetBytes(machineCode);
        byte[] hash = sha.ComputeHash(data);
        byte[] signature = Convert.FromBase64String(code);
        return rsa.VerifyHash(signature, CryptoConfig.MapNameToOID("SHA1"), hash);
    }
}

优势:不可逆加密,适合高安全场景


4. 注册信息存储
// 注册表存储(兼容Win10)
public void SaveRegistration(string code) {
    using (RegistryKey key = Registry.CurrentUser.CreateSubKey(@"Software\YourApp")) {
        key.SetValue("RegisterCode", code);
        key.SetValue("RegisteredDate", DateTime.Now.ToString());
        key.SetValue("HardwareFingerprint", GenerateMachineCode());
    }
}

// 文件存储(加密存储)
public void SaveToFile(string code) {
    string encrypted = AES_Encrypt(code, "FileKey123");
    File.WriteAllText("license.dat", encrypted);
}

5. 验证逻辑实现
// 综合验证(有效期+硬件绑定)
public bool FullValidation(string inputCode) {
    // 1. 解密获取原始信息
    string decrypted = AES_Decrypt(inputCode, "YourSecretKey123");
    string[] parts = decrypted.Split('|');
    string machineCode = parts[0];
    DateTime expireDate = DateTime.Parse(parts[1]);

    // 2. 硬件校验
    if (GenerateMachineCode() != machineCode) return false;

    // 3. 时间校验
    if (DateTime.Now > expireDate) return false;

    // 4. 在线验证(可选)
    if (!CheckOnlineStatus(machineCode)) return false;

    return true;
}

三、安全增强策略

1. 反调试保护
protected override void OnLoad(EventArgs e) {
    base.OnLoad(e);
    // 检测调试器
    if (Debugger.IsAttached || CheckRemoteDebuggerPresent()) {
        Application.Exit();
    }
    // 内存保护
    NativeMethods.VirtualProtect(
        Marshal.AllocHGlobal(1024), 
        1024, 
        NativeMethods.PAGE_READONLY, 
        out _);
}
2. 代码混淆方案
// 控制流混淆示例
private int ObfuscatedCheck() {
    int a = 0x5A5A5A5A;
    int b = 0xA5A5A5A5;
    for(int i=0; i<10; i++) {
        a = (a ^ b) + (i << 3);
        b = (b ^ a) - (i >> 1);
    }
    return a ^ b;
}

工具建议:Dotfuscator、SmartAssembly

3. 完整性校验
public bool CheckIntegrity() {
    string checksum = CalculateFileChecksum(Assembly.GetExecutingAssembly().Location);
    return checksum == savedChecksum;
}

private string CalculateFileChecksum(string path) {
    using (var sha256 = SHA256.Create()) {
        using (var stream = File.OpenRead(path)) {
            return BitConverter.ToString(sha256.ComputeHash(stream)).Replace("-", "");
        }
    }
}

参考代码 C# 注册码以及注册机制 实例源码 www.youwenfan.com/contentcnr/37250.html

四、扩展功能实现

1. 在线激活服务
public async Task<bool> OnlineActivate(string machineCode) {
    using (var client = new HttpClient()) {
        var response = await client.PostAsync(
            "https://api.yourserver.com/activate",
            new StringContent($"{{\"machineCode\":\"{machineCode}\"}}"));
        return response.IsSuccessStatusCode;
    }
}
2. 多设备绑定
// 生成多设备注册码(支持5台设备)
public string GenerateMultiDeviceCode(string baseCode) {
    string[] devices = File.ReadAllLines("devices.txt");
    string combined = string.Join("_", devices.Take(5));
    return GenerateRSACode($"{baseCode}|{combined}");
}

五、测试用例设计

测试场景 输入数据 预期结果
有效注册码验证 正确机器码+未过期 验证通过
硬件变更检测 更换网卡后启动 弹出重新激活提示
注册码篡改检测 修改Base64编码中的字符 校验失败
并发验证性能 1000次/秒验证请求 响应时间<50ms
posted @ 2026-03-03 17:01  w199899899  阅读(22)  评论(0)    收藏  举报