VBGood网站全文搜索 Google

搜索VBGood全站网页(全文搜索)
首页 - 经验之谈 - 简易的矩陣加密編编码法
发表评论(0)作者:, 平台:, 阅读:12590, 日期:2000-03-12
簡易的矩陣加密編碼法(cipher)

當儲存一項機密的資料(譬如:密碼)於檔案中或是 Windows 的系統登錄區(registry)中,通常不希望被別人直接看到資料內容,於是就必須對該資料作加密編碼的處理後再儲存之,欲取用時唯有知道加密編碼演算法的人才能將編碼過的資料解碼成原始資料。已知最早的加密編碼法都是使用簡單的代換法,也就是所謂的移位密碼(shift cjphers),譬如 A 以 D 代換,B 以 E 代換,依此類推。但是移位密碼很容易被破解,只要多進行幾次反代換,或是分析字母出現的頻率,就可找出原始有意義之資料,改善的方法是使用隨機代換法,例如這次的 A 以 D代換,下次再遇到 A 就以 T 或任何其他字母來代換,要做到這種隨機代換功能必須要求亂數產生器能產生重複的亂數序列以作為解碼之用,在 VB 中要產生重複的亂數序列必須使用 Randomize Rnd(一個負數) 來初始化亂數產生器,關於隨機代換密碼法可參考 和碩出版的 "VB 5.0/6.0 程式設計聖經" 這本書的第十七章。另一種常見的加密編碼技巧是先求出每個字元的 ASCII 值,再將這些值作移位或 XOR 等處理,關於這種編碼方法可以參考 MS Press 出版的 "VB6.0 進階程式設計實務" 這本書的第十八章。


不知大家看過 "駭客任務(The Matrix)" 沒?前陣子跟同學去看這部片,看得一頭霧煞煞,很難看懂導演要表達什麼 @_@。這裡要介紹另一種編碼法就是跟 Matrix 有關,但是卻很容易懂,此法為 Hill 在 1926 年首度提出,本來我也不知道這種矩陣編碼法,後來是我的一個紐西蘭網友 Eileen 問我一個關於矩陣的問題才發現這種方法也能編碼,在這特別感謝 Eileen 激發我的靈感 :)。


假設 M 是一個可逆方陣(invertible square matrix),A是欲編碼之原始資料之 ASCII 值,則:


M×A=B


B 即為加密編碼後的資料,解碼的過程就是將 M 的逆矩陣 M-1 乘上 B 即可得到原始資料 A。


A=M-1×M×A=M-1×B


以一個實例來說明,假設:


M = 1 2

3 4


則利用本站的 Matrix Inversion including determinant calculation by Gauss-Jordan Elimination with maximization of pivot elements. 可以求出 M 的逆矩陣 M-1:


M-1 = -2 1

1.5 -0.5


若欲加密編碼之資料為 "book",利用 VB 的 AscW 函數可以求出其 ASCII 值為 98 111 111 107,現在將 M 乘上 A,由於必須符合矩陣乘法的原則,M 為 n×n,因此我們選定 A 為 n×1,這裡的 n=2。


M×A = 1 2 × 98 = 320 = B

3 4 111 738


M×A = 1 2 × 111 = 325 = B

3 4 107 761


320 738 325 761 即為加密編碼後之資料,欲反求得原始資料 A,只要將 M-1 乘上加密後之資料 B 即可。


M-1×B = -2 1 × 320 = 98 = A

1.5 -0.5 738 111


M-1×B = -2 1 × 325 = 111 = A

1.5 -0.5 761 107


再將求得的 98 111 111 107,以 ChrW 函數轉換後即可知原始資料為 "book"。


 


副程式:


Public Sub encode(strSource As String, M() As Double, dblCoded() As Double)

Dim i As Long, j As Long, n As Long, temp As Long, strM() As Double, strC() As Double

n = UBound(M, 2)

temp = Len(strSource) Mod n

strSource = strSource & String(IIf(temp = 0, 0, n - temp), " ")

ReDim strM(1 To n, 1 To 1) , strC(1 To n, 1 To 1) , dblCoded(1 To Len(strSource))

For i = 1 To Len(strSource)

If i Mod n = 0 Then

strM(n, 1) = AscW(Mid(strSource, i, 1))

Call MatrixMultiply(M, strM, strC)

For j = 1 To n

dblCoded(i + j - n) = strC(j, 1)

Next

Else

strM(i Mod n, 1) = AscW(Mid(strSource, i, 1))

End If

Next

End Sub


Public Sub decode(strSource As String, iM() As Double, dblCoded() As Double)

Dim i As Long, j As Long, n As Long, strM() As Double, strC() As Double

n = UBound(iM, 2)

ReDim strM(1 To n, 1 To 1) As Double, strC(1 To n, 1 To 1) As Double

For i = 1 To UBound(dblCoded, 1)

If i Mod n = 0 Then

strM(n, 1) = dblCoded(i)

Call MatrixMultiply(iM, strM, strC)

For j = 1 To n

strSource = strSource & ChrW(CLng(strC(j, 1)))

Next

Else

strM(i Mod n, 1) = dblCoded(i)

End If

Next

End Sub

其中 MatrixMultiply 這個副程式,請參閱本站的 矩陣的基本運算(加、減、乘、轉置、判斷是否對稱)


 


範例:


譬如欲將 "Visual Basic 實戰網" 這個字串加密編碼,分別以 2 階及 3 階方陣來處理,其程式碼以及輸出結果如下:


Private Sub Command1_Click()

Dim want() As Double, i, strWant As String

Dim M(1 To 2, 1 To 2) As Double, iM(1 To 2, 1 To 2) As Double

M(1, 1) = 1: M(1, 2) = 2: M(2, 1) = 3: M(2, 2) = 4

iM(1, 1) = -2: iM(1, 2) = 1: iM(2, 1) = 1.5: iM(2, 2) = -0.5

Call encode("Visual Basic 實戰網", M, want)

For i = 1 To UBound(want)

Debug.Print want(i);

Next

Call decode(strWant, iM, want)

Debug.Print vbCrLf; strWant

End Sub

296 678 349 813 313 723 164 360 327 751 303 711 47084 94200 89492 204120

Visual Basic 實戰網


Private Sub Command2_Click()

Dim want() As Double, i, strWant As String

Dim M(1 To 3, 1 To 3) As Double, iM(1 To 3, 1 To 3) As Double

M(1, 1) = 1: M(1, 2) = 2: M(1, 3) = 3: M(2, 1) = 4: M(2, 2) = 5

M(2, 3) = 6: M(3, 1) = 7: M(3, 2) = 8: M(3, 3) = 10

iM(1, 1) = -0.666666667: iM(1, 2) = -1.333333333: iM(1, 3) = 1

iM(2, 1) = -0.666666667: iM(2, 2) = 3.666666667: iM(2, 3) = -2

iM(3, 1) = 1: iM(3, 2) = -2: iM(3, 3) = 1

Call encode("Visual Basic 實戰網", M, want)

For i = 1 To UBound(want)

Debug.Print want(i);

Next

Call decode(strWant, iM, want)

Debug.Print vbCrLf; strWant

End Sub

641 1559 2592 635 1601 2675 455 1040 1722 622 1579 2635 122492 268574 439792 32338 129064 225822

Visual Basic 實戰網


綜上所述可知,可逆方陣 M 是這種編碼與解碼法的關鍵所在,M 的階數愈高,加密編碼後之資料就愈複雜,然而要指定一個可逆方陣 M 實屬不易,實用上可要求使用者輸入一密碼,利用這個密碼來求出可逆方陣 M。


此種方法其加密編碼後之資料皆為數字,若要增加其保密性,可將這些數字再做進一步處理,並用 ChrW 轉換成文字,但是必須注意轉換後之文字必須是可顯示的(displayable)、可列印的(printable),否則將無法儲存至檔案中。


這裡只是示範一種矩陣加密編碼技巧,若您需要完整的密碼應用程式,可以參考 MS Press 出版的 "VB6.0 進階程式設計實務" 這本書的第三十四章。