惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

S
Secure Thoughts
罗磊的独立博客
T
The Blog of Author Tim Ferriss
人人都是产品经理
人人都是产品经理
博客园 - 叶小钗
Last Week in AI
Last Week in AI
美团技术团队
Google Online Security Blog
Google Online Security Blog
Application and Cybersecurity Blog
Application and Cybersecurity Blog
D
Docker
G
Google Developers Blog
大猫的无限游戏
大猫的无限游戏
酷 壳 – CoolShell
酷 壳 – CoolShell
小众软件
小众软件
月光博客
月光博客
L
LINUX DO - 最新话题
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
W
WeLiveSecurity
H
Heimdal Security Blog
Vercel News
Vercel News
SecWiki News
SecWiki News
Forbes - Security
Forbes - Security
Blog — PlanetScale
Blog — PlanetScale
Google DeepMind News
Google DeepMind News
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
www.infosecurity-magazine.com
www.infosecurity-magazine.com
TaoSecurity Blog
TaoSecurity Blog
T
Troy Hunt's Blog
A
About on SuperTechFans
C
Check Point Blog
S
Security Affairs
Hacker News - Newest:
Hacker News - Newest: "LLM"
AI
AI
WordPress大学
WordPress大学
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
Help Net Security
Help Net Security
博客园_首页
The Last Watchdog
The Last Watchdog
S
SegmentFault 最新的问题
Hugging Face - Blog
Hugging Face - Blog
Security Archives - TechRepublic
Security Archives - TechRepublic
Engineering at Meta
Engineering at Meta
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
I
Intezer
K
Kaspersky official blog
M
MIT News - Artificial intelligence
J
Java Code Geeks
G
GRAHAM CLULEY
P
Palo Alto Networks Blog

博客园 - 朱煜

项目经理与客户沟通的宜与忌 转 FileStream Read File filestream read方法 循环读取固定文件 c#描述异常处理语句try、catch、finally执行时的相互关系 C#计算文件的MD5值实例 金旭亮老师的Scoekt编程摘要 Winfrom动态创建控件 多个文件合并成一个大文件后,无法打开,需要从以下几个方面找出问题? 腰围2尺1,2,3,4,5,6,7,8寸分别等于是多少厘米/英寸(对照表) 字符编码中的英文字母、汉字占有的字节长度。 Socket Programming in C#--Conclusion Socket Programming in C#--Server Side Socket Programming in C#--Multiple Sockets Socket Programming in C#--Getting Started Socket Programming in C#--Introduction C#中的is,as关键字 委托/事件与观察者模式 发布符合 .NET Framework 准则的事件(C# 编程指南) 在职研究生硕士学位证书查询和认证方式
C#获取文件MD5字符串
朱煜 · 2014-04-15 · via 博客园 - 朱煜

备注

哈希函数将任意长度的二进制字符串映射为固定长度的小型二进制字符串。加密哈希函数有这样一个属性:在计算不大可能找到散列为相同的值的两个不同的输入;也就是说,两组数据的哈希值仅在对应的数据也匹配时才会匹配。数据的少量更改会在哈希值中产生不可预知的大量更改。

MD5 算法的哈希值大小为 128 位。

MD5 类的 ComputeHash 方法将哈希作为 16 字节的数组返回。请注意,某些 MD5 实现会生成 32 字符的十六进制格式哈希。若要与此类实现进行互操作,请将 ComputeHash 方法的返回值格式化为十六进制值。

示例

下面的代码示例计算字符串的 MD5 哈希值,并将该哈希作为 32 字符的十六进制格式字符串返回。此代码示例中创建的哈希字符串与能创建 32 字符的十六进制格式哈希字符串的任何 MD5 哈希函数(在任何平台上)兼容。

复制

using System;

using System.Security.Cryptography;

using System.Text;

class Example

{

    // Hash an input string and return the hash as

    // a 32 character hexadecimal string.

    static string getMd5Hash(string input)

    {

        // Create a new instance of the MD5CryptoServiceProvider object.

        MD5 md5Hasher = MD5.Create();

        // Convert the input string to a byte array and compute the hash.

        byte[] data = md5Hasher.ComputeHash(Encoding.Default.GetBytes(input));

        // Create a new Stringbuilder to collect the bytes

        // and create a string.

        StringBuilder sBuilder = new StringBuilder();

        // Loop through each byte of the hashed data

        // and format each one as a hexadecimal string.

        for (int i = 0; i < data.Length; i++)

        {

            sBuilder.Append(data[i].ToString("x2"));

        }

        // Return the hexadecimal string.

        return sBuilder.ToString();

    }

    // Verify a hash against a string.

    static bool verifyMd5Hash(string input, string hash)

    {

        // Hash the input.

        string hashOfInput = getMd5Hash(input);

        // Create a StringComparer an comare the hashes.

        StringComparer comparer = StringComparer.OrdinalIgnoreCase;

        if (0 == comparer.Compare(hashOfInput, hash))

        {

            return true;

        }

        else

        {

            return false;

        }

    }

    static void Main()

    {

        string source = "Hello World!";

        string hash = getMd5Hash(source);

        Console.WriteLine("The MD5 hash of " + source + " is: " + hash + ".");

        Console.WriteLine("Verifying the hash...");

        if (verifyMd5Hash(source, hash))

        {

            Console.WriteLine("The hashes are the same.");

        }

        else

        {

            Console.WriteLine("The hashes are not same.");

        }

    }

}

// This code example produces the following output:

//

// The MD5 hash of Hello World! is: ed076287532e86365e841e92bfc50d8c.

// Verifying the hash...

// The hashes are the same.

代码:

1)获取文件MD5字符串:

// filename:文件的物理路径(如:D:\dwb\excel\AA.xls)

string ByteArrayToHexString(string filename)        {

            FileStream fs = new FileStream(filename, FileMode.Open);

            MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider();

            md5.Initialize();

            byte[] bytes = md5.ComputeHash(fs);

            md5.Clear();

            fs.Close();

            StringBuilder sb = new StringBuilder();

            foreach (byte b in bytes)

               sb.Append(b.ToString("x2"));

            return sb.ToString();

        }

2)加密配置文件:

string sSecretKey;// 密钥

先生成加密解密需要的密钥 sSecretKey = GenerateKey();

/// <summary>

        /// 根据KEY生成密钥

        /// </summary>

        /// <param name="key">KEY字符串</param>

        /// <returns></returns>

        string GenerateKey(string key)

        {

            byte[] keys = new byte[8];

            int j = 0;

            for (int i = 0; i < keys.Length; i++)

            {

                keys[i] = Convert.ToByte(System.Text.Encoding.Unicode.GetBytes(key.Substring(j, 1))[0] - 5);

                j += 2;

            }

            byte[] keys1 = new byte[8];

            for (int i = 0; i < keys.Length; i++)

            {

                keys1[i] = keys[keys.Length - i - 1];

            }

            return ASCIIEncoding.ASCII.GetString(keys1);

        }

      /// <summary>

        /// 加密文件

        /// </summary>

        /// <param name="sInputFilename">需要加密的文件(包括路径)</param>

        /// <param name="sOutputFilename">加密后的文件(包括路径)</param>

        /// <param name="sKey">密钥</param>

        void EncryptFile(string sInputFilename, string sOutputFilename, string sKey)

        {

            FileStream fsInput = new FileStream(sInputFilename, FileMode.Open, FileAccess.Read);

            FileStream fsEncrypted = new FileStream(sOutputFilename, FileMode.Create, FileAccess.Write);

            DESCryptoServiceProvider DES = new DESCryptoServiceProvider();

            DES.Key = ASCIIEncoding.ASCII.GetBytes(sKey);

            DES.IV = ASCIIEncoding.ASCII.GetBytes(sKey);

            ICryptoTransform desencrypt = DES.CreateEncryptor();

            CryptoStream cryptostream = new CryptoStream(fsEncrypted, desencrypt, CryptoStreamMode.Write);

            byte[] bytearrayinput = new byte[fsInput.Length];

            fsInput.Read(bytearrayinput, 0, bytearrayinput.Length);

            cryptostream.Write(bytearrayinput, 0, bytearrayinput.Length);

            cryptostream.Close();

            fsInput.Close();

            fsEncrypted.Close();

        }

3)解密配置文件:

      /// <summary>

        /// 解密文件

        /// </summary>

        /// <param name="sInputFilename">需要解密的文件(包括路径)</param>

        /// <param name="sOutputFilename">解密后的文件(包括路径)</param>

        /// <param name="sKey">密钥</param>

        void DecryptFile(string sInputFilename, string sOutputFilename, string sKey)

        {

            DESCryptoServiceProvider DES = new DESCryptoServiceProvider();

            //A 64 bit key and IV is required for this provider.

            //Set secret key For DES algorithm.

            DES.Key = ASCIIEncoding.ASCII.GetBytes(sKey);

            //Set initialization vector.

            DES.IV = ASCIIEncoding.ASCII.GetBytes(sKey);

            FileStream fsread = new FileStream(sInputFilename, FileMode.Open, FileAccess.Read);

            ICryptoTransform desdecrypt = DES.CreateDecryptor();

            CryptoStream cryptostreamDecr = new CryptoStream(fsread, desdecrypt, CryptoStreamMode.Read);

            StreamWriter fsDecrypted = new StreamWriter(sOutputFilename);

            fsDecrypted.Write(new StreamReader(cryptostreamDecr).ReadToEnd());

            fsDecrypted.Flush();

            fsDecrypted.Close();

            fsread.Close();

        }