首页 > 解决方案 > 尝试在 MD5 算法中处理消息块时算术溢出

问题描述

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

 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 个函数上,它们也执行与此类似的操作,但是程序在第一行遇到错误。我想知道是否可以帮助我弄清楚为什么会这样?如果需要我没有输入的任何代码,请询问我真的想让它工作!

谢谢

标签: vb.netcryptographymd5

解决方案


您应该将计算拆分为各个部分,并使用手表精确检查哪个操作员引发了异常。

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

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


推荐阅读