使用VBScript和Python的RC4

使用VBScript和Python的RC4,python,encryption,vbscript,cryptography,rc4-cipher,Python,Encryption,Vbscript,Cryptography,Rc4 Cipher,我一直在努力学习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

我一直在努力学习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时,我一直有点困难

以下是我目前的代码:

函数RunRC4(sMessage,strKey)
Dim kLen,x,y,i,j,temp,l
尺寸s(256),k(256)
'初始化密钥流
克伦=伦(斯特基)
对于i=0到255
s(i)=i
l=Mid(strKey,(i Mod kLen)+1,1)
k(i)=Asc(Mid(strKey,(i Mod kLen)+1,1))
下一个
j=0
对于i=0到255
j=(j+k(i)+s(i))模256
温度=s(i)
s(i)=s(j)
s(j)=温度
下一个
'编码/解码
对于i=1至Len(sMessage)
x=(x+1)模256
y=(y+s(x))模256
温度=s(x)
s(x)=s(y)
s(y)=温度
temp1=Asc(Mid(sMessage,i,1))
temp2=Chr(s((s(x)+s(y))Mod 256))
RunRC4=RunRC4&Chr(temp1或temp2)
下一个
端函数
这和其他很多帖子非常相似。我发现有几个相关的帖子,有人问类似的问题,但不是我想要的答案:

正如您可能知道的,这两个脚本使用非常相似的脚本。但在尝试解码时,两者似乎都不能正常工作。我还研究了其他地方,包括一个算法,如:


有人能帮忙吗?如果您能够成功运行每个函数,那就太好了。理想情况下,目标是使用VBScript运行加密,获取输出并使用Python解密,然后获得预期的原始结果。

问题在于编码。只要看一下Python文档

从整数(表示字符的unicode码点)返回字符(字符串)

而在VBScript中

返回与指定的ANSI字符代码关联的字符

这不是等效的,而是需要在VBScript中使用
ChrW()
函数

ChrW适用于使用Unicode字符的32位平台。它的参数是一个Unicode(宽)字符代码,从而避免了从ANSI到Unicode的转换

另外,在返回字符代码时,您需要使用
AscW()
函数,而不是使用与Python等效的函数

AscW是为使用Unicode字符的32位平台提供的。它返回Unicode(宽)字符代码
,从而避免了从Unicode到ANSI的转换


有用的链接

请将这两种功能与现有的RC4实现和测试向量进行比较。如果它们不同,请尝试打印现有良好实现和您的实现的中间值。然后尝试查看它们何时开始不同,并修复代码。执行此操作,直到输出与RC4密码匹配。如果同时使用Python和VBScript代码执行此操作,则它们应该是兼容的。StackOverflow仅用于简明问题;这不是为了调试支持。我不是在寻找调试支持,我是在问如何在VBScript中实现RC4。我不确定我的VBScript实现哪里出错了。我对我的Python实现非常有信心。通过我自己的调试,我不能完全找到哪里出了问题——这两个算法看起来完全相同,但无法通过使用Python中类似“test”的键来破译VBScript生成的密文。你能至少提供一些VBScript调试工具来帮助我吗?对于加密代码,我发现我自己求助于旧的println或log语句,在不再需要它们时将它们删除。通常,您需要与特定的符号进行比较,而仅仅查看程序的变量视图或内存视图是容易出错的,并且通常不会切断它。使用十六进制甚至二进制来打印值。我已经尝试对大多数VBScript使用Wscript.Echo,但我遇到类型不匹配或其他错误。还有什么其他日志记录机制?你熟悉VBScript吗?你能帮忙吗?谢谢!!这真的很有帮助。我会替换Asc和Chr的所有用途吗?Mid是否有任何问题?是的,因为您希望使用Unicode而不是ANSI字符点。由于Unicode是多字节的,您可能会遇到问题,您可以尝试
MidB()
,但在VBScript中使用二进制代码会变得很棘手。您可能会发现实现Python函数比在VBScript中使用Unicode更容易。很高兴知道!你知道目前RC4在VBScript中有什么好的ASCII实现吗?你原来问题中的那个似乎很好。还有一个老问题。