【发布时间】:2019-02-27 00:15:21
【问题描述】:
我一直在努力学习 VBScript,给自己带来了一些挑战。我想在 VBScript 中创建一个函数,该函数在 RC4 中加密某些内容,并在 Python 中解密(本质上是相同的过程/算法,但我想验证它是否正确)。
对于我的 python 代码,我有以下内容:
def rc4crypt(data, key):
x = 0
box = range(256)
for i in range(256):
x = (x + box[i] + ord(key[i % len(key)])) % 256
box[i], box[x] = box[x], box[i]
x = 0
y = 0
out = []
for char in data:
x = (x + 1) % 256
y = (y + box[x]) % 256
box[x], box[y] = box[y], box[x]
out.append(chr(ord(char) ^ box[(box[x] + box[y]) % 256]))
return ''.join(out)
从我的互联网研究中可以看出,这是实现 RC4 的一种非常标准的方式。然而,当谈到 VBScript 时,我遇到了一些困难。
到目前为止,这是我的代码:
Function RunRC4(sMessage, strKey)
Dim kLen, x, y, i, j, temp, l
Dim s(256), k(256)
'Init keystream
kLen = Len(strKey)
For i = 0 To 255
s(i) = i
l = Mid(strKey, (i Mod kLen) + 1, 1)
k(i) = Asc(Mid(strKey, (i Mod kLen) + 1, 1))
Next
j = 0
For i = 0 To 255
j = (j + k(i) + s(i)) Mod 256
temp = s(i)
s(i) = s(j)
s(j) = temp
Next
'Encode/Decode
For i = 1 To Len(sMessage)
x = (x + 1) Mod 256
y = (y + s(x)) Mod 256
temp = s(x)
s(x) = s(y)
s(y) = temp
temp1 = Asc(Mid(sMessage, i, 1))
temp2 = Chr(s((s(x) + s(y)) Mod 256))
RunRC4 = RunRC4 & Chr(temp1 Xor temp2)
Next
End Function
它与那里的许多其他帖子非常相似。我发现有一些相关的帖子,有人问过类似的问题,但不是我想要的答案:
Encrypt a string in java and decryption in VBScript using RC4
RC4 decryption with key in Python
如您所知,两者都使用非常相似的脚本。但是在尝试解码时似乎都无法正常工作。我也看过其他地方,包括这样的算法:
https://bytes.com/topic/access/insights/906671-rc4-encryption-algorithm-vba-vbscript
有人可以帮忙吗?很高兴知道您是否能够成功运行每个功能。理想情况下,目标是使用 VBScript 运行加密,获取输出并使用 Python 解密,并获得预期的原始结果。
【问题讨论】:
-
请将您的两个函数与现有的 RC4 实现和测试向量进行比较。如果它们不同,请尝试为现有的良好实现和您的实现打印出中间值。然后尝试查看它们何时开始不同,并修复您的代码。执行此操作,直到您的输出与 RC4 密码的输出匹配。如果您同时使用 Python 和 VBScript 代码,它们应该变得兼容。 StackOverflow 仅用于简洁的问题;它不是用于调试支持。
-
我不只是在寻找调试支持,我在询问如何在 VBScript 中实现 RC4。我不确定我的 VBScript 实现哪里出错了。我对我的 Python 实现非常有信心。从我自己的调试中,我无法完全找到我出错的地方——这两种算法看起来相同,但是无法通过使用 Python 中的“test”之类的密钥来破译从 VBScript 生成的密文。您至少可以提供一些可以提供帮助的 VBScript 调试工具吗?
-
对于加密代码,我发现自己依赖于旧的 println 或 log 语句,当不再需要它们时将它们删除。通常您需要与特定符号进行比较,而仅查看程序的变量视图或内存视图很容易出错,并且通常不会削减它。使用十六进制甚至二进制打印出值。
-
我已经尝试对大多数 VBScript 使用 Wscript.Echo,但我得到类型不匹配或其他错误。还有哪些其他日志记录机制?你熟悉VBScript吗?你能帮忙吗?
标签: python encryption vbscript cryptography rc4-cipher