📄 form1.frm
字号:
VERSION 5.00
Begin VB.Form Form1
Caption = "Visual Basic - 简易的矩阵加密编码法(cipher)"
ClientHeight = 2730
ClientLeft = 1950
ClientTop = 1710
ClientWidth = 5280
LinkTopic = "Form1"
ScaleHeight = 2730
ScaleWidth = 5280
Begin VB.CommandButton Command2
Caption = "使用 3×3 矩阵来加密编码"
Height = 588
Left = 1392
TabIndex = 1
Top = 1392
Width = 2388
End
Begin VB.CommandButton Command1
Caption = "使用 2×2 矩阵来加密编码"
Height = 588
Left = 1416
TabIndex = 0
Top = 576
Width = 2388
End
End
Attribute VB_Name = "Form1"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = True
Attribute VB_Exposed = False
'1.程式名称:简易的矩阵加密编码法(cipher)
'2.开发日期:08/03/2005
'3.开发环境:Visual Basic 6.0 中文专业版 + SP3
'4.作者姓名:刘亮
'5.作者信箱:yjypm@eyou.com
Option Explicit
Private Sub Command1_Click()
'M 是用来将字串 "编码" 的矩阵 ,可以任意指定矩阵中的元素, 但是必须是一个n×n的可逆方阵(invertible square matrix),这里只简单的以2×2的方阵来表示
'iM 是用来将字串 "解码" 的矩阵, iM 是 M 的逆矩阵, 不可任意指定 iM 中的元素 , 因此 M 改变后 , 必须用逆矩阵的演算法求出 iM
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
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) As Double, strC(1 To n, 1 To 1) As Double, 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
Public Sub MatrixMultiply(M() As Double, n() As Double, ReturnValue() As Double)
Dim i As Long, j As Long, k As Long, row As Long, column As Long, max As Long
row = UBound(M, 1)
column = UBound(n, 2)
max = UBound(M, 2)
ReDim ReturnValue(1 To row, 1 To column)
For i = 1 To row
For j = 1 To column
For k = 1 To max
ReturnValue(i, j) = ReturnValue(i, j) + M(i, k) * n(k, j)
Next
Next
Next
End Sub
Private Sub Command2_Click()
'M 是用来将字串 "编码" 的矩阵 ,可以任意指定矩阵中的元素, 但是必须是一个n×n的可逆方阵(invertible square matrix),这里只简单的以2×2的方阵来表示
'iM 是用来将字串 "解码" 的矩阵, iM 是 M 的逆矩阵, 不可任意指定 iM 中的元素 , 因此 M 改变后 , 必须用逆矩阵的演算法求出 iM
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
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -