(EDIT: Disposing of the hash algorithms now. I suspect it's unnecessary, but it's good practice :)
You're calling ComputeHash for the *whole* buffer even though you should only be hashing the portion of the buffer you've read. In addition, you're computing a new hash for each call to Read.
Here's some really simple code to compute the hashes:
using System;
using System.IO;
using System.Security.Cryptography;
class Test
{
static void Main()
{
byte[] plaintext = File.ReadAllBytes("b.txt");
using (MD5 md5 = MD5.Create())
{
byte[] md5Hash = md5.ComputeHash(plaintext);
Console.WriteLine(BitConverter.ToString(md5Hash));
}
using (SHA1 sha1 = SHA1.Create())
{
byte[] sha1Hash = sha1.ComputeHash(plaintext);
Console.WriteLine(BitConverter.ToString(sha1Hash));
}
}
}
This gives the results as per wikipedia - note that `b.txt` shouldn't have a newline at the end of it.
An alternative way of getting the binary data to start with would be:
byte[] plaintext = Encoding.ASCII.GetBytes(
"The quick brown fox jumps over the lazy dog");
Note that this is just the simple way of computing a hash in one go. If you want to do it in a streaming fashion (i.e. where you read some data, add it to the hash, read some more data etc) then either you can use the [`ComputeHash(Stream)`][1] overload or (if you want to "push" data to it) you can use `TransformBlock` and `TransformFinalBlock`, like this:
using System.Text;
class Test
{
static void Main()
{
using (MD5 md5 = MD5.Create())
using (SHA1 sha1 = SHA1.Create())
using (Stream input = File.OpenRead("b.txt"))
{
// Artificially small to make sure there's
// more than one read
byte[] buffer = new byte[4];
int bytesRead;
while ((bytesRead = input.Read(buffer, 0, buffer.Length)) > 0)
{
md5.TransformBlock(buffer, 0, bytesRead, null, 0);
sha1.TransformBlock(buffer, 0, bytesRead, null, 0);
}
md5.TransformFinalBlock(buffer, 0, 0);
sha1.TransformFinalBlock(buffer, 0, 0);
Console.WriteLine(BitConverter.ToString(md5.Hash));
Console.WriteLine(BitConverter.ToString(sha1.Hash));
}
}
}
Note the way we pass `null` to `TransformBlock` because we don't need any output, and we don't transform any data in the final block. I suspect this is the example you'll want to use, based on your previous comments.
[1]: http://msdn.microsoft.com/en-us/library/xa627k19.aspx