基于C#的软件加密、授权与注册

这篇具有很好参考价值的文章主要介绍了基于C#的软件加密、授权与注册。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

  本文介绍了基于 本机特征信息(如CPU、主板、BIOS和MAC等) 的软件加密、授权与注册方法,并分享了 示例程序完整源代码


1 加密、授权与注册

  软件的加密、授权与注册流程如下:

基于C#的软件加密、授权与注册

2 本机特征信息

  本机特征信息主要包括:①CPU信息、②主板序列号、③BIOS信息、④MAC地址,基于C#获取代码如下:

using System;
using System.Management;
using System.Net.NetworkInformation;
using Microsoft.Win32;

namespace RWRegister
{
    public class Computer
    {
        public static string ComputerInfo()
        {
            string info = string.Empty;
            string cpu = GetCPUInfo();
            string baseBoard = GetBaseBoardInfo();
            string bios = GetBIOSInfo();
            string mac = GetMACInfo();
            info = string.Concat(cpu, baseBoard, bios, mac);
            return info;
        }

        private static string GetCPUInfo()
        {
            string info = string.Empty;
            info = GetHardWareInfo("Win32_Processor", "ProcessorId");
            return info;
        }

        private static string GetBaseBoardInfo()
        {
            string info = string.Empty;
            info = GetHardWareInfo("Win32_BaseBoard", "SerialNumber");
            return info;
        }

        private static string GetBIOSInfo()
        {
            string info = string.Empty;
            info = GetHardWareInfo("Win32_BIOS", "SerialNumber");
            return info;
        }

        private static string GetMACInfo()
        {
            string info = string.Empty;
            info = GetMacAddressByNetwork();
            return info;
        }

        private static string GetHardWareInfo(string typePath, string Key)
        {
            try
            {
                ManagementClass mageClass = new ManagementClass(typePath);
                ManagementObjectCollection mageObjectColl = mageClass.GetInstances();
                PropertyDataCollection Properties = mageClass.Properties;
                foreach (PropertyData property in Properties)
                {
                    if (property.Name == Key)
                    {
                        foreach (ManagementObject mageObject in mageObjectColl)
                        {
                            return mageObject.Properties[property.Name].Value.ToString();
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }
            return string.Empty;
        }

        private static string GetMacAddressByNetwork()
        {
            string Key = "SYSTEM\\CurrentControlSet\\Control\\Network\\{4D36E972-E325-11CE-BFC1-08002BE10318}\\";
            string macAddress = string.Empty;
            try
            {
                NetworkInterface[] Nics = NetworkInterface.GetAllNetworkInterfaces();
                foreach (NetworkInterface adapter in Nics)
                {
                    if (adapter.NetworkInterfaceType == NetworkInterfaceType.Ethernet && adapter.GetPhysicalAddress().ToString().Length != 0)
                    {
                        string fRegistryKey = Key + adapter.Id + "\\Connection";
                        RegistryKey rKey = Registry.LocalMachine.OpenSubKey(fRegistryKey, false);
                        if (rKey != null)
                        {
                            string fPnpInstanceID = rKey.GetValue("PnpInstanceID", "").ToString();
                            int fMediaSubType = Convert.ToInt32(rKey.GetValue("MediaSubType", 0));
                            if (fPnpInstanceID.Length > 3 && fPnpInstanceID.Substring(0, 3) == "PCI")
                            {
                                macAddress = adapter.GetPhysicalAddress().ToString();
                                for (int i = 1; i < 6; i++)
                                {
                                    macAddress = macAddress.Insert(3 * i - 1, ":");
                                }
                                break;
                            }
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }
            return macAddress;
        }
    }
}

3 加密与解密算法

  加密方法包括:①秘钥加密(KeyA+keyB)、②MD5加密。基于C#的加密与解密算法如下:

using System;
using System.Security.Cryptography;
using System.Text;
using System.IO;

namespace RWRegister
{
    public enum CryptoKey
    {
        KeyA, KeyB
    }

    public class Encryption
    {
        private string KeyA = "Sgg***";
        private string KeyB = "Qing***";
        private string MD5strBegin = "C++***";
        private string MD5strEnd = "Matlab***";
        private string ExecuteKey = string.Empty;

        public Encryption()
        {
            InitKey();//KeyA
        }

        public Encryption(CryptoKey Key)
        {
            InitKey(Key);//Custom
        }

        private void InitKey(CryptoKey Key = CryptoKey.KeyA)
        {
            switch (Key)
            {
                case CryptoKey.KeyA:
                    ExecuteKey = KeyA;
                    break;
                case CryptoKey.KeyB:
                    ExecuteKey = KeyB;
                    break;
            }
        }

        public string EncryptOfKey(string str)
        {
            return Encrypt(str, ExecuteKey);
        }

        public string DecryptOfKey(string str)
        {
            return Decrypt(str, ExecuteKey);
        }

        public string EncryptOfMD5(string str)
        {
            str = string.Concat(MD5strBegin, str, MD5strEnd);//trim
            MD5 md5 = new MD5CryptoServiceProvider();
            byte[] fromdata = Encoding.Unicode.GetBytes(str);
            byte[] todata = md5.ComputeHash(fromdata);
            string MD5str = string.Empty;
            foreach (var data in todata)
            {
                MD5str += data.ToString("x2");
            }
            return MD5str;
        }

        private string Encrypt(string str, string sKey)
        {
            DESCryptoServiceProvider DESCsp = new DESCryptoServiceProvider();
            byte[] InputBytes = Encoding.Default.GetBytes(str);
            DESCsp.Key = ASCIIEncoding.ASCII.GetBytes(sKey);
            DESCsp.IV = ASCIIEncoding.ASCII.GetBytes(sKey);
            MemoryStream ms = new MemoryStream();
            CryptoStream cs = new CryptoStream(ms, DESCsp.CreateEncryptor(), CryptoStreamMode.Write);
            cs.Write(InputBytes, 0, InputBytes.Length);
            cs.FlushFinalBlock();
            StringBuilder builder = new StringBuilder();
            foreach (byte b in ms.ToArray())
            {
                builder.AppendFormat("{0:X2}", b);
            }
            builder.ToString();
            return builder.ToString();
        }

        private string Decrypt(string pToDecrypt, string sKey)
        {
            DESCryptoServiceProvider DESCsp = new DESCryptoServiceProvider();
            byte[] InputBytes = new byte[pToDecrypt.Length / 2];
            for (int x = 0; x < pToDecrypt.Length / 2; x++)
            {
                int i = (Convert.ToInt32(pToDecrypt.Substring(x * 2, 2), 16));
                InputBytes[x] = (byte)i;
            }
            DESCsp.Key = ASCIIEncoding.ASCII.GetBytes(sKey);
            DESCsp.IV = ASCIIEncoding.ASCII.GetBytes(sKey);
            MemoryStream ms = new MemoryStream();
            CryptoStream cs = new CryptoStream(ms, DESCsp.CreateDecryptor(), CryptoStreamMode.Write);
            cs.Write(InputBytes, 0, InputBytes.Length);
            cs.FlushFinalBlock();
            return Encoding.Default.GetString(ms.ToArray());
        }
    }
}

4 软件授权检测

  软件授权检测代码如下:

using System;
using System.Collections.Generic;
using System.IO;

namespace RWRegister
{
    public class Register
    {
        public static string CryptographFile = "Cryptograph.Key";
        public static string LicenseFile = "license.Key";

        public static void WriteCryptographFile(string info)
        {
            WriteFile(info, CryptographFile);
        }

        public static void WriteLicenseFile(string info)
        {
            WriteFile(info, LicenseFile);
        }

        public static string ReadCryptographFile()
        {
            return ReadFile(CryptographFile);
        }

        public static string ReadLicenseFile()
        {
            return ReadFile(LicenseFile);
        }

        public static bool ExistCryptographFile()
        {
            return File.Exists(CryptographFile);
        }

        public static bool ExistLicenseFile()
        {
            return File.Exists(LicenseFile);
        }

        private static void WriteFile(string info, string fileName)
        {
            try
            {
                using (StreamWriter writer = new StreamWriter(fileName, false))
                {
                    writer.Write(info);
                    writer.Close();
                }
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }
        }

        private static string ReadFile(string fileName)
        {
            string info = string.Empty;
            try
            {
                using (StreamReader reader = new StreamReader(fileName))
                {
                    info = reader.ReadToEnd();
                    reader.Close();
                }
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }
            return info;
        }

        public static bool CheckRegister()
        {
            //MD5 Cryptograph of Computer information
            string CryptoInfo = Computer.ComputerInfo();
            Encryption encryptor = new Encryption(CryptoKey.KeyA);
            CryptoInfo = encryptor.EncryptOfKey(CryptoInfo);//KeyA
            string MD5CryptoInfo = encryptor.EncryptOfMD5(CryptoInfo);//MD5
            //judge the exist of Cryptograph file
            if (!ExistCryptographFile() || CryptoInfo != ReadCryptographFile())
            {
                WriteCryptographFile(CryptoInfo);
            }
            //judge the exist of License file
            if (!ExistLicenseFile())
            {
                return false;
            }
            //MD5 Cryptograph of License file
            string MD5License = ReadLicenseFile();
            encryptor = new Encryption(CryptoKey.KeyB);
            MD5License = encryptor.DecryptOfKey(MD5License);//KeyB
            if (MD5License == MD5CryptoInfo)//two md5 clash
            {
                return true;
            }
            else
            {
                return false;
            }
        }
    }
}

5 示例程序

5.1 界面设计

  示例程序界面设计如下图,包括:① “文件(F)” 菜单(包含“数据”、“退出”子菜单);② “帮助(H)” 菜单(包含“帮助文档”、“软件注册”子菜单)。软件开启时,将自动检测授权情况,若未授权仅有20秒的试用时间(20秒后将禁用软件);若软件未授权,可按 “帮助”->“软件注册”步骤 进行授权。
基于C#的软件加密、授权与注册

5.2 模块代码

  模块代码如下,包括窗体载入、软件注册等。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading;
using System.IO;

namespace RWRegister
{
    public partial class softWare : Form
    {
        public static bool registerState = false;
        private const int trialRunTime = 20;//seconds

        public softWare()
        {
            InitializeComponent();
        }

        private void softWare_Load(object sender, EventArgs e)
        {
            MyTimer.Enabled = true;
            MyTimer.Interval = 1000;
            toolStripSLTime.Text = "";

            //软件授权检测
            if (Register.CheckRegister())
            {
                registerState = true;
            }
            else
            {
                softWareTrialRun();
            }
        }

        /// <summary>
        /// 试运行软件(后台线程)
        /// </summary>
        private void softWareTrialRun()
        {
            Thread threadClose = new Thread(softWareClose);
            threadClose.IsBackground = true;//后台
            threadClose.Start();
        }

        private void softWareClose()
        {
            int count = 0;
            while (!registerState && count < trialRunTime)
            {
                if (registerState)
                {
                    return;
                }
                Thread.Sleep(1000);//1 sec
                count += 1;
            }
            if (registerState)
            {
                return;
            }
            else
            {
                Environment.Exit(0);
            }
        }

        private void toolStripMExit_Click(object sender, EventArgs e)
        {
            Environment.Exit(0);
        }

        private void toolStripMRegister_Click(object sender, EventArgs e)
        {
            if (registerState)
            {
                MessageBox.Show("软件已注册授权!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                return;
            }
            string fileName = string.Empty;
            ofdLicense.Title = "打开许可文件";
            ofdLicense.Filter = "许可文件(*.Key)|*.Key";
            if (ofdLicense.ShowDialog() == DialogResult.OK)
            {
                fileName = ofdLicense.FileName;
            }
            else
            {
                return;
            }
            string localFileName = string.Concat(
               Environment.CurrentDirectory,
               Path.DirectorySeparatorChar,
               Register.LicenseFile);
            if (fileName != localFileName)
                File.Copy(fileName, localFileName, true);
            if (Register.CheckRegister())
            {
                registerState = true;
                MessageBox.Show("注册成功!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
            else
            {
                MessageBox.Show("许可文件非法!", "警告", MessageBoxButtons.OK, MessageBoxIcon.Warning);
            }
        }

        private void MyTimer_Tick(object sender, EventArgs e)
        {
            toolStripSLTime.Text = "本地时间:" + DateTime.Now.ToString();//北京时间
        }
    }
}

5.3 完整代码下载

  文档资源:基于C#的软件加密、授权与注册 货真价实、童叟无欺,欢迎指导交流学习!文章来源地址https://www.toymoban.com/news/detail-404914.html

到了这里,关于基于C#的软件加密、授权与注册的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 电脑文件加密软件哪个最好用:试试文件加密软件排行榜第一的EaseUS LockMyFile吧 | 军事级加密你值得拥有!!!

            EaseUS LockMyFile 是一款出色且安全可靠的军事级电脑文件加密管理软件,也叫 易我文件加密软件 ,拥有文件隐藏、文件加锁、文件保护、读写监控、安全删除等诸多实用功能,能帮助大家锁定和隐藏闪存驱动器、外部USB 驱动器、内部硬盘驱动器以及局域网中其他计算

    2024年01月25日
    浏览(57)
  • 加密狗软件有什么作用?

    加密狗软件是一种用于加密和保护计算机软件和数据的安全设备。它通常是一个硬件设备,可以通过USB接口连接到计算机上。加密狗软件的作用主要体现在以下几个方面: 软件保护:加密狗软件可以对软件进行加密和授权,防止未经授权的用户复制、修改或传播软件。只有插

    2024年02月09日
    浏览(33)
  • 如何选择源代码加密软件

    比较内容 安全容器(SDC沙盒) DLP 文档加密 云桌面 代表厂家 *信达 卖咖啡、赛门贴科 亿*通、IP噶德、*盾、*途 四杰、深*服 设计理念 以隔离容器加准入技术为基础,构建只进不出,要出需走审批的数据安全环境,环境内数据一视同仁,不区分文件格式,一律保护。 以内容识别

    2024年02月07日
    浏览(58)
  • 怎么加密文件夹才更安全?安全文件夹加密软件推荐

    文件夹加密可以让其中数据更加安全,但并非所有加密方式都能够提高极高的安全强度。那么,怎么加密文件夹才更安全呢?下面我们就来了解一下那些安全的文件夹加密软件。 如果要评选最安全的文件夹加密软件,那么 文件夹加密超级大师 一定会名列榜首。 针对文件夹加

    2024年02月14日
    浏览(44)
  • 企业电脑文件加密系统 / 防泄密软件——「天锐绿盾」

    「天锐绿盾」是一种公司文件加密系统,旨在保护公司内网数据安全,防止信息泄露。该系统由硬件和软件组成,其中包括服务端程序、控制台程序和终端程序。 PC访问地址: isite.baidu.com/site/wjz012xr/2eae091d-1b97-4276-90bc-6757c5dfedee 服务端程序需要运行在不关机的服务器电脑上,

    2024年02月10日
    浏览(49)
  • 信息安全技术—实验三—PGP邮件加密软件的使用

    一、实验目的及要求         1.熟悉公开密钥密码体制,了解证书的基本原理,熟悉数字签名;         2.熟练使用PGP的基本操作,能对邮件或传输文档进行加密; 二、实验内容         1创建一私钥和公钥对         使用PGPtray之前,需要用PGPkeys生成一对密钥,

    2024年02月06日
    浏览(56)
  • 公司内部传文件怎么安全——「用绿盾透明加密软件」

    为保证公司内部文件传递的安全性,可以使用天锐绿盾透明加密软件来进行保护。以下是具体的操作步骤: 在公司内部部署天锐绿盾加密软件,确保需要传递的文件都能受到加密保护。 在员工的工作电脑上安装天锐绿盾客户端,并设置好相关的加密规则。例如,可以设置对

    2024年02月21日
    浏览(57)
  • 加密解密软件VMProtect教程(四):准备项目之使用标记

    VMProtect 是保护应用程序代码免遭分析和破解的可靠工具,但只有在正确构建应用程序内保护机制并且没有可能破坏整个保护的典型错误的情况下才能最有效地使用。 为了保护代码的各个片段和字符串常量,您可以在应用程序的源代码中插入特殊标记。标记是对从外部库导入

    2024年02月05日
    浏览(59)
  • 6个免费好用的 PDF 文件加密软件 [Windows & Mac]

    加密 PDF 文件使您能够保护它们免受未经授权的访问。当重要信息处于危险之中时,黑客可以访问电子文档。 考虑到它们很容易被黑客入侵,您需要迅速采取行动。避免这种情况的方法之一是使用更适合您需要的 PDF 加密软件。 有很多选项可供选择,因此请务必查看我的建议

    2024年01月18日
    浏览(50)
  • 利用RSA加密打造强大License验证,确保软件正版合法运行

      概述: C#软件开发中,License扮演着确保软件合法使用的重要角色。采用RSA非对称加密方案,服务端生成带签名的License,客户端验证其有效性,从而实现对软件的授权与安全保障。 License(许可证)在C#软件开发中被广泛应用,以确保软件在合法授权的环境中运行。常见场景

    2024年02月19日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包