无法将字符串加解密示例拆分为两个函数,求助复用bytOut变量方案
嘿,我来帮你解决这个拆分加密解密函数的问题!
首先,先把你提供的原示例截断代码贴出来方便参考:
<% sPlain="test" sPassword="key" lLength = Len(sPlain) ReDim bytOut(lLength - 1) ' 后续应该是基于密码生成密钥流、加密的逻辑,然后又用同一个bytOut做解密 %>
你遇到的核心问题是:原代码把加密和解密逻辑放在同一个作用域里,直接复用了bytOut变量,但拆分独立函数后,两个函数不在同一个作用域,没法直接共享这个变量。解决思路其实很简单——把生成bytOut(也就是密钥流/加密所需的核心字节数组)的逻辑抽成一个独立的辅助函数,这样加密和解密函数都能通过传入相同的密码和对应长度,生成完全一致的bytOut。
下面是具体的实现方案,我基于常见的VBScript字符串加密逻辑(比如RC4异或加密,和你原代码的逻辑匹配度很高)来拆分:
第一步:抽离生成密钥流的辅助函数
这个函数负责根据密码和输入内容的长度,生成用于加密和解密的核心字节数组(也就是你说的bytOut):
Function GetKeyStream(sPassword, inputLength) Dim bytPassword, bytKey, i, j, temp ' 把密码转换成字节数组 bytPassword = StrConv(sPassword, vbFromUnicode) ReDim bytKey(255) ' 初始化RC4密钥数组 For i = 0 To 255 bytKey(i) = i Next j = 0 For i = 0 To 255 j = (j + bytKey(i) + bytPassword(i Mod UBound(bytPassword)+1)) Mod 256 ' 交换字节完成初始化 temp = bytKey(i) bytKey(i) = bytKey(j) bytKey(j) = temp Next ' 生成对应输入长度的密钥流 ReDim bytOut(inputLength - 1) i = 0 : j = 0 For k = 0 To inputLength - 1 i = (i + 1) Mod 256 j = (j + bytKey(i)) Mod 256 temp = bytKey(i) bytKey(i) = bytKey(j) bytKey(j) = temp bytOut(k) = bytKey((bytKey(i) + bytKey(j)) Mod 256) Next GetKeyStream = bytOut End Function
第二步:编写独立的加密函数
这个函数调用辅助函数获取密钥流,完成明文加密,并且把加密结果转成Base64(避免乱码,方便存储/传输):
Function EncryptString(sPlainText, sPassword) Dim bytPlain, bytKeyStream, i, bytEncrypted ' 把明文转换成字节数组 bytPlain = StrConv(sPlainText, vbFromUnicode) ' 获取对应长度的密钥流 bytKeyStream = GetKeyStream(sPassword, UBound(bytPlain)+1) ReDim bytEncrypted(UBound(bytPlain)) ' 异或加密(核心逻辑) For i = 0 To UBound(bytPlain) bytEncrypted(i) = bytPlain(i) XOR bytKeyStream(i) Next ' 转成Base64输出,可根据需求调整 EncryptString = EncodeBase64(bytEncrypted) End Function
第三步:编写独立的解密函数
解密逻辑和加密逻辑对称,同样调用辅助函数获取密钥流,完成解密:
Function DecryptString(sEncryptedText, sPassword) Dim bytEncrypted, bytKeyStream, i, bytDecrypted ' 先把Base64加密字符串转回字节数组 bytEncrypted = DecodeBase64(sEncryptedText) ' 获取对应长度的密钥流 bytKeyStream = GetKeyStream(sPassword, UBound(bytEncrypted)+1) ReDim bytDecrypted(UBound(bytEncrypted)) ' 异或解密(异或操作可逆,逻辑和加密一致) For i = 0 To UBound(bytEncrypted) bytDecrypted(i) = bytEncrypted(i) XOR bytKeyStream(i) Next ' 把字节数组转回明文 DecryptString = StrConv(bytDecrypted, vbUnicode) End Function
补充说明
- 如果你的环境里没有
EncodeBase64和DecodeBase64函数,可以用MSXML对象实现,比如:Function EncodeBase64(bytData) Dim objXML Set objXML = CreateObject("MSXML2.DOMDocument.3.0") Set objNode = objXML.CreateElement("base64") objNode.dataType = "bin.base64" objNode.nodeTypedValue = bytData EncodeBase64 = objNode.Text Set objNode = Nothing : Set objXML = Nothing End Function Function DecodeBase64(sBase64) Dim objXML Set objXML = CreateObject("MSXML2.DOMDocument.3.0") Set objNode = objXML.CreateElement("base64") objNode.dataType = "bin.base64" objNode.Text = sBase64 DecodeBase64 = objNode.nodeTypedValue Set objNode = Nothing : Set objXML = Nothing End Function - 核心逻辑是:只要传入相同的密码和对应长度,
GetKeyStream函数会生成完全一致的密钥流,这样加密和解密就能正确对应,不需要在两个函数之间共享变量。
内容的提问来源于stack exchange,提问作者Ali Sheikhpour
相关产品推荐
相关产品推荐

