詳解字符串加密技術(shù)
字符串加密和解密技術(shù)主要提供是對(duì)數(shù)據(jù)串的,該技術(shù)可以擴(kuò)展應(yīng)用到數(shù)據(jù)庫(kù)數(shù)據(jù)加密(如口令庫(kù)表中內(nèi)容的加密)、網(wǎng)絡(luò)通訊中的數(shù)據(jù)包加密,甚至數(shù)據(jù)文檔的加密等。
字符串的加密主要采取以下幾個(gè)步驟:
1、 通過(guò)VB字符串處理函數(shù)把數(shù)據(jù)串進(jìn)行碼制轉(zhuǎn)化,對(duì)數(shù)據(jù)做基本變換。
2、?利用VB隨機(jī)函數(shù)產(chǎn)生一個(gè)隨機(jī)數(shù),這是本文所論述的技術(shù)的關(guān)鍵。利用隨機(jī)函數(shù)隨即產(chǎn)生的數(shù)據(jù),對(duì)數(shù)據(jù)進(jìn)行加密加密從而實(shí)現(xiàn)數(shù)據(jù)加密結(jié)果的隨機(jī)性。
3、?利用所產(chǎn)生的隨機(jī)數(shù)對(duì)碼制轉(zhuǎn)換后的字符串做“異或 運(yùn)算。
4、通過(guò)計(jì)算生成參數(shù)m和k,其中參數(shù)k由隨機(jī)數(shù)參與運(yùn)算所得到。
5、?把m和k作為參數(shù),從給定數(shù)據(jù)串中取密文。
主程序的實(shí)現(xiàn)
在按鈕中主要調(diào)用自定義加密函數(shù)和自定義解密函數(shù)把所輸入的字符串做五次加密和五次解密的結(jié)果顯示在列表框中,技術(shù)實(shí)現(xiàn)代碼如下:
Private Sub Commandl-Click()
Dim i As Long
Dim s As String
Di m mystr As String
mystr=(TextI.Text)
For i=1 To 5
s—=encode(mystr)
List1.AddItem S
s= decode(s)
I.ist2.AddItem S
Next
End Sub
在這里通過(guò)一個(gè)五次循環(huán),對(duì)字符串進(jìn)行五次加密和解密,五次加密的結(jié)果都是不一樣的,但五次解密后所生成的串 .都是原串,都是正確的。
加密技術(shù)的實(shí)現(xiàn),程序如下:
Private Function encode(ByVal S As String)As String’加密
If Len(s)=0 Then Exit Function
Dim buff()As Byte
buff—=StrConv(s,vbFromUnicode)‘轉(zhuǎn)化成Unicode碼
Dim i As Long
Dim j As Byte
Dim k As Byte,m As Byte
Dim mstr As String :
M str=?"!@ # $% 8L*()?> < + ~ ,.;’:ABCDEFGHI—JKLMNOPQRSTUVW XYZO123456789abcdefghijklmnopqrstuvwxyz” ‘定義密文,用來(lái)作為加密后所顯示的字符 ;
Dim OUtS As String
i= UBound(buff)+ 1
OUtS=Space(2*i)‘定義字符變量并做初始化
Dim temps As String l
For i=0 To UBo und(buff)
Randomize Time‘隨機(jī)函數(shù)初始化?j= CByte(5*(Math.Rnd())+ O)’最大產(chǎn)生的隨機(jī)數(shù)只能是5,不能再大了,再大的話,就要多用一個(gè)字節(jié)
buf(i)=buff(i)Xor j‘利用隨機(jī)數(shù)做異或運(yùn)算
k= buff(i)Mod Len(mstr)‘求余數(shù)k(tt成參數(shù)K)
m =buff(i) Len(mstr)‘求商m(tt成參數(shù)m)
m —=m * 2 3+ j‘進(jìn)一步對(duì)m做處理temps— Mid(mstr,k+ 1,1)+ Mid(mstr,m + 1,1)’把k和m作為參數(shù)從mstr中去密文
Mid(outs,2*i+ 1。2)=temps‘把所取到的密文存放在outs中
Next
encode—outs‘把加密后結(jié)果送給函數(shù)
End Function
在這里主要實(shí)現(xiàn)對(duì)字符串的加密。首先通過(guò)主程序把要加密的字符串傳過(guò)來(lái),通過(guò)VB函數(shù)把字符串進(jìn)行碼制轉(zhuǎn)換,并存放在buff可變數(shù)組(緩沖區(qū))中。Mstr是一個(gè)密文字符串。是加密后所顯示的所有字符,這是編者指定的。用戶可以自己指定。也可以設(shè)計(jì)文本框輸入。這樣就可以指定密文所使用的字符,也可以說(shuō)是指定私人密鑰,解密時(shí)。只有指定同樣的字符申(或者說(shuō)只有擁有這個(gè)私人密鑰)才可以解密。另外,J是由VB隨機(jī)函數(shù)所生成的數(shù)字,是隨機(jī)的。J的隨機(jī)性,致使加密結(jié)果是隨機(jī)的。利用J和buff中碼制轉(zhuǎn)換后的數(shù)據(jù)做一次異或運(yùn)算,并由運(yùn)算后結(jié)果求余數(shù)和商進(jìn)而得到參數(shù)k和m.并把n 利用J做進(jìn)一步處理。得到k和m后,利用這兩個(gè)參數(shù)從mstr密文串中取出密文字符,作為加密后的密文。
解密技術(shù)的實(shí)現(xiàn),程序如下:
Private Function decode(ByVal S As String)As String ’解密,S中傳遞加密后的密文
On Error GoTo myERR
Dim i As Long
Dim j As Byte
Di m k As Byte
Di m m As Byte
Di m mstr As String
Mstr="!@ # $% 8L*()?> < + ~ ,.f’:ABCDEFGHI—JKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz"
Dim tl As String,t2 As String
Dim buff()As Byte
Dim n As Long
n =0
For i=1 To Len(s)Step 2‘每次處理兩個(gè)字符
tl=Mid(s,i,1)‘取第i個(gè)字符
t2=Mid(s,i+ 1,1)‘取第i+1個(gè)字符
k= InStr(1,mstr,t1)一1’判斷字符在mstr中的位置
m =InStr(1,mstr。t2)一1’判斷字符在mstr中的位置
j= m 2 3‘求商j(tk成參數(shù)j)
m = m— j*2 3‘求余數(shù)m(tt成參數(shù)m)
ReDim Preserve buff(n)
buff(n)=j*Len(mstr)+ k‘利用余數(shù)做異或運(yùn)算,
buff(n)=buff(n)Xor m 生成原字符的Unicode碼(兩次異或運(yùn)算恢復(fù)原樣)
n = n + 1
Next
decode= StrConv(buff,vbUnicode)‘轉(zhuǎn)換成加密前的原始字符
Exit Function
myERR:
decode=" "
End Function
該函數(shù)的算法是對(duì)加密算法的逆過(guò)程,從密文串成對(duì)取密文字符。判斷密文字符在mstr中的位置。取出參數(shù)k和m。對(duì)m求出商和余數(shù),利用余數(shù)再次做異或運(yùn)算。從而得到加密前的原字符,既實(shí)現(xiàn)了解密功能。



