Unity/VS/C#Unity工程加密授权开发---LicenseProj

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

最近在发布Unity工程时要考虑给Unity加密的问题,但有关此类的文章很少,多数人推荐使用C#中的System.Management类实现,虽然Unity3d支持.net3.5架构,但是并不是所有功能都能支持,System.Management类就是其中一个,该类能在VS中很好运行,但在Unity框架中并不支持,因此,我在加密过程中绕过System.Management管理类,这里是通过Unity调用cmd获取ProcessorID,然后再通过C#中System.Security.Cryptography加密算法类进行加密解密。经过一番周折,终于测试成功,这里分享给大家。

主要分为三大步骤来完成:

1.VS创建Windows窗体应用,开发生成License文件工程

第一步,主要完成License生成器开发,能够从这一工程里获取到一个授权的License.lic文件。

2.VS创建类库.Net Framework应用,开发生成.dll类库工程

 第二步,主要完成获取ProcessorID和对License校验功能。

3.创建Uinty工程,引用.dll开发,实现License授权功能

这一步,主要完成对Unity工程授权的逻辑开发,通过对License的授权验证,确定是否进入到工程内部。

一、VS创建Windows窗体应用,生成License工程

vs项目加密,Licenes授权-加密解密,unity,c#,游戏引擎

1.1License文件生成器代码

 vs项目加密,Licenes授权-加密解密,unity,c#,游戏引擎

//---------------------------
//@Author GarFey
//@date 20190612
//@version 1.0
//---------------------------

using System;
using System.Windows.Forms;
using System.IO;
using System.Security.Cryptography;
using System.Management;

namespace LicenesCreater
{
    public partial class 许可证生产器 : Form
    {
        private string key = "GarFey201906101620MA124EAAfeTud00CtDpoQwnvmmStsitSwtsitloxigpxnDPPdSod";
        private string iv = "LeadVR20190610GarFeyCreatPrivatekeyQe90QPlcMA124EA";

        public 许可证生产器()
        {
            InitializeComponent();
        }

        ///
        /// 数据加密 序列化
        ///
        ///
        ///
        ///
        ///
        private string encrption(string input, string key, string iv)
        {
            MemoryStream msEncrypt = null;//读写内存
            RijndaelManaged aesAlg = null;//加密算法类

            string sresult = string.Empty;

            try
            {
                byte[] keys = System.Text.Encoding.UTF8.GetBytes(key);
                byte[] ivs = System.Text.Encoding.UTF8.GetBytes(iv);

                aesAlg = new RijndaelManaged();//加密算法类实例化

                aesAlg.Key = keys;
                aesAlg.IV = ivs;

                ICryptoTransform ict = aesAlg.CreateEncryptor(aesAlg.Key, aesAlg.IV);//加密转换接口类
                msEncrypt = new MemoryStream();//读写内存类实例化

                using (CryptoStream cts = new CryptoStream(msEncrypt, ict, CryptoStreamMode.Write))
                {
                    using (StreamWriter sw = new StreamWriter(cts))
                    {
                        sw.Write(input);
                    }
                }

            }
            finally
            {
                if (aesAlg != null)
                {
                    //aesAlg.Dispose();
                    aesAlg.Clear();
                }
            }

            if (msEncrypt != null)
            {
                byte[] content = msEncrypt.ToArray();

                sresult = Convert.ToBase64String(content);
            }

            return sresult;
        }

        ///
        /// 数据解密 反序列化
        ///
        ///
        ///
        ///
        ///
        private string decrption(string input, string key, string iv)
        {
            string sresult = string.Empty;

            byte[] keys = System.Text.Encoding.UTF8.GetBytes(key);
            byte[] ivs = System.Text.Encoding.UTF8.GetBytes(iv);

            byte[] inputbytes = Convert.FromBase64String(input);

            RijndaelManaged rm = null;

            try
            {
                rm = new RijndaelManaged();
                rm.Key = keys;
                rm.IV = ivs;

                ICryptoTransform ict = rm.CreateDecryptor(rm.Key, rm.IV);

                using (MemoryStream ms = new MemoryStream(inputbytes))
                {
                    using (CryptoStream cs = new CryptoStream(ms, ict, CryptoStreamMode.Read))
                    {
                        using (StreamReader sr = new StreamReader(cs))
                        {
                            sresult = sr.ReadToEnd();
                        }
                    }
                }
            }
            finally
            {
                if (rm != null)
                {
                    //rm.Dispose();
                    rm.Clear();
                }
            }
            return sresult;
        }


        private bool IsInTimeInterval(DateTime time, DateTime startTime, DateTime endTime)
        {
            //判断时间段开始时间是否小于时间段结束时间,如果不是就交换
            if (startTime > endTime)
            {
                DateTime tempTime = startTime;
                startTime = endTime;
                endTime = tempTime;
            }

            //获取以公元元年元旦日时间为基础的新判断时间
            DateTime newTime = new DateTime();
            newTime = time;

            //获取以公元元年元旦日时间为基础的区间开始时间
            DateTime newStartTime = new DateTime();
            newStartTime = startTime;

            //获取以公元元年元旦日时间为基础的区间结束时间
            DateTime newEndTime = new DateTime();
            newEndTime = endTime;

            if (newTime >= newStartTime && newTime < newEndTime)
            {
                return true;
            }
            return false;
        }

        private void curCpuId_TextChanged(object sender, EventArgs e)
        {

        }

        private void label1_Click(object sender, EventArgs e)
        {

        }
        private void button2_Click(object sender, EventArgs e)
        {
            System.Management.ManagementClass mc = new ManagementClass("win32_processor");
            ManagementObjectCollection moc = mc.GetInstances();
            String processorid = "";
            foreach (ManagementObject mo in moc)
            {
                processorid = mo["processorid"].ToString();
                //MessageBox.Show(mo["processorid"].ToString());
                break;
            }
            this.textBox1.Text = processorid;
            string text = encrption(this.textBox1.Text, key.Substring(0, 32), iv.Substring(0, 16));
            this.textBox2.Text = text;
            using (FileStream fs = new FileStream("cuteeditor.lic", FileMode.Create, FileAccess.Write, FileShare.None))
            {

                using (StreamWriter sw = new StreamWriter(fs))
                {
                    // sw.Write("None;zh-cn;None;8H489467LS631834L;CuteEditor.Editor for asp.net is licensed.;1.6;5;51aspx.com;125.76.229.233;09/09/2099");
                    sw.Write(text);
                }

                Console.ReadLine();

            }
        }

        private void button3_Click(object sender, EventArgs e)
        {
            System.Management.ManagementClass mc = new ManagementClass("win32_processor");
            ManagementObjectCollection moc = mc.GetInstances();
            string processorid = "";
            string testext = "";
            foreach (ManagementObject mo in moc)
            {
                processorid = mo["processorid"].ToString();
                //MessageBox.Show(mo["processorid"].ToString());


                using (FileStream fs = new FileStream("cuteeditor.lic", FileMode.Open, FileAccess.Read, FileShare.None))
                {

                    using (StreamReader sr = new StreamReader(fs))
                    {
                        // sw.Write("None;zh-cn;None;8H489467LS631834L;CuteEditor.Editor for asp.net is licensed.;1.6;5;51aspx.com;125.76.229.233;09/09/2099");
                        testext = sr.ReadToEnd();

                    }

                    Console.ReadLine();

                }
                string text = decrption(testext, key.Substring(0, 32), iv.Substring(0, 16));
                this.textBox3.Text = text;
                if (text == processorid)
                {
                    MessageBox.Show("许可证文件正确");
                }
                else
                {
                    MessageBox.Show("许可证文件不正确 LicInfo:"+ text);
                }
            }
        }


        private void button1_Click(object sender, EventArgs e)
        {
            string text = encrption(this.textBox4.Text, key.Substring(0, 32), iv.Substring(0, 16));
            this.textBox5.Text = text;
            DateTime date01 = dateTimePicker1.Value;
            DateTime date02 = dateTimePicker2.Value;
           
            string date1 = string.Format("{0:yyyy}-" + "{0:MM}-" + "{0:dd}", date01);
            string date2 = string.Format("{0:yyyy}-" + "{0:MM}-" + "{0:dd}", date02);
            string date1changed = encrption(date1, key.Substring(0, 32), iv.Substring(0, 16));
            string date2changed = encrption(date2, key.Substring(0, 32), iv.Substring(0, 16));

            System.DateTime currentTime = new System.DateTime();
            currentTime = System.DateTime.Now;
            if (IsInTimeInterval(currentTime, date01, date02) == true)
            {
                MessageBox.Show("在授权期限内");
            }
            else
            {
                MessageBox.Show("不在授权期限内");
            }
            //MessageBox.Show(date1);
            using (FileStream fs = new FileStream("License.lic", FileMode.Create, FileAccess.Write, FileShare.None))
            {

                using (StreamWriter sw = new StreamWriter(fs))
                {
                    // sw.Write("None;zh-cn;None;8H489467LS631834L;CuteEditor.Editor for asp.net is licensed.;1.6;5;51aspx.com;125.76.229.233;09/09/2099");
                    sw.WriteLine("Copyright (c) [本软件授权使用期限:" + date1 + "--" + date2 + "] [本软件由XXXX有限公司开发]");
                    sw.WriteLine("XXXX 软件许可协议(OEM/IHV/ISV 分销和单个用户)");
                    sw.WriteLine("重要通知 - 在复制、安装或使用之前,请先仔细阅读。");
                    sw.WriteLine("只有在仔细阅读下面的条款之后,方可使用或装载本软件及相关材料(总称为“软件”)。装载或使用本“软件”,即表明您同意本“协议”的条款。如果您不同意本“协议”的条款,请不要安装或使用本“软件”。");
                    sw.WriteLine("此外,还请注意:");
                    sw.WriteLine("* 如果您是原始设备制造商 (OEM)、独立硬件销售商 (IHV),或独立软件供应商 (ISV),本“许可协议”的所有内容对您适用。");
                    sw.WriteLine("* 如果您是最终用户,则只有附件一,即“XXXX 软件许可协议”对您适用。");
                    sw.WriteLine("对于 OEM、IHV 和 ISV:");
                    sw.WriteLine("许可:这一“软件”仅许可用来与 XXXX 组件产品结合使用。本“协议”不授予将此“软件”和其它非 XXXX 组件产品结合使用的许可。受本“协议”条款的约束,XXXX 公司据其版权授予您下述非专有、不可转让、全球性和完全付清的许可:");
                    sw.WriteLine("1. 为您本身的开发和维护目的而内部使用、改动和复制“软件”;并且");
                    sw.WriteLine("2. 更改、复制并向您的最终用户分销“软件”,包括本“软件”的衍生产品,条件是,这种分发必须按照一项许可协议进行,其条款至少要象下面所附的附件一,即 XXXX 公司最终、单个用户“许可协议”中所包含的条款一样严格,以及");
                    sw.WriteLine("3. 更改、复制和分销随“软件”所附的最终用户说明文件,但只能和“软件”一起分发。");
                    sw.WriteLine("");
                    sw.WriteLine("如果您不是装有本“软件”的计算机系统或软件程序的最终制造商或销售商,那么,您可以转让本“软件”的一份副本,包括本“软件”的衍生产品(和有关的最终用户说明文件)给您的接收者,按本“协议”的条款供其使用,条件是,该接收者必须同意完全接受本“协议”条款的约束。您将不得转让、分让或租让许可或以任何其它方式将本“软件”转移或透露给任何第三者。您将不得分解编码、拆散本“软件”或对其进行逆向工程设计。");
                    sw.WriteLine("除本“协议”中明确规定者以外,没有通过任何直接的、隐含的、推理的、禁止反悔的或其它方式授予贵方任何许可或权利。XXXX 公司将有权检查或经由独立审计人检查贵方的有关记录,以证实贵方是否遵守本“协议”的条款。");
                    sw.WriteLine("保密:如果贵方希望由第三方咨询机构或转包人(“承包人”)代贵方从事一些需要接触和使用本“软件”的工作,贵方必须从承包人处获得书面保密协议,其条款和接触使用本“软件”所涉及的责任至少应和本“协议”的条款一样严格,并规定承包人不得分发本“软件”或将之用于任何其它目的。除此之外,贵方不得透露签署过本“协议”或其中的条款,未经 XXXX 公司的书面同意,也不得在任何出版物、广告或其它公告中使用 XXXX 公司的名称。贵方没有任何权利使用 XXXX 公司的任何商标或标识。");
                    sw.WriteLine("软件的所有权和版权:本“软件”所有副本的所有权归 XXXX 公司或其供应商所有。本“软件”具有版权,并受到美国和其它国家法律以及国际条约条款的保护。您不得从本“软件”上删除任何版权通知。XXXX 公司可随时改变本“软件”或其中述及的项目,恕不另行通知,但是,XXXX 公司没有义务支持本“软件”或对其进行更新。除非另有明确规定,XXXX 公司未以任何明确的或隐含的方式授予贵方任何其拥有的专利、版权、商标或其它知识产权方面的权利。只有在接收者同意完全接受这些条款的约束且贵方不保留“软件”副本的前提下,您才能转让本“软件”。");
                    sw.WriteLine("有限的媒体品质保证:如果本“软件”由 XXXX 公司以实物媒体递交,XXXX 公司保证自该媒体交递之日起九十 (90) 天内没有材料和实物上的缺陷。如果出现这样的缺陷,请将有缺陷的媒体退还 XXXX 公司进行更换,XXXX 公司也可能选择以另外的途径递交该“软件”。");
                    sw.WriteLine("不包括任何其它保证:除上述保证之外,本“软件”是按其“现状”而提供的,没有任何其它明确或隐含的保证,包括适销性、非侵权性或适用于某一特定用途的保证。XXXX 公司对本“软件”中包括的任何信息、文字、图形、链接或其它项目的精确性或完整性不作担保,也不承担责任。");
                    sw.WriteLine("有限责任:对于因使用或无法使用本“软件”所造成的任何损失(包括但并不限于利润损失、业务中断或信息丢失等),无论在何种情况下,即使 XXXX 公司已被事先通知可能会出现这样的损失,XXXX 公司及其供应商均不承担任何责任。有些法律管区禁止排除或限制隐含保证或后果性、事故性损失的责任,因此,上述限制可能对您不适用。随法律管区的不同,您还可能拥有其它法定权利。");
                    sw.WriteLine("本协议的终止:如果您违反“协议”的条款,XXXX 公司则可随时终止本“协议”。协议终止时,您应该立即销毁本“软件”或将“软件”的所有副本退还 XXXX 公司。");
                    sw.WriteLine("适用的法律:因本“协议”而产生的索赔将接受加利福尼亚州法律的管辖,但不受其法律冲突原则的约束。本“协议”将不受《联合国国际货物销售合同公约》的约束。您不得违反适用的出口法规而将本“软件”出口国外。XXXX 公司不承担任何其它协议的责任,除非这些协议为书面协议并经过 XXXX 公司的授权代表签署。");
                    sw.WriteLine("政府机构有限的权利:本“软件”是以“有限的权利”而提供的。政府机构使用、复制或透露本“软件”应受到 FAR52.227-14 和 DFAR252.227-7013 及其承续法的限制。政府机构使用本“软件”即表明其承认 XXXX 公司对“软件”的所有权权利。承包商或制造商为:XXXX Corporation, 2200 Mission College Blvd., Santa Clara, CA 95052 USA。");
                    sw.WriteLine("");
                    sw.WriteLine("附件一");
                    sw.WriteLine("XXXX 软件许可协议(最终、单个用户)");
                    sw.WriteLine("重要通知 - 在复制、安装或使用之前,请先仔细阅读。");
                    sw.WriteLine("只有在仔细阅读下面的条款之后,方可使用或装载本软件及相关材料(总称为“软件”)。装载或使用本“软件”,即表明您同意本“协议”的条款。如果您不同意本“协议”的条款,请不要安装或使用本“软件”。");
                    sw.WriteLine("许可:您可将本“软件”复制到一台计算机上供非商业性的个人使用,并可复制一份本“软件”的备份。上述使用和备份受以下条款的约束:");
                    sw.WriteLine("1. 这一“软件”仅许可用来与 XXXX 组件产品结合使用。本“协议”不授予将此“软件”和其它非 XXXX 组件产品结合使用的许可。");
                    sw.WriteLine("2. 除本“协议”中规定者之外,您不得复制、改变、出租、出售、分发或转让本“软件”的任何部分,您并且同意防止他人未经授权而复制本“软件”。");
                    sw.WriteLine("3. 您不得分解编码、拆散本“软件”或对其进行逆向工程设计。");
                    sw.WriteLine("4. 您不得分让或允许同时有一个以上的用户使用本“软件”。");
                    sw.WriteLine("5. 本“软件”可能含有第三方供应商的软件或其它财产,其中有些可能已经在随附的“license.txt”或其它文本或文件中注明并根据这些文件而获得许可。");
                    sw.WriteLine("软件的所有权和版权:本“软件”所有副本的所有权归 XXXX 公司或其供应商所有。本“软件”具有版权,并受到美国和其它国家法律以及国际条约条款的保护。您不得从本“软件”上删除任何版权通知。XXXX 公司可随时改变本“软件”或其中述及的项目,恕不另行通知,但是,XXXX 公司没有义务支持本“软件”或对其进行更新。除非另有明确规定,XXXX 公司未以任何明确的或隐含的方式授予贵方任何其拥有的专利、版权、商标或其它知识产权方面的权利。只有在接收者同意完全接受这些条款的约束且贵方不保留“软件”副本的前提下,您才能转让本“软件”。");
                    sw.WriteLine("有限的媒体品质保证:如果本“软件”由 XXXX 公司以实物媒体交递,XXXX 公司保证自该媒体交递之日起九十 (90) 天内没有材料和实物上的缺陷。如果出现这样的缺陷,请将有缺陷的媒体退还 XXXX 公司进行更换,XXXX 公司也可能选择以另外的途径交递该“软件”。");
                    sw.WriteLine("不包括任何其它保证:除上述保证之外,本“软件”是按其“现状”而提供的,没有任何其它明确或隐含的保证,包括适销性、非侵权性或适用于某一特定用途的保证。XXXX 公司对本“软件”中包括的任何信息、文字、图形、链接或其它项目的精确性或完整性不作担保,也不承担责任。");
                    sw.WriteLine("有限责任:对于因使用或无法使用本“软件”所造成的任何损失(包括但并不限于利润损失、业务中断或信息丢失等),无论在何种情况下,即使 XXXX 公司已被事先通知可能会出现这样的损失,XXXX 公司及其供应商均不承担任何责任。有些法律管区禁止排除或限制隐含保证或后果性、事故性损失的责任,因此,上述限制可能对您不适用。随法律管区的不同,您还可能拥有其它法定权利。");
                    sw.WriteLine("本协议的终止:如果您违反本“协议”的条款,XXXX 公司则可随时终止本“协议”。“协议”终止时,您应该立即销毁本“软件”或将“软件”的所有副本退还 XXXX 公司。");
                    sw.WriteLine("适用的法律:因本“协议”而产生的索赔将中华人民共和国法律的管辖,但不受其法律冲突原则的约束。本“协议”将不受《联合国国际货物销售合同公约》的约束。您不得违反适用的出口法规而将本“软件”出口国外。XXXX 公司不承担任何其它协议的责任,除非这些协议为书面协议并经过 XXXX 公司的授权代表签署。");
                    sw.WriteLine("政府机构有限的权利:本“软件”是以“有限的权利”而提供的。政府机构使用、复制或透露本“软件”受到 FAR52.227-14 和 DFAR252.227-7013 及其承续法的限制。政府机构使用本“软件”即表明其承认 XXXX 公司对“软件”的所有权权利。承包商或制造商为:XXXX Corporation, 2200 Mission College Blvd., Santa Clara, CA 95052 USA。SLAOEMISV1/RBK/01-21-00");
                    sw.WriteLine("INCREMENT jackDataManagerbase ugslmd 7.0 15caugc2013 100 SUPERSEDE");
                    sw.WriteLine("DUPDataManagerGROUP=UHD ISSUED=10caprc2013 ck=197 SIGN=13E6 6CA8 B322");
                    sw.WriteLine("vwViht2lF5ylrm86DcwjI2bO/T7msUGMdslcgEH+EqY=cMKidern7PkegIelOLyYycxcA");
                    sw.WriteLine("");
                    sw.WriteLine(date1changed);
                    sw.WriteLine("");
                    sw.WriteLine(date2changed);
                    sw.WriteLine("0CED 1E9E 40C4 F4C5 11EF 2257 024B 2F89 F32F C5E0 A8B5");
                    sw.WriteLine("404E F48C A0E0");
                    sw.WriteLine("INCREMENT jackDataManagermocap ugslmd 7.0 15caugc2013 100 SUPERSEDE");
                    sw.WriteLine("DUPDataManagerGROUP=UHD ISSUED=10caprc2013 ck=213 SIGN=0E14 0B08 72EE");
                    sw.WriteLine("vwVihs2oF6ylpm8mDcwAI2bO/T7qsUGMdGupgEH+EvY=cqGcMKlk3gvcOIlOLyllYycA");
                    sw.WriteLine("");
                    sw.WriteLine(date1changed);
                    sw.WriteLine("");
                    sw.WriteLine(date2changed);
                    sw.WriteLine("17C0 A842 8C45 589D 0DFE 4AD5 BC98 5477 6119 14BE 44A6 43BC");
                    sw.WriteLine("F203 A4D9 E7B8");
                    sw.WriteLine("INCREMENT jackDataManageropt ugslmd 7.0 15caugc2013 100 SUPERSEDE DUPDataManagerGROUP=UHD");
                    sw.WriteLine("ISSUED=10caprc2013 ck=153 SIGN=1A92 02DD 4141 8368 E567 8A7F");
                    sw.WriteLine("vwVtht2oF5ydrmsmDcwAj2bO/T7qbUGMdGuqgEH+EgY=7PH7k3OIfhlOjhdfPLyYycA");
                    sw.WriteLine("");
                    sw.WriteLine(date1changed);
                    sw.WriteLine("");
                    sw.WriteLine(date2changed);
                    sw.WriteLine("1126 FC56 F296 8EA7 E581 3F14 9010 A358 842F A95C DF78 1F41");
                    sw.WriteLine("INCREMENT jackDataManagertat ugslmd 7.0 15caugc2013 100 SUPERSEDE DUPDataManagerGROUP=UHD");
                    sw.WriteLine("ISSUED=10caprc2013 ck=246 SIGN=0530 5C25 E534 748D 8C6D 18B4");
                    sw.WriteLine(text + "7PH7k3OI46lOjhdffsPLyYycA");
                    sw.WriteLine("");
                    sw.WriteLine(date1changed);
                    sw.WriteLine("");
                    sw.WriteLine(date2changed);
                    sw.WriteLine("F771 BEE5 2B9B B401 9B68 7CAD AC16 748F 366F 5536 E8BF 7067");
                    sw.WriteLine("INCREMENT jackDataManagertoolkit ugslmd 7.0 15caugc2013 100 SUPERSEDE");
                    sw.WriteLine("DUPDataManagerGROUP=UHD ISSUED=10caprc2013 ck=146 SIGN=02F5 0DD5 E558");
                    sw.WriteLine("vwViht0oF5ylrw8mDcwAI2zO/T7fsUHMdGuzgEH-EqY=l7k3OIlshhOnmjkgPLyYycA");
                    sw.WriteLine("");
                    sw.WriteLine(date1changed);
                    sw.WriteLine("");
                    sw.WriteLine(date2changed);
                    sw.WriteLine("1F86 4E64 35B5 0A4E 597E 78B0 0A28 A0C9 644B E5D8 1F80 94FA");
                    sw.WriteLine("DFFA A6AE BEF4");
                    sw.WriteLine("FEATURE serverDataManagerid ugslmd 7.0 permanent 1 VENDORDataManagerSTRING=IN04102013 c");
                    sw.WriteLine("SIEMENS PLM SOFTWA userDataManagerinfo=3TLFWAM3CP ISSUER=SIEMENS ck=175");
                    sw.WriteLine("SIGN=116C 3E2A 6874 5E61 97B9 9942 5EED 2661 A20C 690E F60D");
                    sw.WriteLine("F803 C42E 47E9 D6E1 0005 7F17 3AB3 5EA7 68FD 2D8C 81AD 171D");
                }

                Console.ReadLine();

            }
        }

        private void button4_Click(object sender, EventArgs e)
        {
            System.Management.ManagementClass mc = new ManagementClass("win32_processor");
            ManagementObjectCollection moc = mc.GetInstances();
            string processorid = "";
            string testext = "";
            foreach (ManagementObject mo in moc)
            {
                processorid = mo["processorid"].ToString();
                //MessageBox.Show(mo["processorid"].ToString());


                using (FileStream fs = new FileStream("License.lic", FileMode.Open, FileAccess.Read, FileShare.None))
                {
                    int iXH = 0;
                    using (StreamReader sr = new StreamReader(fs))
                    {
                        string line = sr.ReadLine();

                        while ((line = sr.ReadLine()) != null)
                        {
                            //这里的Line就是您要的的数据了
                            iXH++;//计数,总共几行
                            line = sr.ReadLine();
                            if (!string.IsNullOrEmpty(line))
                            {
                                line = line.Trim();

                                if (line.StartsWith("ISSUED=10caprc2013 ck=246 SIGN=0530 5C25 E534 748D 8C6D 18B4"))
                                {
                                    line = sr.ReadLine().Substring(0, 44);
                                    string text = decrption(line, key.Substring(0, 32), iv.Substring(0, 16));
                                    this.textBox6.Text = text;

                                    if (text == this.textBox4.Text)
                                    {
                                        line = sr.ReadLine();
                                        line = sr.ReadLine();

                                        string date001 = decrption(line, key.Substring(0, 32), iv.Substring(0, 16));
                                        //MessageBox.Show(date001);
                                        line = sr.ReadLine();
                                        line = sr.ReadLine();
                                        string date002 = decrption(line, key.Substring(0, 32), iv.Substring(0, 16));
                                        //MessageBox.Show(date002);
                                        System.DateTime currentTime = new System.DateTime();
                                        currentTime = System.DateTime.Now;
                                        string[] s1 = date001.Split(new char[] { '-' });
                                        string[] s2 = date002.Split(new char[] { '-' });
                                        int date01year = Int32.Parse(s1[0]);
                                        int date02year = Int32.Parse(s2[0]);
                                        int date01month = Int32.Parse(s1[1]);
                                        int date02month = Int32.Parse(s2[1]);
                                        int date01day = Int32.Parse(s1[2]);
                                        int date02day = Int32.Parse(s2[2]);
                                        DateTime date01 = new DateTime(date01year, date01month, date01day);
                                        DateTime date02 = new DateTime(date02year, date02month, date02day);

                                        if (IsInTimeInterval(currentTime, date01, date02) == true)
                                        {
                                            MessageBox.Show("许可证文件正确,且在授权期限内");
                                        }
                                        else
                                        {
                                            MessageBox.Show("许可证文件已失时效");
                                        }
                                    }
                                    else
                                    { MessageBox.Show("许可证文件非法!", "提示"); }
                                }
                            }
                        }
                    }
                    Console.ReadLine();
                }
            }
        }
    }
}

工程运行生成可执行文件:

vs项目加密,Licenes授权-加密解密,unity,c#,游戏引擎
 

1.2License使用

启动License生成器后,看到如下界面,点击 生成(生成器授权.lic)按钮

vs项目加密,Licenes授权-加密解密,unity,c#,游戏引擎

稍等片刻,本机cpu-id 和 许可证文件源码 就会生成出来,然后按照图片操作,把cpu-id复制到下面待生成cpu-id框内。

vs项目加密,Licenes授权-加密解密,unity,c#,游戏引擎


复制好后,选择license的授权日期。 

vs项目加密,Licenes授权-加密解密,unity,c#,游戏引擎



选择完成后,点击 生成(License.lic)按钮,弹出如下提示框,说明生成文件完成且正确。

vs项目加密,Licenes授权-加密解密,unity,c#,游戏引擎

vs项目加密,Licenes授权-加密解密,unity,c#,游戏引擎


 

二、VS创建类库.Net Framework应用,开发生成.dll类库工程

vs项目加密,Licenes授权-加密解密,unity,c#,游戏引擎

Dll工程代码

//---------------------------
//@Author GarFey
// @date 20190612
// @version 1.0
//---------------------------
using System;
using System.IO;
using System.Security.Cryptography;

namespace License
{
    public class LicenesCheck
    {
        private string key = "GarFey201906101620MA124EAAfeTud00CtDpoQwnvmmStsitSwtsitloxigpxnDPPdSod";
        private string iv = "LeadVR20190610GarFeyCreatPrivatekeyQe90QPlcMA124EA";

        ///
        /// 
        ///
        ///
        ///
        /// 0 许可证文件正确,且在授权期限内
        /// 1 没有许可证文件
        /// 2 许可证文件已失时效
        /// 3 许可证文件非法!
        ///
        public int Verification(string licPath)
        {
            try
            {
                string processorid = GetProcessorId();
                string path = licPath + "/License/License.lic";
                //WriteLog.Log("licpath == "+ path);
                using (FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.None))
                {
                    int iXH = 0;
                    using (StreamReader sr = new StreamReader(fs))
                    {
                        string line = sr.ReadLine();
                        while ((line = sr.ReadLine()) != null)
                        {
                            iXH++;//计数,总共几行
                            line = sr.ReadLine();
                            if (!string.IsNullOrEmpty(line))
                            {
                                line = line.Trim();

                                if (line.StartsWith("ISSUED=10caprc2013 ck=246 SIGN=0530 5C25 E534 748D 8C6D 18B4"))
                                {
                                    line = sr.ReadLine().Substring(0, 44);
                                    //WriteLog.Log("line "+ line);
                                    string text = decrption(line, key.Substring(0, 32), iv.Substring(0, 16));
                                    //WriteLog.Log("decrption text " + text);
                                    if (text == processorid)
                                    {
                                        line = sr.ReadLine();
                                        line = sr.ReadLine();
                                        string date001 = decrption(line, key.Substring(0, 32), iv.Substring(0, 16));
                                        line = sr.ReadLine();
                                        line = sr.ReadLine();
                                        string date002 = decrption(line, key.Substring(0, 32), iv.Substring(0, 16));
                                        System.DateTime currentTime = new System.DateTime();
                                        currentTime = System.DateTime.Now;
                                        string[] s1 = date001.Split(new char[] { '-' });
                                        string[] s2 = date002.Split(new char[] { '-' });
                                        int date01year = Int32.Parse(s1[0]);
                                        int date02year = Int32.Parse(s2[0]);
                                        int date01month = Int32.Parse(s1[1]);
                                        int date02month = Int32.Parse(s2[1]);
                                        int date01day = Int32.Parse(s1[2]);
                                        int date02day = Int32.Parse(s2[2]);
                                        DateTime date01 = new DateTime(date01year, date01month, date01day);
                                        DateTime date02 = new DateTime(date02year, date02month, date02day);

                                        if (IsInTimeInterval(currentTime, date01, date02) == true)
                                        {
                                            return 0;//许可证文件正确,且在授权期限内
                                        }
                                        else
                                        {
                                            return 2;//许可证文件已失时效
                                        }
                                    }
                                    else
                                    {
                                        return 3;//许可证文件非法!

                                    }

                                }
                            }
                        }

                    }

                    Console.ReadLine();

                }
            }
            catch(Exception e)
            {
                string errorStr = e.ToString();
                //WriteLog.LogExcption("Exception:: License 获取警告" + errorStr);
                if (errorStr.StartsWith("System.Security.Cryptography.CryptographicException: Invalid input block size."))
                {
                    return 3;//许可证文件非法!
                }
                return 1; //没有许可证文件
            }
            return 4; 
        }
        private bool IsInTimeInterval(DateTime time, DateTime startTime, DateTime endTime)
        {
            //判断时间段开始时间是否小于时间段结束时间,如果不是就交换
            if (startTime > endTime)
            {
                DateTime tempTime = startTime;
                startTime = endTime;
                endTime = tempTime;
            }

            //获取以公元元年元旦日时间为基础的新判断时间
            DateTime newTime = new DateTime();
            newTime = time;

            //获取以公元元年元旦日时间为基础的区间开始时间
            DateTime newStartTime = new DateTime();
            newStartTime = startTime;

            //获取以公元元年元旦日时间为基础的区间结束时间
            DateTime newEndTime = new DateTime();
            newEndTime = endTime;

            if (newTime >= newStartTime && newTime < newEndTime)
            {
                return true;
            }
            return false;
        }
        public string encrption(string input, string key, string iv)
        {
            MemoryStream msEncrypt = null;
            RijndaelManaged aesAlg = null;

            string sresult = string.Empty;

            try
            {
                byte[] keys = System.Text.Encoding.UTF8.GetBytes(key);
                byte[] ivs = System.Text.Encoding.UTF8.GetBytes(iv);
                aesAlg = new RijndaelManaged();
                aesAlg.Key = keys;
                aesAlg.IV = ivs;

                ICryptoTransform ict = aesAlg.CreateEncryptor(aesAlg.Key, aesAlg.IV);
                msEncrypt = new MemoryStream();

                using (CryptoStream cts = new CryptoStream(msEncrypt, ict, CryptoStreamMode.Write))
                {
                    using (StreamWriter sw = new StreamWriter(cts))
                    {
                        sw.Write(input);
                    }
                }

            }
            finally
            {
                if (aesAlg != null)
                {
                    aesAlg.Clear();
                }
            }

            if (msEncrypt != null)
            {
                byte[] content = msEncrypt.ToArray();

                sresult = Convert.ToBase64String(content);
            }

            return sresult;
        }

        public string decrption(string input, string key, string iv)
        {
            string sresult = string.Empty;

            byte[] keys = System.Text.Encoding.UTF8.GetBytes(key);
            byte[] ivs = System.Text.Encoding.UTF8.GetBytes(iv);

            byte[] inputbytes = Convert.FromBase64String(input);

            RijndaelManaged rm = null;

            try
            {
                rm = new RijndaelManaged();
                rm.Key = keys;
                rm.IV = ivs;

                ICryptoTransform ict = rm.CreateDecryptor(rm.Key, rm.IV);

                using (MemoryStream ms = new MemoryStream(inputbytes))
                {
                    using (CryptoStream cs = new CryptoStream(ms, ict, CryptoStreamMode.Read))
                    {
                        using (StreamReader sr = new StreamReader(cs))
                        {
                            sresult = sr.ReadToEnd();
                        }
                    }
                }
            }
            finally
            {
                if (rm != null)
                {
                    rm.Clear();
                }
            }
            return sresult;
        }
        ///
        /// 获取cpuid
        ///
        ///
        public string GetProcessorId()
        {
            string processorid = "";
            string outstr = RunCmdNoErr("wmic", " CPU get ProcessorID");
            string cpuId = outstr.Replace("ProcessorId", "");
            processorid = cpuId.Trim();
            return processorid;
        }

        ///
        /// 构建Process对象,并执行
        ///
        /// 命令
        /// 命令的参数
        /// 工作目录
        /// Process对象
        private System.Diagnostics.Process CreateCmdProcess(string cmd, string args, string workdir = null)
        {
            var pStartInfo = new System.Diagnostics.ProcessStartInfo(cmd);
            pStartInfo.Arguments = args;
            pStartInfo.CreateNoWindow = false;
            pStartInfo.UseShellExecute = false;
            pStartInfo.RedirectStandardError = true;
            pStartInfo.RedirectStandardInput = true;
            pStartInfo.RedirectStandardOutput = true;
            pStartInfo.StandardErrorEncoding = System.Text.UTF8Encoding.UTF8;
            pStartInfo.StandardOutputEncoding = System.Text.UTF8Encoding.UTF8;
            if (!string.IsNullOrEmpty(workdir))
                pStartInfo.WorkingDirectory = workdir;
            return System.Diagnostics.Process.Start(pStartInfo);
        }

        ///
        /// 运行命令,不返回stderr版本
        ///
        /// 命令
        /// 命令的参数
        /// 工作目录
        /// 命令的stdout输出
        private string RunCmdNoErr(string cmd, string args, string workingDri = "")
        {
            var p = CreateCmdProcess(cmd, args, workingDri);
            var res = p.StandardOutput.ReadToEnd();
            p.Close();
            return res;
        }
    }
}

工程运行后,得到dll文件:

vs项目加密,Licenes授权-加密解密,unity,c#,游戏引擎

三、在Unity中引用该dll,进行逻辑开发

vs项目加密,Licenes授权-加密解密,unity,c#,游戏引擎

Unity端代码:

//-----------------------------------------------
// @Author GarFey
// @date 20190612
// @version 1.0
//-----------------------------------------------
using UnityEngine;
using License;
using System;
using MsgBoxBase = System.Windows.Forms.MessageBox; //引用命名空间下消息类
using WinForms = System.Windows.Forms;              //引用命名空间

public class Main : MonoBehaviour {

    // Use this for initialization
    void Start () {
        licenseCheck();
    }
    void licenseCheck()
    {
        LicenesCheck lc = new LicenesCheck();
        string licPath = Application.dataPath;

        int isLicOk = lc.Verification(licPath);
        Debug.Log("" + isLicOk);

        switch (isLicOk)
        {
            /// 0 许可证文件正确,且在授权期限内
            case 0:
Debug.Log("许可证文件正确,且在授权期限内");
                break;
            /// 1 没有许可证文件
            case 1:
                switch (MsgBoxBase.Show("没有找到许可证文件!", "提示", WinForms.MessageBoxButtons.OK, WinForms.MessageBoxIcon.Question))
                {
                    case WinForms.DialogResult.OK:
                    case WinForms.DialogResult.Cancel:
                        print("quit");
                        quit();
                        break;
                }
                break;
            /// 2 许可证文件已失时效
            case 2:
                switch (MsgBoxBase.Show("许可证文件已失时效!", "提示", WinForms.MessageBoxButtons.OK, WinForms.MessageBoxIcon.Warning))
                {
                    case WinForms.DialogResult.OK:
                    case WinForms.DialogResult.Cancel:
                        print("quit");
                        quit();
                        break;
                }
                break;
                break;
            /// 3 许可证文件非法!
            case 3:
                switch (MsgBoxBase.Show("许可证文件非法!", "提示", WinForms.MessageBoxButtons.OK, WinForms.MessageBoxIcon.Error))
                {
                    case WinForms.DialogResult.OK:
                    case WinForms.DialogResult.Cancel:
                        print("quit");
                        quit();
                        break;
                }
                break;
            default:
                quit();
                break;
        }
    }

    void quit()
    {
        Application.Quit();
    }
}

运行结果展示:

License验证成功,且许可证文件正确 

vs项目加密,Licenes授权-加密解密,unity,c#,游戏引擎

没有License许可证文件

vs项目加密,Licenes授权-加密解密,unity,c#,游戏引擎

License许可证文件过期

vs项目加密,Licenes授权-加密解密,unity,c#,游戏引擎



非法(不正确)的LIcense许可证文件
 

vs项目加密,Licenes授权-加密解密,unity,c#,游戏引擎


注意:

到这里如果你编译时,有错误,确认下你是否有导入 System.Windows.Forms.dll。

具体的Unity调用Windows弹框,博主有具体讲解。文章来源地址https://www.toymoban.com/news/detail-671328.html

到了这里,关于Unity/VS/C#Unity工程加密授权开发---LicenseProj的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • VS2022远程Linux使用cmake开发c++工程配置方法

    最近使用别人在VS2015上使用visualgdb搭建的linux开发环境,各种不顺手,一会代码不能调转了,一会行号没了,调试的时候断不到正确的位置,取消的断点仍然会进。因此重新摸索了一套使用vs的远程开发方法。 使用的相关工具及技术涉及: Vs2022 Ninja g++ gcc mobaxterm等。 采用ss

    2024年02月12日
    浏览(45)
  • VS对于unity开发没有代码提示

    1.代开vs installer 查看是否有安装“ 使用unity的游戏开发 ” 2.如果你已经有了下载安装了unity,那么不需要安装unity编辑器 选择但各组件再次确认是否安装了 VS Tool for Unity ,如果没有那么安装一下。 3.是否正确设置了unity的默认编辑器  选择External Tools - External Script Editor - VS2

    2024年02月15日
    浏览(36)
  • Unity使用VS编辑器打开项目失败解决办法

    具体表现为:项目文件.sln无法打开,打开脚本文件后无法关联到Unity编辑器 报错信息可能不同,参考出错表现即可 首先去清除有逻辑错误的代码,先注释掉,不然后面可能会无法自动生成解决方案 然后关闭Unity编辑器,找到项目文件夹,删除我列出的文件 重新打开Unity,重

    2024年02月16日
    浏览(72)
  • Unity小知识-配置VS2019开发和调试

    1.打开编辑器,找到以下路径:工具-获取工具和功能,打开菜单 2.在弹出框中下拉,找到\\\"使用Unity的游戏开发”,选择后进行安装。 3.安装后,从unity hub编辑器设置脚本编辑器IDE,路径:Edit-Preferences-外部工具-外部脚本编辑器,选择visual studio 2019 4.打开Unity,点击需要编辑的

    2024年02月11日
    浏览(45)
  • VS中使用Qt开发项目

    在使用Qt时,Qt本身自带的IDE(Qt creater)有些人不是很喜欢,想要在自己一直用的VS中开发Qt项目,本篇将讲解一下在VS连接Qt过程中遇到的一系列问题。 各个部分的内容都是对于整体开发环境来说 ,也就是说:类似于版本的选择、配置等问题,都是考虑了很多方面而做的决定

    2024年02月02日
    浏览(38)
  • 使用 VS 2022 开发C#项目的tips

    拆分一个项目到多个文件 此操作的目的是,不把一个.cs文件写到一万米! Window窗体应用(WinForm): 直接参考这个: Visual Studio 拆分C#代码到多个cs文件。 控制台应用: VS2015如何在一个C#工程下,添加多个.cs文件。 具体操作流程: 右键项目名称-新建项-输入一个名字(可选

    2024年02月08日
    浏览(54)
  • VS Code 开发 Spring Boot 类型的项目

    在VS Code中开发Spring Boot的项目, 可以导入如下的扩展: Spring Boot Tools Spring Initializr Spring Boot Dashboard 比较建议的方式是安装Spring Boot Extension Pack, 这里面就包含了上面的扩展。 安装方式就是在扩展查找 “Spring Boot Extension Pack” 之后, 点击install 综合起来, 要在在VS Code中开发

    2024年02月06日
    浏览(41)
  • VS开发QT项目,手写按钮槽函数避坑

    由于最近开发需要在VS2017上配置QT开发环境,进行QT项目的开发,之前从来没有这样使用过,在此记一些坑。 QT的槽函数是非常方便的,使用QT Creator可以自动生成代码,方便快捷。但是代码可读性不强,一些连接方面的信息都被隐藏了。由于之前一直使用QT Creator,所以其实还

    2023年04月13日
    浏览(37)
  • 用Visual Studio(VS)开发UNIX/Linux项目

    目录 FTP是免不了的 正确设置头文件 组织项目结构 创建何种项目类型 FTP自动上传         大部分具有Windows开发经验的程序员会比较喜欢使用Visual Studio,而大部分Unix/Linux程序员则喜欢使用UltraEdit直接在主机上写代码。         为什么直接在主机上写代码呢,因为主机是没有

    2024年02月08日
    浏览(41)
  • Unity中级客户端开发工程师的进阶之路

    上期 UWA技能成长系统 之《Unity高级客户端开发工程师的进阶之路》得到了很多Unity开发者的肯定。通过系统的学习,可以掌握游戏性能瓶颈定位的方法和常见的CPU、GPU、内存相关的性能优化方法。 UWA技能成长系统是UWA根据学员的职业发展目标,提供技能学习的推荐路径,再将

    2024年02月12日
    浏览(46)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包