| 网站首页 | JAVA文章 | AppServers | Web开发 | 应用开发 | 资源下载 | 论坛
    想学好编程,学好外语很重要  [enadd  2006年12月25日]        
设为首页 加入收藏 联系站长
您现在的位置: 编程笔记网 >> 应用开发 >> vb >> VB加密 >> 文章正文
簡易的矩陣加密編碼法(cipher)            【字体:
簡易的矩陣加密編碼法(cipher)
作者:未知    文章来源:-    点击数:    更新时间:2006-8-9

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

文章录入:enadd    责任编辑:enadd 
  • 上一篇文章:

  • 下一篇文章: 没有了
  • 发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
    最新热点 最新推荐 相关文章
  • 用VB编写DirectX7.0游戏(下…

  • 用VB编写DirectX7.0游戏(上…

  • 使用OLE DB和ADO调用返回记录…

  • 使用VB调用Oracle程序包内的…

  • VB中用ADO对象动态创建数据库…

  • fffff

  • 如何用MSComm Control传Bina…

  • MultiLink的WinSock Server程…

  • 用VB制作浏览器

  • 用VB编写网络寻呼机

  •   网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)
    | 设为首页 | 加入收藏 | 联系站长 | 友情链接 | 版权申明 | 管理登录 |