【问题标题】:C++ md5 not matching vb.net md5C++ md5 不匹配 vb.net md5
【发布时间】:2022-01-27 06:28:14
【问题描述】:

字符串在文本文件 testx.txt 中找到 字符串是 Nw[v|YK 我相信它包含 utf8 个字符

ifstream infile("testx.txt");

  if (infile.good())
  {
    string sLine;
    getline(infile, sLine);
char* cx = const_cast<char*>(sLine.c_str());
    string a2 = md5.digestString(cx);
    cout << a2 << endl;
  }

我一直在做我的 vb.net 代码并将其作为字符串读取然后尝试 md5 它......是因为它的 utf8 吗?我该怎么做才能将其读取为字符串并获得正确的 md5?

vb.net md5 代码

Public Function GetIRC7PWD(source As String)
        Dim md5Hash As MD5 = MD5.Create()
        Dim data As Byte() = md5Hash.ComputeHash(Encoding.Default.GetBytes(source))
        Dim sBuilder As New StringBuilder()
        Dim i As Integer
        For i = 0 To data.Length - 1
            sBuilder.Append(data(i).ToString("x2"))
        Next i
        Return sBuilder.ToString()

    End Function

End Module

文本文件可以找到@https://tha-row.net/testx.txt

 Dim lines() As String = IO.File.ReadAllLines("d:\\testx.txt")
        Dim line As String = lines(0)
        Dim a1 As String = GetIRC7PWD(line)

a1 返回 3be255619a53ec2af553e0cae9606a9a 的正确哈希

现在我有一个 c++ 的 md5 代码

【问题讨论】:

  • 我假设您对两个程序使用完全相同的文件?您是否在两个程序中使用不同的盐?您的 VB.net 代码在做什么? C++ MD5 实现从何而来?
  • 我正在使用我在 stackoverflow 上找到的 md5 代码 ....
  • 如果我做 md5.digestString("moo");我得到的值与我在 vb.net md5 中得到的值相同,但如果我尝试从文本文件中获取相同的 md5 哈希,则它不同
  • System.String 在 vb.net 被记录为在内部使用 UTF-16。 vb.net 中的 md5 计算另一个字节流。
  • 请显示minimal reproducible example,包括你的vb代码,我猜你在vb哈希中包含了你不在c++中的行尾

标签: c++ md5


【解决方案1】:

您的文件包含 UTF-8 BOM,开头的三个字节:0xEF、0xBB、0xBF。

VB.Net 检测文件中的 BOM、文件编码并丢弃这三个字节。

C++ istream 读取原始字节,getline 返回这三个字节的第一个字符串。这样你就得到了另一个 MD5 和。

试试

if (a2.substr(0, 3) == "\xEF\xBB\xBF")
   a2.erase(0, 3);

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-17
  • 2014-05-19
  • 1970-01-01
  • 2020-12-08
  • 2018-03-03
相关资源
最近更新 更多