尝试处理 MD5 算法中的消息块时的算术溢出

Arithmetic overflow when trying to process message block in MD5 algorithm

嗨,所以我在 VB.Net 中制作了一个程序,希望在不使用 System.Security.Cryptography 的情况下输出字符串的 MD5 散列(不是最聪明的,但我喜欢挑战),使用这里的实现: https://www.rfc-editor.org/rfc/rfc1321 无论如何,当我 运行 我的代码时,我得到了算术溢出。到目前为止,它已经 运行 相当顺利地将输入的字符串转换为二进制,正确填充等。 但是,当我进入必须处理消息块的第 4 阶段时,它变得有点奇怪。特别是在这个函数上,它 returns 在标记为

的行上出现算术溢出
 Function R1(ByRef a As ULong, ByRef b As Integer, ByRef c As Integer, ByRef d As Integer, ByRef splitmessagepart As String, ByRef S As Integer, ByRef i As Integer, ByRef T() As Long)
    'the line below returns the arithmetic overflow
    a = b + ((a + (f(b, c, d)) + splitmessagepart + T(i)) << S)

    Return a
End Function

这是函数 F:

 Function f(ByRef X As String, ByRef Y As String, ByRef Z As String)

    Dim endresult As String

    endresult = (X And Y) Or (Not X And Z)

    Return endresult
End Function

然后这是调用函数 R1 的行:

splitmessagepart = splitmessage(0)
    a = R1(a, b, c, d, splitmessagepart, 7, 1, T)

通过一些调试,我发现我的 splitmessagepart 变量在另一个函数中没有从二进制正确转换为十进制,但即使我更改它以使其成为正确的十进制版本,我仍然会溢出。我假设这发生在其他 3 个函数上,它们也执行与此类似的操作,但是程序在第一行遇到错误。 我想知道是否可以帮我弄清楚为什么会这样?如果我还没有输入任何需要的代码,请询问我真的想让它工作!

谢谢

您应该将计算拆分成多个部分,并使用 watch 准确检查哪个运算符抛出异常。

更重要的是,您似乎已将选项严格关闭。除非您绝对必须这样做,否则这不是一个好习惯。您将函数 f 的参数定义为字符串,但您将整数传递给它,因此它们将隐式转换为字符串。在 f 中,您使用 andor,它们将再次隐式转换您的参数,因为这些运算符未在字符串上定义。此外,您还没有定义函数输出的类型。 此外,您已将 splitmessagepart 定义为字符串,并尝试在字符串和整数之间使用 +。你知道结果会是什么吗? 我建议您打开选项 strict 并检查所有这些隐式转换,它们可能不是您所期望的。

仅供参考,文档指出单词是一个 32 位对象,因此是一个整数。我怀疑算法中的任何地方都应该有一个字符串。