【问题标题】:Arithmetic overflow when trying to process message block in MD5 algorithm尝试在 MD5 算法中处理消息块时算术溢出
【发布时间】:2019-08-29 10:54:11
【问题描述】:

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

谢谢

【问题讨论】:

  • 我认为您应该重新考虑完全实现算法的方式。 String 关键字应该完全丢失,除了可用于调试/日志记录的ToString 等函数。二进制是八位字节/八位字节字符串,即字节数组。输入、输出和应该是八位字节,单词的内部工作。如果要查看中间结果,请创建一个可以调用的特殊函数,但不要在任何计算中使用字符串。
  • 请注意,VB afaik 中没有“检查”计算,因此只有在将值解码为Integer 时才会发生异常。我不确定我是否非常喜欢ByRef,可能首先 ref 大于整数,我不认为需要它(但我不是 VB 程序员 - 我假设用法与其他语言相同)。
  • @MaartenBodewes 所以对于任何二进制值,我应该将它存储在一个字节数组中,而不是作为字符串?每天学习新东西!

标签: vb.net cryptography md5


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-02
    • 1970-01-01
    • 2020-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多