C#实现的一个简单的软件保护方案

生成加密密钥、加密和解密数据、生成许可证和验证许可证的功能

cs 复制代码
using System;
using System.Security.Cryptography;
using System.Text;


// 使用Aes类生成对称加密密钥:
public static byte[] GenerateKey()
{
    using (Aes aes = Aes.Create())
    {
        aes.GenerateKey();
        return aes.Key;
    }
}

// 使用Aes类进行数据加密和解密:
public static byte[] EncryptData(byte[] key, string data)
{
    using (Aes aes = Aes.Create())
    {
        aes.Key = key;
        aes.GenerateIV();
        ICryptoTransform encryptor = aes.CreateEncryptor(aes.Key, aes.IV);

        using (var ms = new System.IO.MemoryStream())
        {
            ms.Write(aes.IV, 0, aes.IV.Length);
            using (var cs = new CryptoStream(ms, encryptor, CryptoStreamMode.Write))
            {
                using (var sw = new System.IO.StreamWriter(cs))
                {
                    sw.Write(data);
                }
            }
            return ms.ToArray();
        }
    }
}

public static string DecryptData(byte[] key, byte[] encryptedData)
{
    using (Aes aes = Aes.Create())
    {
        aes.Key = key;
        byte[] iv = new byte[aes.BlockSize / 8];
        Array.Copy(encryptedData, iv, iv.Length);
        ICryptoTransform decryptor = aes.CreateDecryptor(aes.Key, iv);

        using (var ms = new System.IO.MemoryStream(encryptedData, iv.Length, encryptedData.Length - iv.Length))
        {
            using (var cs = new CryptoStream(ms, decryptor, CryptoStreamMode.Read))
            {
                using (var sr = new System.IO.StreamReader(cs))
                {
                    return sr.ReadToEnd();
                }
            }
        }
    }
}

// 生成许可证文件,包含用户信息和加密密钥的哈希值:
public static string GenerateLicense(byte[] key, string userInfo)
{
    string licenseData = $"{userInfo}|{Convert.ToBase64String(key)}";
    string licenseHash = ComputeSha256Hash(licenseData);
    return Convert.ToBase64String(Encoding.UTF8.GetBytes($"{licenseData}|{licenseHash}"));
}

private static string ComputeSha256Hash(string rawData)
{
    using (SHA256 sha256Hash = SHA256.Create())
    {
        byte[] bytes = sha256Hash.ComputeHash(Encoding.UTF8.GetBytes(rawData));
        StringBuilder builder = new StringBuilder();
        for (int i = 0; i < bytes.Length; i++)
        {
            builder.Append(bytes[i].ToString("x2"));
        }
        return builder.ToString();
    }
}


// 验证许可证的合法性:
public static bool VerifyLicense(string license, string userInfo)
{
    string licenseData = Encoding.UTF8.GetString(Convert.FromBase64String(license));
    string[] licenseParts = licenseData.Split('|');
    if (licenseParts.Length != 3)
    {
        return false;
    }
    string licenseUserInfo = licenseParts[0];
    string licenseKey = licenseParts[1];
    string licenseHash = licenseParts[2];

    if (licenseUserInfo != userInfo)
    {
        return false;
    }
    string expectedHash = ComputeSha256Hash($"{licenseUserInfo}|{licenseKey}");
    return expectedHash == licenseHash;
}

// 示例代码展示如何生成加密密钥、加密和解密数据、生成许可证和验证许可证:
public class Program
{
    public static void Main()
    {
        string userInfo = "user@example.com";
        byte[] key = GenerateKey();
        string license = GenerateLicense(key, userInfo);

        Console.WriteLine("生成的许可证: " + license);
        Console.WriteLine("许可证验证结果: " + VerifyLicense(license, userInfo));

        // 加密和解密数据
        string data = "Hello, World!";
        byte[] encryptedData = EncryptData(key, data);
        Console.WriteLine("加密数据: " + Convert.ToBase64String(encryptedData));
        string decryptedData = DecryptData(key, encryptedData);
        Console.WriteLine("解密数据: " + decryptedData);
    }
}
相关推荐
蜗牛一步步往上爬3 分钟前
第十六章 C++语言在深度学习中的应用
开发语言·c++·深度学习
这个昵称不容易1 小时前
SpringBoot「衣依」服装销售平台:144个Java文件180个接口,从挑衣服到收货评价整条链路都在
java·springboot·毕设
计算机毕设定制辅导-无忧学长2 小时前
《基于微信小程序的居家医疗陪护预约系统设计与实现》
java·spring boot·微信小程序·uniapp·居家医疗陪护预约系统
张张123y2 小时前
DSH 插件调试避坑:client.js 设置面板、热重载与高频报错排查表
开发语言·javascript·人工智能·开源·ecmascript·后端开发·ai agent
文丑颜不良啊3 小时前
LeetCode2221~2240题目解析
java·leetcode
秋饼3 小时前
Computer Use Agent Java 落地实战:感知-行动循环、执行器与安全围栏生产级实现
java·ai·技术分享·后端开发
冻柠檬飞冰走茶5 小时前
字母移动游戏题解:贪心求最长可保留连续子串(附 C 实现)
c语言·开发语言·数据结构·算法·动态规划
文丑颜不良啊5 小时前
LeetCode2161~2180题目解析
java·leetcode
FRing035 小时前
vue2干货总结7(自定义指令、插槽、单页应用程序、路由的使用(VueRouter))
开发语言·前端·vue.js·vue2
雪落漂泊5 小时前
C++算法 二分查找篇(上)
开发语言·c++·算法