通过修改文件测试校验和

时间:2018-06-25 08:21:52

标签: c# testing copy sha512

使用C#程序将文件或整个文件夹复制到另一个文件夹,并在该应用程序中使用校验和SHA-512来验证复制过程的输入和输出是否相同,该程序可以正常工作,但我需要测试整个程序,尤其是测试或验证校验和。我怎样才能给程序一个输入例如文件,并在此过程中以某种方式修改文件,以查看校验和检测到该错误?谢谢你的建议

1 个答案:

答案 0 :(得分:0)

这是测试SHA512哈希的简单示例。这里我们有两个测试,TestSHA512Modify和TestSHA512Append。一个修改文件中的字节,打开将字节追加到文件中。两者都是对哈希的有用测试。

static void TestSHA512Modify()
{
    var testFile = Path.GetTempFileName();
    CreateRandomFile(testFile, 1024);

    var sha12 = GetFileSHA512(testFile);
    Console.WriteLine("TestSHA12Modify: Original file SHA512: " + ToHexString(sha12));

    // Modify file bytes. Here we set byte offset [100] [101] [102]
    WriteBytes(testFile, 100, new byte[] { 1, 2, 3 });

    var modifiedSha12 = GetFileSHA512(testFile);
    Console.WriteLine("TestSHA12Modify: Updated file SHA512:  " + ToHexString(modifiedSha12));

    Console.WriteLine("TestSHA12Modify: SHA12 Hashes are: " + (sha12.SequenceEqual(modifiedSha12) ? "EQUAL" : "NOT EQUAL"));
}

static void TestSHA512Append()
{
    var testFile = Path.GetTempFileName();
    CreateRandomFile(testFile, 1024);

    var sha12 = GetFileSHA512(testFile);
    Console.WriteLine("TestSHA12Append: Original file SHA512: " + ToHexString(sha12));

    // Append bytes to the end of a file
    AppendBytes(testFile, new byte[] { 1 });

    var modifiedSha12 = GetFileSHA512(testFile);
    Console.WriteLine("TestSHA12Append: Updated file SHA512:  " + ToHexString(modifiedSha12));
    Console.WriteLine("TestSHA12Append: SHA12 Hashes are: " + (sha12.SequenceEqual(modifiedSha12) ? "EQUAL" : "NOT EQUAL"));
}


static void CreateRandomFile(string path, int length)
{
    // Make some random bytes.
    var randomData = new byte[1024];

    RNGCryptoServiceProvider p = new RNGCryptoServiceProvider();
    p.GetBytes(randomData);

    File.WriteAllBytes(path, randomData);
}

static void WriteBytes(string path, int fileOffset, byte[] data)
{
    using (var fileStream = new FileStream(path, FileMode.Open))
    {
        fileStream.Seek(fileOffset, SeekOrigin.Begin);
        fileStream.Write(data, 0, data.Length);
    }
}

static void AppendBytes(string path, byte[] data)
{
    using (var fileStream = new FileStream(path, FileMode.Append))
    {
        fileStream.Write(data, 0, data.Length);
    }
}

static byte[] GetFileSHA512(string path)
{
    using (SHA512 sha = new SHA512Managed())
    {
        return sha.ComputeHash(File.ReadAllBytes(path));
    }
}

static string ToHexString(byte[] data)
{
    return string.Join("", data.Select(b => b.ToString("X2")));
}