详细介绍C#之文件校验工具的开发及问题

所属分类: 软件编程 / C#教程 阅读数: 60
收藏 0 赞 0 分享

.加密算法的熟悉
    目前校验文件使用最多的是MD值和SHA值,不外乎有些使用CRC,前段时间微软发布了VisualStudio正式版,win镜像,微软官方给出的校验方式都是校验文件的SHA值。

       C#进行MD加密与SHA加密的实现总结在这里
.文件的加密计算
知道了如何进行普通字符串的加密还不够,我们要校验的文件的MD值或SHA值,接下来熟悉如何获取文件的MD值和SHA值
获取文件的MD值 

public static string GetFileMD(string filePath)
     {
       MDCryptoServiceProvider md = new MDCryptoServiceProvider();
       FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read);
       byte[] result = md.ComputeHash(fs);
       md.Clear();
       StringBuilder sb = new StringBuilder();
       for (int i = ; i < result.Length; i++)
       {
         sb.Append(result[i].ToString("X"));
       }
       return sb.ToString();
     }

 
获取文件的SHA值
         

 public static string GetFileSHA(string filePath)
     {
       SHA sha = new SHACryptoServiceProvider();
       FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read);
       byte[] result = sha.ComputeHash(fs);
       sha.Clear();
       StringBuilder sb = new StringBuilder();
       for (int i = ; i < result.Length; i++)
       {
         sb.Append(result[i].ToString("X"));
       }
       return sb.ToString();
     }

.文件加密数据结构优化
这么多方法,有许多方法大多数代码还都是重复的,如何让代码更精简呢?重构,提高代码的复用率,最初想的是建一个基类,其他各种具体实现都在继承它,但又觉得好麻烦,要新建好几个类,最终决定,建一个类,用最简单的重构,封装方法。
最终加密帮助类实现代码如下:
public static class ValidHelper
   {
     public static string GetFileHash(string filePath, HashAlgorithm algorithm)
     {
       FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read);
       byte[] result = algorithm.ComputeHash(fs);
       algorithm.Clear();
       StringBuilder sb = new StringBuilder();
       for (int i = ; i < result.Length; i++)
       {
         sb.Append(result[i].ToString("X"));
       }
       return sb.ToString();
     }
 
     public static string GetFileMD(string filePath)
     {
       MDCryptoServiceProvider md = new MDCryptoServiceProvider();
       return GetFileHash(filePath, md);
     }
 
     public static string GetFileSHA(string filePath)
     {
       SHA sha = new SHACryptoServiceProvider();
       return GetFileHash(filePath, sha);
     }
 
     public static string GetFileSHA(string filePath)
     {
       SHA sha = SHA.Create();
       return GetFileHash(filePath, sha);
     }
 
     public static string GetFileSHA(string filePath)
     {
       SHA sha = SHA.Create();
       return GetFileHash(filePath, sha);
     }
 
     public static string GetFileSHA(string filePath)
     {
       SHA sha = SHA.Create();
       return GetFileHash(filePath, sha);
     }
   }

.完成后测试与分析
代码完成之后便是测试,在网上找一个文件校验工具(使用的软媒魔方里的校验工具),进行比对,看自己的校验工具是否与软媒魔方的校验工具的校验结果是否一致,经校验,没有错误,最初测试的小文件,后来下载了一个win系统,使用自己的校验工具,校验是否和微软官方给出的SHA值一致时,小工具直接卡死了,过了好长时间才出来结果,这说明这个小工具还待优化,尤其是处理大文件。
在网上查找资料,看到有这样的实现思路,将文件在内存中的位置分段,比如说分成段,分个线程同时开始计算,最后将个计算值再经过处理得到整个文件的SHA值或MD值。然而愚钝,不知道该如何实现,望大神看到之后能给予一些指导,万分感谢。

以上介绍就是本文的全部内容,希望大家喜欢。

更多精彩内容其他人还在看

C# SendInput 模拟鼠标操作的实现方法

C# SendInput 模拟鼠标操作的实现方法,需要的朋友可以参考一下
收藏 0 赞 0 分享

C#中 paint()与Onpaint()的区别

paint是事件onpaint方法onpaint方法是调用paint事件的,用哪一个,效果是一样,就看那一个方便了内部是这样实现的:
收藏 0 赞 0 分享

c#中GetType()与Typeof()的区别

c#中GetType()与Typeof()的区别,需要的朋友可以参考一下
收藏 0 赞 0 分享

将字符串转换成System.Drawing.Color类型的方法

将字符串转换成System.Drawing.Color类型的方法,需要的朋友可以参考一下
收藏 0 赞 0 分享

C# 抓取网页内容的方法

C# 抓取网页内容的方法,需要的朋友可以参考一下
收藏 0 赞 0 分享

基于C#后台调用跨域MVC服务及带Cookie验证的实现

本篇文章介绍了,基于C#后台调用跨域MVC服务及带Cookie验证的实现。需要的朋友参考下
收藏 0 赞 0 分享

使用C#获取远程图片 Form用户名与密码Authorization认证的实现

本篇文章介绍了,使用C#获取远程图片 Form用户名与密码Authorization认证的实现。需要的朋友参考下
收藏 0 赞 0 分享

Winform跨线程操作的简单方法

线程间操作无效:从不是创建控件“label1”的线程访问它
收藏 0 赞 0 分享

C# WINFORM 强制让窗体获得焦点的方法代码

C# WINFORM 强制让窗体获得焦点的方法代码,需要的朋友可以参考一下
收藏 0 赞 0 分享

C#中方括号[]的语法及作用介绍

C#中方括号[]可用于数组,索引、属性,更重要的是用于外部DLL类库的引用。
收藏 0 赞 0 分享
查看更多