軟件敏感信息如何加密
在C++Builder程序開發(fā)中,大量使用圖像按鈕,將程序需要隱藏的信息對應(yīng)于這些按鈕圖像,能夠起到信息隱藏的作用。為此我們提出了一種分散隱藏策略,建立了要隱藏的信息與多個按鈕圖像像素點顏色值之間的一一映射關(guān)系。分散隱藏的索引數(shù)據(jù)使用另外一個Bitmap圖像來保存,增加了隱藏信息被破解的難度。
一、文字信息預(yù)處理
在C++Builder中,文字的數(shù)據(jù)類型為AnsiString,對任意一段文字text,使用下述語句轉(zhuǎn)換成字節(jié)數(shù)組。
int len = text.Length();
int count=2*len+l;
char* array - new char [count];
BYTE* byt:es=new BYTE [count];
strcpy(array,text.c_str());
for (int i=O;i
{
bytes[i]=(BYTE)array[i];
)
在C++Builder中,BYTE定義為無符號字符型(Lmsigned char),取值區(qū)間為0~255,正好對應(yīng)于顏色RGB值的分量取值范圍。
為了加強保密強度,可以對字節(jié)數(shù)組bytes做進一步的變換。
二、TBitBtn圖像分析
在C++Builder程序開發(fā)中,為了使軟件界而更加友好,大量使用按鈕、特別是圖像按鈕。圖形按鈕是一個TBitBtn類型的VCL控件,帶有文字和圖像,圖像一般足32×16的Bitmap圖像。
圖像上每個像素點的顏色color用三個無符號整數(shù)r、g、b來表示,color=RGB(r,g,b),因此,可以在圖像顏色與字節(jié)數(shù)組之問建立一一映射,這樣,就可以將要隱藏的信息保存在圖像中。
需要注意的是,TBitBtn控件上的圖像是透明的圖像,假設(shè)透明顏色為color0,則建立一一映射時應(yīng)避開這些透明像素點。
TBitBtn的圖像足一個32×16的Bitmap圖像,實際上是兩個16×16的Bitmap圖像的合成。左邊的圖像用于正常顯示;右邊的圖像用于在按鈕處于不可使用情況下顯示,在一般情況下不顯示。因此,在字節(jié)數(shù)組與右邊小圖像之間建立一一映射關(guān)系可以使信息隱藏更具有隱蔽性。
三、分散隱藏策略
假設(shè)程序中使用了N個TBitBtn按鈕,另有N個TBitBtn按鈕備用,N=N+N。使用下面的方法在字節(jié)數(shù)組bytes與按鈕圖像之間建立一一映射關(guān)系。
定義三個整型數(shù)組A[count]、B[count]、C[count],其中:A[i]表示bytes[i]所對應(yīng)的圖像按鈕的編號;B[i]表示bytes[i]所對應(yīng)的按鈕圖像的像素點編號;C[i]表示像素點顏色分量編號,1為R分量,2為G分量,3為B分量。
分散隱藏算法如下:
(1)對i=0劍count-1進行循環(huán);
(2)在O~N-I之間產(chǎn)生一個均勻分布的偽隨機數(shù)a,令A(yù)[i]=a;C[i]=0;
(3)對j=0到255進行循環(huán);
(4)取得第a個按鈕圖像的第j個像素點的顏色color,如果color=color0,則j++轉(zhuǎn)下一個j循環(huán);
(5)提取顏色分量r、g、b,
如果r=bYtes[i], B[i]=j,C[i]=1;
如果g=bYtes[i],B[i]=j,C[i]=2;
如果b=bYtes[i],B[i]=j,C[i]=3;
如果C[i]=0,則j++轉(zhuǎn)下一個j循環(huán);
(6)當(dāng)j循環(huán)結(jié)束時C[i]=O,則轉(zhuǎn)第(2)步;否則進入下一個i循環(huán)。
備用按鈕的圖像每個像素點的顏色依次用RGB(O,l,2)、RGB(3,4,5)等構(gòu)成,目的是使字節(jié)數(shù)組中每個字節(jié)都能找到對應(yīng)值,只要備用按鈕個數(shù)足夠多,這個假設(shè)一定成立。
為了增加隱蔽性,備用按鈕的Visible屬性應(yīng)設(shè)置為不可見(false)。
四、索引信息的加密隱藏
為了在軟件運行過程中恢復(fù)隱藏的信息,上述加密算法產(chǎn)生的數(shù)組A[i]、B[i]、C[i]需要保存在軟件源代碼中。
可以直接在程序源代碼中定義三個整型數(shù)組,但是保密性不好。我們?nèi)匀皇褂肂itmap圖像末保存這三個數(shù)組。
一個正整數(shù)可以用一個DWORD型變量來表示,而DWORD型變量可以對應(yīng)于一個RGB顏色值,因此,N及數(shù)組A可以用N+1個顏色值來表示。而數(shù)組B和C的每個元素值小于256,故可以將每個B[i]和c[i]與一個顏色值相對應(yīng),將B[i]和C[i]分別對應(yīng)于顏色值的R和G分量(B分量末使用)。于是,保存這三個數(shù)組以供需要2N+1個顏色值。
令M是滿足M2>2N+1的最小整數(shù),定義一個MxM的Bitmap圖像,使用下而的算法將數(shù)組A[i]、B[i]、C[i]寫入該圖像。
(l)k=-l;
(2)對i=0到M-I,執(zhí)行i循環(huán);
(3)對j=0劍M-I,執(zhí)行j循環(huán);
(4)如果k=-l,則:
Pixels[i][j]=N
k++,執(zhí)行下一個j循環(huán);
(5)如k>0果且kN且k<2N,則
Pixels[i][j]=RGB(B[k-N],C[k-N],O)
(7)如果k>2N,則算法結(jié)束。
在上面的算法中,Pixels[i][j]=color表示將圖像的第i行j列的像素點的顏色值設(shè)置為color。另一個函數(shù)RGB(r,g,b)表示R分量、G分量、B分量的值分別為r、g、b的顏色值。在C++Builder中祠5可以找劍相對應(yīng)的函數(shù)Pixels和RGB。
小知識之ANSIChar
它是一種超長字符串類型。
這種字符串的內(nèi)存動態(tài)分配,引用計數(shù),并使用了更新前拷貝(copy--on-write)技術(shù),存儲于堆空間,長度沒有限制(可以存儲多達20億個字符?。?。其字符類型也是ANSIChar 類型。









