一种好玩的字符串随机加解密方法

Photo by Jason Thompson

最近翻起以前练手的 VBA,发现写过一个挺有趣的字符串加密解密方法

  1. 随机加密,每次加密后的密文都不一样
  2. 虽然密文不一样,但解密后的明文是一样的

实现原理挺简单,加密时,循环提取字符串单字符的 ASCII 码,在 ASCII 码之后加入随机码并重新排序,附上解密随机码;解密时,获取字符串中的随机码,然后逆向操作解密。

VBA 代码

在 EXCEL 中新建模块,输入以下代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
Option Explicit
Function encryptSTR(BVar As Variant, Genre As Integer) As String
'Genre=1:加密,Genre=2:解密

Dim BCode As Integer '随机ASCII码
Dim i As Integer
Dim j As Integer '
Dim Varbyte As String '循环中待计算每字串字节
Dim SubVarHZ As String '汉字字节字符串对应区域码
Dim SubVarHZbyte As String
Dim TVar As String '加密解密后的字串
Dim TVarByte As String '加密解密后的字串每字节处理结果
Dim BVar2 As Variant

Select Case Genre
Case 1

'字符串存在chr(128)说明字符已加密,不再重复加密避免汉字字节识别错误
If InStr(1, BVar, Chr(128)) > 0 Then
encryptSTR = BVar
Exit Function
End If

'随机码
BCode = Int((100 * Rnd) + 1)
TVar = Chr(BCode)

'开始计算
For i = Len(BVar) To 1 Step -1
Varbyte = Mid(BVar, i, 1)

'当提取到汉字(非常规字串)单独循环
If Asc(Varbyte) > 256 Or Asc(Varbyte) < -1 Then

'将汉字转换为4位数区位码
SubVarHZ = Hex(Asc(Varbyte))

'4位区位码单独计算
For j = 1 To 4
Varbyte = Mid(SubVarHZ, j, 1)
TVarByte = Chr(Asc(Varbyte) - BCode - ((Asc(Varbyte) - BCode) < 1) * 127)
TVar = TVar & TVarByte
Next

'加上识别符
TVar = TVar & Chr(128)
Else
TVarByte = Chr(Asc(Varbyte) - BCode - ((Asc(Varbyte) - BCode) < 1) * 127)
TVar = TVar & TVarByte
End If
Next
TVar = Chr(Int((100 * Rnd) + 1)) & TVar
encryptSTR = TVar

Case 2

BVar2 = Right(BVar, Len(BVar) - 1)
BCode = Asc(BVar2)
For i = Len(BVar2) To 2 Step -1
Varbyte = Mid(BVar2, i, 1)

If Asc(Varbyte) > 128 Or Asc(Varbyte) < 0 Then
encryptSTR = BVar
Exit Function
End If

'当取到中文代号时
If Asc(Varbyte) = 128 Then
SubVarHZ = ""
For j = 4 To 1 Step -1
SubVarHZbyte = Chr(Asc(Mid(BVar2, i - j, 1)) + BCode + (Asc(Mid(BVar2, i - j, 1)) + BCode > 127) * 127)
SubVarHZ = SubVarHZ & SubVarHZbyte
Next

'区域码转换为字串
TVar = TVar & Chr(Val("&h" & SubVarHZ))
i = i - 4
Else
TVarByte = Chr(BCode + Asc(Varbyte) + (Asc(Varbyte) + BCode > 127) * 127)
TVar = TVar & TVarByte
End If
Next
encryptSTR = TVar
End Select
End Function

然后就可以在 EXCEL 中使用自定义函数 encryptSTR 进行加解密动作,公式格式为:

1
2
encryptSTR([待加密或解密的字符串],[功能项])
功能项:1-加密 2-解密

演示下载

适用版本: office2003 以上
模块函数: 点击下载
演示文件: 点击下载 (xlsm 宏文件,下载后请启用编辑,启用内容)

没啥技术含量,就是好玩,避免应用在安全领域