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

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();

}

MD5加密获得文件的MD5码的更多相关文章

  1. 16位的MD5加密和32位MD5加密的区别

    16位的MD5加密和32位MD5加密的区别 MD5加密后所得到的通常是32位的编码,而在不少地方会用到16位的编码它们有什么区别呢?16位加密就是从32位MD5散列中把中间16位提取出来!其实破解16 ...

  2. MD5工具类,提供字符串MD5加密、文件MD5值获取(校验)功能

    MD5工具类,提供字符串MD5加密(校验).文件MD5值获取(校验)功能 : package com.yzu.utils; import java.io.File; import java.io.Fi ...

  3. MD5加密 js文件

    var hexcase = 0; var b64pad = ""; var chrsz = 8; function hex_md5(s){ return binl2hex(core ...

  4. 【windows】【md5】查看文件的md5值

    certutil -hashfile filename MD5 certutil -hashfile filename SHA1 certutil -hashfile filename SHA256 ...

  5. 使用Java中间MessageDigest该文本MD5加密(Java中间MD5样品加密算法演示)

    原文地址:http://www.wenboxz.com 版权声明:本文博客原创文章,博客,未经同意,不得转载.

  6. Java实现文件MD5加密

    代码实现: import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.s ...

  7. java加密算法--MD5加密和哈希散列带秘钥加密算法源码

    package com.ompa.common.utils; import java.security.MessageDigest; import java.security.NoSuchAlgori ...

  8. Android初级教程:对文件和字符串进行MD5加密工具类

    转载请注明出处:http://blog.csdn.net/qq_32059827/article/details/52200008   点击打开链接 之前写过一篇博文,是针对字符串进行md5加密的.今 ...

  9. Android:MD5加密

    /** * @author gongchaobin * * MD5加密 * * @version 2013-8-22 */ public class MD5Util { // 用来将字节转换成 16 ...

随机推荐

  1. Docker集群管理(三)—— docker swarm mode基础教程

    docker从1.12版(及后续版本)集成了swarmkit.可以方便的实现docker集群.它有哪些特点呢: 集成了集群功能 分散设计:manager和worker两种节点. 声明式服务模式 可伸缩 ...

  2. Python中的LEGB规则

    目标 命名空间和作用域——Python从哪里查找变量名? 我们能否同时定义或使用多个对象的变量名? Python查找变量名时是按照什么顺序搜索不同的命名空间? 命名空间与作用域的介绍 命名空间 大约来 ...

  3. ajax控制页面跳转

    一开始我是这么写的,一直报错,跳转路径解析不了,显示为问号: 前台html: <form> <table style="margin: 200px auto;"& ...

  4. CentOS Apache配置详解

    要想在linux上实现网页服务器(www)需要Apache这个服务器软件,不过Apache仅能提供最基本的静态网站数据而已,想要实现动态网站的话,最好还是要PHP与MySQL的支持,所以下面我们将会以 ...

  5. 7.css实现三角形

    1.效果: 2.代码: <!DOCTYPE html> <html lang="en"> <head> <meta charset=&qu ...

  6. 30. CentOS终端命令行显示中文乱码的解决方法

    安装CentOS的时候选择了中文,结果在终端不能显示中文,都是乱码,解决方法:修改/etc/sysconfig/i18n,内容为   代码如下: LANG="zh_CN.GB18030&qu ...

  7. delphi ios grid BindSourceDB bug

    BindSourceDB4.DataSet :=nil; BindSourceDB4.DataSet :=FDMemTable1; grid绑定后显示数据正常,第二次赋值BindSourceDB4.D ...

  8. Simple2D-17(音乐播放器)嵌入 ImGui 库

    要把 ImGui 应用到项目中,先拷贝方框中的源文件到项目: 这些文件是 ImGui 的实现源码,可作为第三方库新建一个文件夹进行放置. 接下来是渲染部分的代码,项目可能使用 DirectX 或 Op ...

  9. jenkins 没有maven选项,怎么办

    第一步: 进入jenkins,点系统管理 第二:插件管理 点击“可选插件”  然后在右边的过滤输入框中输入搜索关键字: Maven Integration  或者 Pipeline Maven Int ...

  10. find命令之时间戳使用示例

    查看当前目录以及子目录下哪些文件占用的空间最大: find  ./  -type  f  -exec du -m {} \; | sort -nr | head find  ./  -type  f ...