基于硬盤序列號和RSA加密算法的軟件加密方法
軟件作為計(jì)算機(jī)的重要組成部分,隨著計(jì)算機(jī)的普及,已滲入生活的各個(gè)角落。由于計(jì)算機(jī)軟件易于復(fù)制,導(dǎo)致了盜版軟件的泛濫,所以軟件開發(fā)者有必要加強(qiáng)自我保護(hù)意識,對自己編寫的軟件進(jìn)行加密保護(hù),防止或盡量減少被盜版的可能性。下面我們就針對這個(gè)問題提出了一種簡便易行的對正版軟件進(jìn)行加密的方法,保護(hù)軟件開發(fā)者的合法利益。
一、軟件加密保護(hù)方案
軟件加密方法大致分為兩大類:硬加密方法和軟加密方法。
硬加密方法是指利用軟件結(jié)合特定的硬件來實(shí)現(xiàn)軟件的加密,典型的硬加密產(chǎn)品有加密卡、指紋認(rèn)證和軟件狗等;
軟加密方法是指僅使用軟件方法加密,主要加密方式有序列號保護(hù)、警告窗口、時(shí)間限制、KeyFile保護(hù)、功能限制等。目前,一些大型軟件通常是采用綜合軟加密和硬加密兩種方法來實(shí)現(xiàn)軟件的保護(hù),而一些中小型軟件受制于資金等條件,一般只采用軟加密方法,如序列號保護(hù)機(jī)制等,這使得中小型軟件加密的可靠性和安全性大大降低。
我們知道不同計(jì)算機(jī)的硬盤序列號不相同,如果讀取軟件所裝的計(jì)算機(jī)的硬盤序列號作為軟件加密的特征值,那么即使序列號保護(hù)機(jī)制中的“用戶名”和“序列號”均被盜用,那么在別的計(jì)算機(jī)上也不能成功注冊使用軟件,從而使得軟件加密的安全性大大提高。但是,如果軟件加密保護(hù)采用的是簡單的對稱加密算法,一旦算法被攻破或采用的是何種算法被盜版者猜出,盜版者就可以根據(jù)算法寫出加密機(jī)和注冊機(jī),這個(gè)缺點(diǎn)使其加密的安全性和可靠性大打折扣。
因此,我們提出了一種基于硬盤序列號和RSA加密算法的軟件加密方法,將硬盤序列號所具有的唯一性和不可變性,同RSA加密算法的安全性結(jié)合起來應(yīng)用于軟件的加密,即不會不增加軟件保護(hù)成本,又提高了軟件加密的安全性,保護(hù)了軟件開發(fā)者的知識產(chǎn)權(quán)。
二、硬盤序列號
通過CPUID、分區(qū)卷標(biāo)、硬盤大小、網(wǎng)卡MAC地址等信息均可以將任意兩臺計(jì)算機(jī)區(qū)分出來。但是這些信息中有的是不可靠的,例如分區(qū)卷標(biāo)僅與軟件系統(tǒng)有關(guān),是一種不穩(wěn)定的信息;有的是無法得到的,例如當(dāng)機(jī)器中沒有網(wǎng)卡或早于PentiumⅢ型號的CPU,就得不到網(wǎng)卡MAC地址或CPUID等信息。
而硬盤的序列號存在于硬盤的控制芯片內(nèi),不能用常規(guī)辦法修改,是在出廠前由生產(chǎn)廠家設(shè)定的,像硬盤的物理柱面數(shù)、扇區(qū)數(shù)一樣,具有與操作系統(tǒng)無關(guān)的特性,不會隨著硬盤的分區(qū)、格式化狀態(tài)而改變。硬盤序列號與將硬盤格式化成FAT或FAT32后在分區(qū)引導(dǎo)扇區(qū)自動生成的卷序列號根本的區(qū)別是硬盤序列號是物理存在的,而每次格式化產(chǎn)生的序列號是不同的,其實(shí)質(zhì)是一種邏輯上的號碼,并且可以手工修改。由于硬盤序列號具有唯一性、不可變性、穩(wěn)定性等優(yōu)點(diǎn),因此本文選擇硬盤序列號作加密特征值。
三、RSA加密算法原理
由Rivest、Shmair和Adlernan三人研究發(fā)明的RSA加密算法,屬于非對稱密鑰加密算法,這種加密算法最主要特點(diǎn)就是加密和解密使用不同的密鑰。RSA加密算法利用兩個(gè)很大的質(zhì)數(shù)相乘所產(chǎn)生的乘積來進(jìn)行加密,兩個(gè)質(zhì)數(shù)無論那一個(gè)與原文件編碼相乘對文件加密后,均可由另一個(gè)質(zhì)數(shù)再與原文件編碼相乘來進(jìn)行解密。它的算法大致步驟如下:
1)取兩個(gè)相近的大素?cái)?shù)p、q;
2)計(jì)算n=p*q,z=(p-1)*(q-1);
3)任取一個(gè)與z互素的整數(shù)e;
4)計(jì)算滿足e*dmodz=1的整數(shù)d;
5)若用整數(shù)m表示明文,整數(shù)c表示密文(m,c均小于n),加密、解密過程如下:
加密:c=memodn
解密:m=cdmodn
6)(n,e)和(n,d)分別稱為“公開密鑰”和“秘密密鑰”。根據(jù)Euler定理可得:
m=cddmodn=(memodn)dmodn=m
四、設(shè)計(jì)流程與程序的具體實(shí)現(xiàn)
1、設(shè)計(jì)流程
基于硬盤序列號和RSA加密算法的軟件加密流程如圖1所示,按如下三個(gè)步驟進(jìn)行:

1)軟件使用方在安裝軟件的過程中,點(diǎn)擊“注冊”按鈕后,程序會自動讀取軟件使用方PC機(jī)的硬盤序列號diskID并顯示在文本框中,同時(shí)按默認(rèn)路徑自動搜索認(rèn)證文件。若認(rèn)證文件存在,則程序自動進(jìn)行步驟(3)中的解密判斷注過程;若不存在,則提示軟件使用方將硬盤序列號diskID通過e_mail發(fā)送給軟件開發(fā)方;
2)軟件開發(fā)方將硬盤序列號diskID逆序后得到的m經(jīng)RSA加密后得到序列號c,將序列號c寫入認(rèn)證文件,并將認(rèn)證文件和認(rèn)證文件的指定存儲路徑通過email發(fā)送給客戶;
3)軟件使用方將認(rèn)證文件按指定路徑保存后點(diǎn)擊“下一步”按鈕,程序讀取認(rèn)證文件中的序列號c進(jìn)行解密,得到m,再將m逆序后得到diskID1。然后比較diskID1和用戶得到、提供給軟件開發(fā)方的diskID,如果兩者相等,則認(rèn)為是正版軟件,顯示“注冊成功”。否則認(rèn)為是盜版軟件,退出注冊界面。
2、程序的具體實(shí)現(xiàn)
(1)硬盤序列號的讀取
讀取硬盤序列號程序使用了第三方開發(fā)的DiskID32.dll動態(tài)鏈接庫,使操作簡單易行,降低了程序編寫難度,縮短了開發(fā)周期。
ghDiskID=LoadLibrary("DiskID32.dll");//動態(tài)加載DLL
diskIDFunc=(DISKID32)GetProcAddress(ghDiskID,"DiskID32");//獲取DiskID32.dll的導(dǎo)出函數(shù)
diskIDFunc(factory,diskID);//得到硬盤序列號diskID
(2)RSA加密算法的加密、解密過程
RSA加密算法的加密、解密過程使用了Miracl4.82大數(shù)運(yùn)算庫。(Miracl全稱為Multipreci-sionIntegerandRationalArithmeticC/C++Library,即多精度整數(shù)和有理數(shù)算術(shù)運(yùn)算C/C++庫。它是一個(gè)大數(shù)庫,實(shí)現(xiàn)了設(shè)計(jì)使用大數(shù)的加密計(jì)數(shù)的最基本的函數(shù),提供了C和C++兩種接口,使用方便,速度相當(dāng)令人滿意,并且是開源的。)
在使用Miracl4.82大數(shù)運(yùn)算庫時(shí),要將Miracl大數(shù)運(yùn)算庫的miracl.h、mirdef.h和ms32.lib添加到工程后就可以調(diào)用Miracl大數(shù)運(yùn)算庫提供的powmod()等函數(shù)進(jìn)行加密、解密。Miracl是C庫,要在頭文件見中添加以下程序:
extern"C"
{
#include"miracl.h"#include"mirdef.h"
}
#pragmacomment(lib,"ms32.lib")
加密、解密的主要參數(shù)取值:
P(HEX)=E34436F5F48A227
BQ(HEX)=A92FA24467C4E3E3
N(HEX)=963251DC5A9C90D9F203A03C363BA411
D(HEX)=56157D29A89D77BF2F669A8F0B123CC9
E(HEX)=10001
加密、解密都使用ms32.lib中的powmod()函數(shù)。
powmod(m,e,n,c);//計(jì)算c=memodn
powmod(c,d,n,m);//計(jì)算m=cdmodn
3、認(rèn)證文件的讀寫
將硬盤序列號逆序后經(jīng)RSA加密得到的序列號c寫入認(rèn)證文件,編譯運(yùn)行程序后得到認(rèn)證文件,并將存儲路徑一并通過email發(fā)送給軟件使用者。
CFilefile;
file.Open("renzhengwenjian.exe",CFile::modeCreate|CFile::modeWrite);
sYouStructtmpRcd;
ZeroMemory(&tmpRcd,sizeof(sYouStruct));
CStringstr="c";//寫入硬盤序列號逆序后經(jīng)RSA加密后得到的序列號clstrcpyn(tmpRcd.strYou,(LPCTSTR)str,40);
file.Write(&tmpRcd,sizeof(sYouStruct));
file.Close();
程序在用戶點(diǎn)擊“下一步”按鈕后,讀取軟件使用者按指定位置存儲的認(rèn)證文件中的序列號c。
CFile file;
file.Open("C:\\WINDOWS\\system32\\1025\\renzhengwenjian.exe",CFile::modeRead)
;sYouStructtmpRcd;
ZeroMemory(&tmpRcd,sizeof(tmpRcd));
file.Read(&tmpRcd,sizeof(tmpRcd));
CStringstr=tmpRcd.strYou;file.Close();
本文采用了硬盤序列號作為RSA加密算法的特征值,加密產(chǎn)生的序列號寫入的認(rèn)證文件與硬盤序列號一一對應(yīng),在不需增加新的硬件和軟件加密保護(hù)成本的前提下,具備了一定硬件加密的優(yōu)點(diǎn),確保了軟件加密的可靠性,有效地防止了非法拷貝和破解。本例的程序已在VC++6.0環(huán)境下調(diào)試通過并在一些小型軟件加密中得到應(yīng)用。在軟件加密保護(hù)的開發(fā)過程中,軟件開發(fā)者還可以通過改變加密算法、限制注冊次數(shù)等方法,進(jìn)一步增強(qiáng)軟件加密的可靠性,最大程度的防止盜版的發(fā)生,保護(hù)軟件開發(fā)者的知識產(chǎn)權(quán)。
小知識之軟件加密
軟件加密就是用戶在發(fā)送信息前,先調(diào)用信息安全模塊對信息進(jìn)行加密,然后發(fā)送,到達(dá)接收方后,由用戶使用相應(yīng)的解密軟件進(jìn)行解密并還原。采用軟件加密方式有以下優(yōu)點(diǎn):已經(jīng)存在標(biāo)準(zhǔn)的安全API(Application Programming Interface,應(yīng)用程序編程接口)產(chǎn)品、實(shí)現(xiàn)方便、兼容性好。










