C#實現無法破解的軟體註冊碼演算法
Microsoft .Net的應用程式的程式碼檔案,與Java生成的檔案類似,它們都沒有原生程式碼,而是一種類似於彙編的程式碼。這樣,只要有合適的工具,就可以完整的把別人寫出來的程式反編譯成自己需要的程式檔案。
我所知道的.Net下的反彙編程式是Salamander 和 Refelector 兩個工具,他們都可以對.Net的程式集反編譯成你需要的語言。
那麼,我們寫的程式,做的專案,如何進行正版的許可證管理,有許多方法。
最好的方案,是幾個方法的綜合。下面我說一下單獨的許可驗證方法。
最簡單的方法,就是使用許可儲存。方法是使用者輸入正版的註冊碼,通過程式中專門的演算法程式進行驗算,得出的結果與事先儲存在程式中的結果比對,比對一致表示輸入正確。然後把結果儲存在儲存中,如登錄檔或者專門的許可檔案中,程式許可通過。
這個方法使用的人/公司最多,但是缺點也是最多的,只要使用上面的工具把驗算註冊碼的演算法給弄清楚,就可以自己寫一個生成序列號的序號產生器,這個註冊方法就形同虛設了。
還有一個比較好的方法,就是仿照WindowsXP的啟用機制,客戶的程式自動訪問網際網路的一個專門設定的伺服器,通過Tcp/Ip或者WebService遠端訪問伺服器上的許可程式,許可後把結果儲存在客戶端計算機上。這個方法的好處是許可驗證程式碼儲存在開發者控制的計算機上,客戶端無法獲取驗證演算法,而且可以通過資料庫管理使用者,非常方便。
但是這個方法也有缺點,首先是可靠的Internet連線。如果要防止使用者使用盜版,則必須在客戶端的程式中新增一個隨機訪問遠端許可伺服器驗證的功能,這樣不但需要一個24小時的Internet連線,而且經常進行驗證也會干擾程式的正常執行。還有就是如果有人通過研究客戶端的接收返回資訊的程式碼,弄一個虛擬的驗證伺服器,這個功能也會完蛋。
那麼,所有的焦點都聚集在客戶端的驗證演算法上,只要這個客戶端的驗證演算法被人弄清楚了,整個程式的許可可以說就不存在了,所以許多開發者/開發公司費好大的力氣,弄一個足夠複雜的驗證演算法出來,用演算法的複雜度來抵抗破解。但是再複雜的演算法,只要有人寫得出來,就有人能破解得出來,這個道理我想大家都明白。
那是否有加密演算法與解密演算法不同的辦法呢?有。而且.Net自帶的類庫裡面就有這個演算法。
這個演算法的原理是不對稱加密的原理。不對稱加密原理大家基本上都瞭解。加密的密碼(金鑰)分為兩個部分,公鑰和私鑰。通過私鑰加密的密文只能通過公鑰解密。根據這個特性,我們可以發現只要開發者儲存好私鑰,即使演算法程式碼被客戶端破解,因客戶端不知道儲存在開發者處的私鑰,也無法生成註冊碼。
這個演算法就是 System.Security.Cryptography 名稱空間的 RSAPKCS1SignatureFormatter 類(用來生成註冊碼)和 RSAPKCS1SignatureDeformatter 類(用來在客戶端驗證註冊碼)。驗證過程如下:
首先,需要生成一個公鑰和私鑰對,當然,依靠人是無法生成的,我們可以通過 System.Security.Cryptography 名稱空間的RSACryptoServiceProvider 類來生成公鑰/私鑰對。
using(RSACryptoServiceProvider rsa = new RSACryptoServiceProvider())
{
// 公鑰
string pubkey = rsa.ToXmlString(false);
// 私鑰
string prikey = rsa.ToXmlString(true);
}
獲取私鑰以後,可以用 RSAPKCS1SignatureFormatter 類來生成註冊碼,程式碼如下(引用名稱空間略)
using(RSACryptoServiceProvider rsa = new RSACryptoServiceProvider())
{
rsa.FromXmlString(prikey);;
// 加密物件
RSAPKCS1SignatureFormatter f = new RSAPKCS1SignatureFormatter(rsa);
f.SetHashAlgorithm("SHA1");
byte[] source = System.Text.ASCIIEncoding.ASCII.GetBytes(txtIn.Text);
SHA1Managed sha = new SHA1Managed();
byte[] result = sha.ComputeHash(source);
byte[] b = f.CreateSignature(result);
msg.Text = Convert.ToBase64String(b);
}
上面的程式碼是一個示例aspx頁面的程式碼,頁面包括一個id為msg的Label控制元件,一個ID為txtIn的TextBox控制元件,一個ID為btnOK的Button控制元件,上面的程式碼就是btnOK的事件處理程式的內容。大家可以非常清楚的看出處理流程,生成一個RsaCryptoServiceProvider類例項,然後把這個類例項的加密金鑰指定為包含私鑰的prikey字串因為加密解密的公鑰/私鑰必須是對應的。然後獲取txtIn輸入的內容,生成金鑰後在msg控制元件上顯示。
下面是使用 RSAPKCS1SignatureDeformatter 類來驗證輸入:
using(RSACryptoServiceProvider rsa = new RSACryptoServiceProvider())
{
rsa.FromXmlString(pubkey);
RSAPKCS1SignatureDeformatter f = new RSAPKCS1SignatureDeformatter(rsa);
f.SetHashAlgorithm("SHA1");
byte[] key = Convert.FromBase64String(txtKey.Text);
SHA1Managed sha = new SHA1Managed();
byte[] name = sha.ComputeHash(ASCIIEncoding.ASCII.GetBytes(txtIn.Text));
if(f.VerifySignature(name,key))
msg.Text = "驗證成功";
else
msg.Text = "不成功";
}
上面的程式碼也很好理解,就是多了一個ID為txtKey的TextBox控制元件,他通過同時獲取使用者名稱/加密金鑰進行驗證。重點是RSA類的FromXmlString()方法,注意上面的這個方法獲取的是公鑰,表示這段驗證程式碼是儲存在客戶端的,客戶端程式碼是沒有私鑰的,即使有人把程式集的程式碼反編譯了也沒有用。
上面兩段程式碼需要注意的就是生成的公鑰/私鑰必須匹配,我使用RSA物件生成金鑰對後儲存成為字串常量,就可以解決這個問題。
上面這個方法仍然無法解決客戶使用ildasm反編譯後暴力修改IL程式碼,只有靠可靠的強名稱以及數字證照來保證程式集不被修改了。
相關文章
- C#基於RSA加密演算法實現軟體註冊實戰演練C#加密演算法
- 菜鳥破解之軟體自己顯示註冊碼
- 財智證券結算軟體2.5 破解註冊碼分析!使用ollydbg 破解註冊動畫!高手莫入! (1千字)動畫
- 共享軟體中註冊部分的簡單實現(轉)
- 給自己的軟體製作註冊碼
- Pycharm安裝破解 註冊碼PyCharm
- idea啟用,使用破解補丁無需註冊碼Idea
- eXeScope V6.41 的註冊演算法破解演算法
- c#實現的破解程式--針對軟體使用時間限制C#
- 利用硬體資訊實現共享軟體的安全註冊 (4千字)
- c# winform實現dll載入時註冊C#ORM
- SecureCRT8.0 註冊破解及軟體 安裝教程 火推Securecrt
- 某穿牆輔助的註冊碼破解
- 第七章-尋找軟體的註冊碼
- 《TxEdit 4.6》的註冊碼破解 (11千字)
- 一個軟體的MD5註冊演算法【原創】演算法
- HPUX 監聽無法動態註冊UX
- 實現類的註冊方法
- XX解霸3000(共享版)註冊碼破解實錄
- Instant Source 註冊演算法分析+註冊器原始碼演算法原始碼
- 一種非明碼比較程式的註冊------NS-SHAFT註冊碼破解 (9千字)
- 輕鬆解決國內無法【註冊ChatGPT】,快速【體驗ChatGPT】ChatGPT
- Tower 最新註冊碼 Tower 破解下載
- Regediter 1.3 破解(得到註冊碼) (9千字)
- WIN下動態註冊碼實現方法 (轉)
- 【標題:Tag&Rename 1.7 文章二 :此軟體的註冊碼演算法。( 進來看看 8^) )】演算法
- C#機房重構之註冊窗體C#
- 註冊中心 Eureka 原始碼解析 —— 應用例項註冊發現(一)之註冊原始碼
- C#:註冊元件 (cmd)C#元件
- C#中使用CAS實現無鎖演算法C#演算法
- 奇門遁甲演義V6.3破解手記--註冊碼演算法分析演算法
- IconToy 3.1 註冊碼快速破解 (11千字)
- BabyGame 破解方法及註冊碼錶 (1千字)GAM
- winimp1.11註冊碼破解 (2千字)
- 快捷反垃圾郵件破解手記--找出註冊碼
- 好用的HTML處理工具:BBEdit 註冊碼破解版最新HTML
- i-view32註冊碼的破解手記 (778字)View
- Cute FTP Ver 4.0 build 19 的註冊碼破解 (820字)FTPUI