2013-03-29 6 views
4

C# 및 PHP 파일의 MD5 체크섬을 확인하는 데 약간의 문제가 있습니다. PHP 스크립트로 계산 된 해시는 C#에서 계산 된 해시와 다릅니다.C# 및 PHP에서 다른 MD5 파일 해시

PHP에서
libcurl.dll C# = c3506360ce8f42f10dc844e3ff6ed999 
libcurl.dll PHP = f02b47e41e9fa77909031bdef07532af 

나는 md5_file 기능을 사용하고, 내 C# 코드는 다음과 같습니다

protected string GetFileMD5(string fileName) 
{ 
    FileStream file = new FileStream(fileName, FileMode.Open); 
    MD5 md5 = new MD5CryptoServiceProvider(); 
    byte[] retVal = md5.ComputeHash(file); 
    file.Close(); 

    StringBuilder sb = new StringBuilder(); 
    for (int i = 0; i < retVal.Length; i++) 
    { 
     sb.Append(retVal[i].ToString("x2")); 
    } 
    return sb.ToString(); 
} 

모든 아이디어를 어떻게 동일한 해시를 계산하는 방법? 나는 이것이 인코딩에 관한 것일 수도 있다고 생각한다.

미리 감사드립니다.

+2

PHP 스크립트가'UTF-8' 또는'ISO-8859-1' 인코딩을 사용하는 동안 C#은'Windows-1250' 인코딩을 사용합니다. 양쪽 모두 인코딩을 동일하게 만드십시오. – shadyyx

+0

커맨드 라인 도구'md5sum'과 어떻게 비교 될까요? –

+0

을 FileStream과 함께 사용하면 포인터가 begening에 있음을 알릴 수 없습니다. 그것을 보장하기 위해 file.Seek (0, SeekOrigin.Begin)을 사용하십시오. msdn의 모든 예는 FileStream 생성자 다음에 사용합니다. – Xaruth

답변

0

나는이 사용

나는 C#을 MD5와 PHP의 MD5의 비교에 아직 문제가 있었 havent 한

System.Text.UTF8Encoding text = new System.Text.UTF8Encoding(); 
System.Security.Cryptography.MD5CryptoServiceProvider md5 = new System.Security.Cryptography.MD5CryptoServiceProvider();     
Convert2.ToBase16(md5.ComputeHash(text.GetBytes(encPassString + sess))); 


class Convert2 
{ 
    public static string ToBase16(byte[] input) 
    { 
     return string.Concat((from x in input select x.ToString("x2")).ToArray()); 
    } 
} 
+0

파일 md5에 관한 것입니까? 아니면 그냥 텍스트? – Kacper

+0

MD5를 얻으려면 파일을 텍스트로 디코딩 할 필요가 없습니다. UTF-8이 아니라면 어떨까요? – Esailija

1

내 C#을 녹슨하지만 것입니다 :

byte[] retVal = md5.ComputeHash(file); 

실제로 읽기 전체 파일에? 난 그냥 스트림 개체를 해싱하는 것 같아요. 나는 당신이 스트림을 읽어야하고 전체 파일 내용을 해시 할 필요가 있다고 생각한다.

int length = (int)file.Length; // get file length 
    buffer = new byte[length];  // create buffer 
    int count;      // actual number of bytes read 
    int sum = 0;     // total number of bytes read 

    // read until Read method returns 0 (end of the stream has been reached) 
    while ((count = file.Read(buffer, sum, length - sum)) > 0) 
     sum += count; // sum is a buffer offset for next reading 
    byte[] retVal = md5.ComputeHash(buffer); 

실제로 실제로 실행되는지는 확실하지 않지만 그 라인을 따라 뭔가가 필요할 것입니다.

+0

ComputeHash를 사용하는 것과 동일한 결과를 제공합니다. – Kacper