詳解字符串加密技術(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)了解密功能。