RC4使用VBScript和Python

时间:2019-02-27 00:15:21

标签: 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
        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获取输出并解密,并获得预期的原始结果。

1 个答案:

答案 0 :(得分:3)

问题将是编码。只需查看Python文档chr() function

  

从整数返回一个字符(字符串)(代表该字符的 unicode代码点

而在VBScript中,Chr() function

  

返回与指定的 ANSI字符代码

关联的字符

这不是等效的,相反,您需要在VBScript中使用ChrW()函数。

  

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

此外,在返回字符代码时,您将需要使用AscW()函数而不是Asc() function函数,后者等效于Python ord() function

  

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


有用链接