C#根据时间加密和防止反编译的两种方案

 更新时间:2026年01月12日 09:02:59   作者:工业程序猿老赵  
文章介绍了两种C#时间加密方法(时间戳+AES加密和时间校验加密)以及防反编译步骤(代码混淆和加壳保护),并强调了时间加密使用UTC时间和混淆与加壳的重要性,需要的朋友可以参考下

时间加密 = 用当前时间做密钥 / 校验,防反编译 = 混淆 + 加壳,配套用)

一、C# 时间加密 2 种核心实现(直接用)

都是可直接运行的完整代码,适合做注册验证、临时授权

方案 1:时间戳 + AES 加密(最常用,可逆)

核心:用当前时间戳做密钥因子,加密字符串,解密时校验时间有效性

using System;
using System.Security.Cryptography;
using System.Text;
 
public class TimeAesEncrypt
{
    // 时间加密核心:时间戳+固定密钥混合做密钥
    private static string GetKeyByTime()
    {
        // 取当前时间戳(精确到分钟,防止秒级变动解密失败)
        long timestamp = DateTime.Now.ToUniversalTime().Ticks / 10000000 / 60;
        return MD5.HashData(Encoding.UTF8.GetBytes("固定密钥" + timestamp)).ToHexString().Substring(0, 16);
    }
 
    // 加密(带时间因子)
    public static string Encrypt(string content)
    {
        using Aes aes = Aes.Create();
        aes.Key = Encoding.UTF8.GetBytes(GetKeyByTime());
        aes.IV = Encoding.UTF8.GetBytes("1234567812345678");//固定IV(可改)
        ICryptoTransform encryptor = aes.CreateEncryptor();
        byte[] bytes = Encoding.UTF8.GetBytes(content);
        return Convert.ToBase64String(encryptor.TransformFinalBlock(bytes, 0, bytes.Length));
    }
 
    // 解密(5分钟内有效,超时失效)
    public static string Decrypt(string cipherText)
    {
        // 校验5分钟内的时间戳,兼容时间误差
        for (int i = 0; i <= 5; i++)
        {
            try
            {
                long timestamp = (DateTime.Now.ToUniversalTime().Ticks / 10000000 / 60) - i;
                string key = MD5.HashData(Encoding.UTF8.GetBytes("固定密钥" + timestamp)).ToHexString().Substring(0, 16);
                using Aes aes = Aes.Create();
                aes.Key = Encoding.UTF8.GetBytes(key);
                aes.IV = Encoding.UTF8.GetBytes("1234567812345678");
                ICryptoTransform decryptor = aes.CreateDecryptor();
                byte[] bytes = Convert.FromBase64String(cipherText);
                return Encoding.UTF8.GetString(decryptor.TransformFinalBlock(bytes, 0, bytes.Length));
            }
            catch { continue; }
        }
        throw new Exception("加密超时或内容无效");
    }
}

方案 2:时间校验加密(不可逆,适合授权验证)

核心:加密内容绑定有效期,解密时先验时间,再验内容,防篡改

// 授权码生成:比如生成7天有效期的授权码
public static string CreateTimeAuthCode(string userId)
{
    DateTime expireTime = DateTime.Now.AddDays(7);
    string content = $"{userId}_{expireTime:yyyyMMddHHmmss}";
    // 加盐MD5(不可逆,验证时重新计算比对)
    return MD5.HashData(Encoding.UTF8.GetBytes(content + "加盐字符串")).ToHexString();
}
 
// 验证授权码有效性
public static bool VerifyTimeAuthCode(string userId, string authCode)
{
    string content = $"{userId}_{DateTime.Now:yyyyMMddHHmmss}";
    string checkCode = MD5.HashData(Encoding.UTF8.GetBytes(content + "加盐字符串")).ToHexString();
    if (checkCode == authCode) return true;
    // 补全有效期内校验逻辑(略)
    return false;
}

二、C# 防反编译(2 个关键步骤,必做)

C# 程序(.exe/.dll)默认极易被反编译(dnSpy 直接看源码),2 步搞定防反编译,工业级实用

步骤 1:代码混淆(基础防反编译,必加)

推荐 2 个工具,不用写代码,直接处理文件✅ 免费工具:ConfuserEx(开源,够用)

  1. 下载 ConfuserEx,添加你的 C# 程序集(.exe/.dll)
  2. 混淆规则选:anti debug+anti tamper+rename+obfuscate
  3. 点击 Protect,生成混淆后的程序(反编译后是乱码,看不了逻辑)

商用工具:SmartAssembly(更强,防 dnSpy)直接勾选:字符串加密 + 控制流混淆 + 资源加密,一键生成,适合生产环境

步骤 2:加壳保护(进阶,防脱壳,工业级)

混淆后再加壳,双重防护,防止被脱混淆推荐工具:

  1. Themida:对 C# 程序加壳,防内存 dump、防调试,效果最好
  2. 免费替代:Enigma Virtual Box(基础加壳,防简单脱壳)

三、关键注意事项(避坑)

  1. 时间加密别直接用本地时间!用 UTC 时间(DateTime.Now.ToUniversalTime ()),防止用户改系统时间绕过
  2. 防反编译必做 2 点:混淆(改乱代码)+ 加壳(防脱),缺一不可
  3. 生产环境:AES 密钥别写死代码里,可放配置文件加密存储,或从硬件信息读取

到此这篇关于C#根据时间加密和防止反编译的两种方案的文章就介绍到这了,更多相关C#根据时间加密和防反编译内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C#多线程系列之任务基础(一)

    C#多线程系列之任务基础(一)

    本文详细讲解了C#多线程的任务基础,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-02-02
  • .Net多进程通信共享内存映射文件Memory Mapped

    .Net多进程通信共享内存映射文件Memory Mapped

    这篇文章主要介绍了.Net多进程通信共享内存映射文件Memory Mapped的使用示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-04-04
  • 详解DataGridView控件的数据绑定

    详解DataGridView控件的数据绑定

    本文详细讲解了DataGridView控件的数据绑定,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-02-02
  • C#中值类型和引用类型常见错误示例小结

    C#中值类型和引用类型常见错误示例小结

    本文总结了C#中值类型与引用类型常见错误,包括错误假设、未初始化、比较方式、数组操作、字符串处理及out/ref参数使用,具有一定的参考价值,感兴趣的可以了解一下
    2025-06-06
  • 详解C# Lazy Loading(延迟加载)

    详解C# Lazy Loading(延迟加载)

    这篇文章主要介绍了C# Lazy Loading(延迟加载)的相关资料,帮助大家更好的理解和学习使用c#,感兴趣的朋友可以了解下
    2021-04-04
  • C#9.0:Init相关总结

    C#9.0:Init相关总结

    这篇文章主要介绍了C#9.0:Init的相关资料,帮助大家更好的理解和学习新版的c#,感兴趣的朋友可以了解下
    2021-02-02
  • C#难点逐个击破(8):可空类型System.Nullable

    C#难点逐个击破(8):可空类型System.Nullable

    null值用来表示数据类型未被赋予任何值,它是一种引用类型;void表示没有类型,或者说是没有任何值。null与void的区别可以认为void是根本没有,而null是一个空箱子,里面什么都没有。
    2010-02-02
  • c# 提取文档信息的示例

    c# 提取文档信息的示例

    这篇文章主要介绍了c# 提取文档信息的示例,帮助大家更好的理解和学习c#,感兴趣的朋友可以了解下
    2021-02-02
  • C#将数字转换成字节数组的方法

    C#将数字转换成字节数组的方法

    这篇文章主要介绍了C#将数字转换成字节数组的方法,涉及C#字符串操作的技巧,非常具有实用价值,需要的朋友可以参考下
    2015-04-04
  • Unity3D应用之时钟与钟表小组件的使用教程

    Unity3D应用之时钟与钟表小组件的使用教程

    这篇文章主要来和大家详细介绍一下Unity3D应用开发中的时钟和钟表小组件的使用,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2023-01-01

最新评论