C#程序加密與解密的流程步驟
一、加密程序功能介紹
1、加密用途
對軟件權(quán)限加密可適用于設(shè)備催付款,限制使用日期。
2、功能
一臺機(jī)器一個(gè)注冊碼,每個(gè)碼都不一樣。加密后客戶嘗試修改電腦時(shí)間或者更換電腦均無效。
3、程序說明
Demo程序示例分為兩部分,用戶程序部分加密程序、一個(gè)是后臺權(quán)限注冊解密程序。
4、加密過程
讀取電腦CPU編碼、讀取電腦硬盤編碼,設(shè)置限定日期,生成注冊碼。注冊碼經(jīng)過MD5加密,寫入注冊表、寫入硬盤本地。(刪除或者修改注冊表中或者硬盤中的任何一個(gè)文件都將導(dǎo)致用戶軟件無法使用)
5、授權(quán)的注冊文件保存方式
授權(quán)的注冊碼經(jīng)過MD5加密技術(shù)加密后分別存儲在注冊表和本地硬盤中,經(jīng)過MD5加密后的數(shù)據(jù)無法進(jìn)行逆向解密。
在授權(quán)使用時(shí)間天數(shù)范圍內(nèi),用戶不能修改該注冊碼或者刪除文件,否則導(dǎo)致授權(quán)損壞用戶軟件無法使用軟件。
二、加密程序使用步驟
1、步驟一
在用戶程序中,將機(jī)器碼復(fù)制拷貝到解密程序中,設(shè)置授權(quán)使用天數(shù)。
(如果是永久授權(quán)使用,則授權(quán)天數(shù)輸入36500即可)
2、步驟二
解密程序中生成注冊碼
3、步驟三
將解密程序中生成的注冊碼復(fù)制到用戶軟件中,進(jìn)行注冊
4、步驟四
注冊后重新啟動(dòng)用戶程序,軟件生效
三、核心代碼說明
1、獲取電腦CPU 信息
每個(gè)CPU信息出廠后都是獨(dú)立且唯一的
/// <summary> /// 獲取電腦CPU信息的方法 /// </summary> /// <returns></returns> public static string GetCpuId() { ManagementClass mc = new ManagementClass("Win32_Processor"); ManagementObjectCollection moc = mc.GetInstances(); string strCpuID = null; foreach (ManagementObject mo in moc) { strCpuID = mo.Properties["ProcessorId"].Value.ToString(); break; } return strCpuID; }
2、獲取硬盤卷標(biāo)號
每個(gè)硬盤標(biāo)號出廠后都是獨(dú)立且唯一的
///<summary> /// 獲取硬盤卷標(biāo)號 ///</summary> ///<returns></returns> public static string GetDiskVolumeSerialNumber() { ManagementClass mc = new ManagementClass("win32_NetworkAdapterConfiguration"); ManagementObject disk = new ManagementObject("win32_logicaldisk.deviceid=\"c:\""); disk.Get(); return disk.GetPropertyValue("VolumeSerialNumber").ToString(); }
3、機(jī)器碼生成
根據(jù)CPU信息和硬盤標(biāo)號,生成獨(dú)立唯一的機(jī)器碼。
機(jī)器碼使用MD5加密,
///<summary> /// 生成機(jī)器碼 ///</summary> ///<returns></returns> public static string GetMNum() { string strNum = DES.DESEncrypt((DateTime.Now.ToString("MMdd") + Form1.DiskID+Form1.CpuID), "12345678", "87654321"); string strMNum = strNum.Substring(0, 24).ToUpper(); //截取前24位作為機(jī)器碼 return strMNum; }
3、 生成注冊碼
注冊碼保存使用MD5加密,
///<summary> /// 生成注冊碼 ///</summary> ///<returns></returns> public static string GetRNum() { SetIntCode(); string strMNum = GetMNum(); for (int i = 1; i < charCode.Length; i++) //存儲機(jī)器碼 { charCode[i] = Convert.ToChar(strMNum.Substring(i - 1, 1)); } for (int j = 1; j < intNumber.Length; j++) //改變ASCII碼值 { intNumber[j] = Convert.ToInt32(charCode[j]) + intCode[Convert.ToInt32(charCode[j])]; } string strAsciiName = ""; //注冊碼 for (int k = 1; k < intNumber.Length; k++) //生成注冊碼 { if ((intNumber[k] >= 48 && intNumber[k] <= 57) || (intNumber[k] >= 65 && intNumber[k] <= 90) || (intNumber[k] >= 97 && intNumber[k] <= 122)) //判斷如果在0-9、A-Z、a-z之間 { strAsciiName += Convert.ToChar(intNumber[k]).ToString(); } else if (intNumber[k] > 122) //判斷如果大于z { strAsciiName += Convert.ToChar(intNumber[k] - 10).ToString(); } else { strAsciiName += Convert.ToChar(intNumber[k] - 9).ToString(); } } return strAsciiName; }
四、工程說明
1、用戶軟件
軟件界面和封裝的類,各個(gè)功能全部都是源代碼,沒有使用DLL封裝
在開發(fā)用戶軟件過程,該界面功能作為子窗口集成到開發(fā)的軟件中即可。
2、后臺解密軟件
以上就是C#程序加密與解密的流程步驟的詳細(xì)內(nèi)容,更多關(guān)于C#程序加密與解密的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
WPF如何利用附加屬性修改ShowGridLines效果詳解
這篇文章主要給大家介紹了關(guān)于WPF如何利用附加屬性修改ShowGridLines效果的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起看看吧。2018-04-04利用AOP實(shí)現(xiàn)SqlSugar自動(dòng)事務(wù)
這篇文章主要為大家詳細(xì)介紹了利用AOP實(shí)現(xiàn)SqlSugar自動(dòng)事務(wù),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-10-10Unity實(shí)現(xiàn)3D循環(huán)滾動(dòng)效果
這篇文章主要為大家詳細(xì)介紹了Unity實(shí)現(xiàn)3D循環(huán)滾動(dòng)效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-02-02VS.net VSS時(shí),編譯報(bào)錯(cuò):未能向文件“.csproj.FileListAbsolute.txt”寫入命令行 對路
在VSS上把項(xiàng)目的Bin和Obj目錄刪除,然后重新取出項(xiàng)目,編譯成功。2009-06-06Unity實(shí)戰(zhàn)之制作動(dòng)畫編輯器
為了更方便地為UI視圖添加動(dòng)畫,將動(dòng)畫的編輯功能封裝在了UI View類中,可以通過編輯器快速的為視圖編輯動(dòng)畫。本文將通過Unity制作一個(gè)動(dòng)畫編輯器,需要的可以參考一下2022-02-02c# 模擬串口通信 SerialPort的實(shí)現(xiàn)示例
本文主要介紹了c# 模擬串口通信 SerialPort的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-05-05