문제

다음 코드가 왜 일부 컴퓨터에서 다른 결과를 반환하는지 아는 사람이 있습니까?

Private Shared Function ComputeHashValue(ByVal Data As String) As String
    Dim HashAlgorithm As SHA512 = SHA512.Create
    Dim HashValue() As Byte = HashAlgorithm.ComputeHash(Encoding.ASCII.GetBytes(Data))
    ' Looping over the array and ANDing each byte with 0111111
    For i As Integer = 0 To HashValue.Length - 1
        HashValue(i) = HashValue(i) And Convert.ToByte(127)
    Next
    Return Encoding.ASCII.GetString(HashValue)
End Function

Private Shared Function AreByteArraysEqual(ByVal array1 As Byte(), ByVal array2 As Byte()) As Boolean
    If array1.Length <> array2.Length Then Return False
    For i As Integer = 0 To array1.Length - 1
        If array1(i) <> array2(i) Then Return False
    Next
    Return True
End Function

Private Shared Sub SomeMethod()
    Dim t_prvBytes() As Byte = New Byte() {SOME VALUES} 'Previously computed HASH
    Dim t_dllStream As New IO.FileStream("C:\myfile.txt", IO.FileMode.Open, IO.FileAccess.Read, IO.FileShare.Read)

    Dim t_reader As New IO.StreamReader(t_dllStream)

    Dim t_dllHash() As Byte = System.Text.Encoding.Unicode.GetBytes(ComputeHashValue(t_reader.ReadToEnd))

    MsgBox(AreByteArraysEqual(t_dllHash, t_prvBytes))

    t_dllStream.Close()
End Function
도움이 되었습니까?

해결책

해시를 텍스트로 변환해서는 안됩니다 Encoding.ASCII. 이것의 ~ 아니다 ASCII 텍스트. (전혀 텍스트가 아닙니다.) 원본 텍스트를 ascii-encoding의 결과를 사용하여 사용하면서 읽었습니다. Encoding.Unicode. 왜요?

당신은 텍스트와 이진 형태 사이의 모든 종류의 변환을하고 있습니다. 어느. 이진 데이터를 해시 만 해시하십시오 (사용 HashAlgorithm.ComputeHash(Stream)), 결과를 바이너리로 유지하십시오. 만약 너라면 진짜 이진 데이터를 텍스트로 변환해야합니다. Convert.ToBase64String.

또한 데이터를 이전에 계산 된 값과 비교하고 있지만 이전에 계산 된 값이 처음부터 어디에서 왔는지 설명하지는 않았습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top