簡易的矩陣加密編碼法(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[1] [2] 下一页
|