【VBA研究】如何用Base64 編解碼方法實現簡單的加解密


Base64編碼的思想是是采用64個基本的ASCII碼字符對數據進行重新編碼,將數據變成字符串實現文本傳輸。由於編碼簡單,所以很容易實現,代碼也是現成的。利用這個編碼規則可以實現簡單的加解密。編解碼方法見: VB實現Base64 編解碼

我用VBA做了個簡單的系統,其中用到用戶登錄,自然要保存用戶名和密碼。密碼存放在數據庫中,不想明碼保存,於是就想到用這個編碼方法進行加密。Base64編碼是按照64個字符字典進行編碼的,為了加密,這64個字符可以打亂原來的順序,也可以用其他字符替換掉部分字符,如果不考慮解碼,這個字符字典中的字符甚至可以重復。比如密碼保存,只需比較密文,不需要還原成明文進行比較,那么字符字典中重復也是沒有問題的,可以任意取64個字符作為字典。

下面這個函數就可以用來生成密碼的密文,其中的數據字典是用個隨機函數隨意生成的:

Function B64Encode(sou_str As String) As String 'Base64 編碼
On Error GoTo over '排錯
Dim buf() As Byte, length As Long, mods As Long
Dim Str() As Byte, kk As Long, i As Long
'字符字典(用隨機產生的)
Const B64_CHAR_DICT = "Qx7mCcL2XsYm!Q^ZjKeLn#r2H4rV6B(Xu$v$zU2@CnHfVf7tH9XrBcB9WyA6F%Ah."

kk = Len(sou_str) - 1
ReDim Str(kk)
For i = 0 To kk
Str(i) = Asc(Mid(sou_str, i + 1, 1))
Next i

mods = (UBound(Str) + 1) Mod 3 '除以3的余數
length = UBound(Str) + 1 - mods
ReDim buf(length / 3 * 4 + IIf(mods <> 0, 4, 0) - 1)
For i = 0 To length - 1 Step 3
buf(i / 3 * 4) = (Str(i) And &HFC) / &H4
buf(i / 3 * 4 + 1) = (Str(i) And &H3) * &H10 + (Str(i + 1) And &HF0) / &H10
buf(i / 3 * 4 + 2) = (Str(i + 1) And &HF) * &H4 + (Str(i + 2) And &HC0) / &H40
buf(i / 3 * 4 + 3) = Str(i + 2) And &H3F
Next
If mods = 1 Then
buf(length / 3 * 4) = (Str(length) And &HFC) / &H4
buf(length / 3 * 4 + 1) = (Str(length) And &H3) * &H10
buf(length / 3 * 4 + 2) = 64
buf(length / 3 * 4 + 3) = 64
ElseIf mods = 2 Then
buf(length / 3 * 4) = (Str(length) And &HFC) / &H4
buf(length / 3 * 4 + 1) = (Str(length) And &H3) * &H10 + (Str(length + 1) And &HF0) / &H10
buf(length / 3 * 4 + 2) = (Str(length + 1) And &HF) * &H4
buf(length / 3 * 4 + 3) = 64
End If
For i = 0 To UBound(buf)
B64Encode = B64Encode + Mid(B64_CHAR_DICT, buf(i) + 1, 1)
Next
over:
End Function

'調用測試
Private Sub ttt()
aa = B64Encode("iamlaosong")
bb = B64Encode("iamlaosong")
MsgBox aa & " " & bb
End Sub
關於隨機字符串的產生,見:【VBA研究】生成隨機密碼
--------------------- 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM