【问题标题】:RC4 Using VBScript and PythonRC4 使用 VBScript 和 Python
【发布时间】: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


【解决方案1】:

问题在于编码。只需查看 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 的转换。


有用的链接

【讨论】:

  • 谢谢!!这真的很有帮助。我会替换 Asc 和 Chr 的所有用途吗? Mid有什么问题吗?
  • 是的,因为您需要 Unicode 而不是 ANSI 字符点。 Mid() 可能有问题,因为 Unicode 是多字节的,您可以尝试 MidB(),但在 VBScript 中使用二进制会很棘手。您可能会发现实现uses ASCII characters instead of Unicode 的 Python 函数比尝试在 VBScript 中使用 Unicode 更容易。
  • 很高兴知道!你知道当前在 VBScript 中有什么好的 RC4 ASCII 实现吗?
  • 原始问题中的那个似乎很好。
  • 还有这个老4GuysFromRolla article
猜你喜欢
  • 2012-03-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多