【发布时间】: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