MD5加密算法是一种单向加密算法,即数据只能加密,而不能被解密。MD5加密算法有两个非常重要的特性:第一是任意两段数据,加密之后的密文是不相同的;第二是任意一段数据,经过加密以后,其结果永远是相同的。MD5加密算法在数字签名、电子商务、银行系统、证券系统、信息加密等领域中有着非常广泛的应用。那么,我今天就给大家介绍一下基于C语言的MD5加密算法如何实现。

一、MD5加密算法的原理与描述

MD5加密算法可以简要的叙述为:MD5以512位分组来处理输入的数据,且每一分组又被划分为16个32位子分组,经过一系列的处理后,算法的输出由四个32位分组组成,将这四个32位分组级联后将生成一个128位散列值,此散列值就是我们所需要的密文。MD5加密算法的具体步骤分析如下:

第一步:补位

首先对输入的数据进行补位,使得数据位长度(BitsLength)对512求余,其结果是448。补位始终要进行,即使数据位对512求余的结果已经是448。因此,数据位长度将被扩展至N*512+448,即N*64+56个字节(Bytes),N为一个正整数。补位的方法是,在数据的后面填充一个1和无数个0,直到满足上面的条件时才停止用0对数据的填充。

第二步:补数据长度

用一个64位的数字表示数据的原始长度,将这个数字的8个字节按低位在前,高位在后的顺序附加在补位后的数据后面。经过这两步的处理,现在的数据长度为:N*512+448+64,即(N+1)*512,长度恰好是512的倍数。

第三步:初始化MD5参数

4个32位的整型变量A,B,C,D(称为链接变量),用来计算数据摘要。每一个整型变量,都是以十六进制数表示的数值,低位的字节在前面,他们被初始化为:A=Ox01234567,B=Ox89abcdef,C=Oxfedcba98,D=Ox76543210。当设置好这四个链接变量后,就开始进入算法的四轮循环运算。在循环运算中将上面四个链接变量分别复制到另外四个变量中,即A复制到a,B复制到b,C复制到c,D复制到d。

第四步:定义MD5的位操作函数

定义4个位操作函数,分别为F、G、H和I,其中X,Y,Z为32位整数。具体形式如下:

F(X,Y,Z)=(X&Y)|((~X)&Z)G(X,Y,Z)=(X&Z)|(Y&(~Z))H(X,Y,Z)=X∧Y∧ZI(X,Y,Z)=Y∧(X|(~Z))

其中&、|、~和∧分别为:与、或、非和异或。这4个函数说明:如果X,Y和Z的对应位是独立和均匀的,那么结果的每一位也应是独立和均匀的。F是一个逐位运算的函数,即如果X,那么Y,否则Z。函数H是逐位奇偶操作符。

第五步:主循环四轮变换过程

主循环有四轮,每轮循环都很相似。每一轮进行16次操作,每次操作对a、b、c和d中的其中三个作一次非线性函数运算,然后将所得结果加上第四个变量,文本的一个子分组和一个常数。再将所得结果向右环移一个不定的数,并加上a、b、c或d中之一。最后用该结果取代a、b、c或d中之一。其中每一轮采用的非线性函数为上一步已经定义的4个位操作函数中的一个。

二、MD5加密算法的C语言实现

C语言是一种最新的、面向对象的高级编程语言,C语言增强了开发者的效率,同时也绝不损失C/C++原有的强大功能。C语言可以使程序员快速地编写各种基于Microsoft.NET平台的应用程序,Microsoft.NET提供了一系列的工具和服务来最大程度地开发利用计算与通讯领域。C语言可以通过各类组件方便的转化为XML网络服务,从而可以在任何操作系统上通过Internet进行调用。

其作用为:使用加密服务提供程序(CSP)提供的方法以完成对输入数据MD5哈希值的计,其命名空间为System.Security.Cryptography.MD5CryptoServiceProv-ider类中计算输入数据的哈希值方法如下:

publicbyte[]ComputeHash(byte[]buffer)

此方法只能接受byte类型数组作为最初的原始数据,输出的密文数据也是byte类型数组。因此,在对字符串加密之前,我们必须首先将这些字符串转化为byte类型数组,这就要用到UTF8Encoding类的GetBytes方法,将字符串转化为byte类型数组,而加密以后的结果也是使用数组输出。

在本加密演示系统中对用户输入的关键信息,如:姓名、身份证号码、密码等信息,采用MD5加密算法进行加密,以便对此关键信息进行更加安全的保护。MD5加密算法的C语言应用的关键程序段如下:

string

strpwd=this.txtMingWen.Text.Trim().

ToString();

//获取明文值的字符串

try

{

//将字符串转换为UTF8编码的byte型数组byte[]data=Encoding.UTF8.GetBytes(strpwd);

//实例化MD5CryptoServiceProvider类的对象MD5CryptoServiceProvidermService=newMD5Cryp-toServiceProvider();

//通过MD5CryptoServiceProvider类的方法Com-puteHash计算哈希值byte[]result=mService.ComputeHash(data);

stringstrhash=;intcount=result.Length;for(inti=0;i<count;i++)

{

//将每个byte型数据转换为十六进制的字符并组成字符串strhash+=string.Format({0:X},result[i]);

}

this.txtMiWen.Text=strhash;

//将密文值的结果显示出来

}

{
this.txtMiWen.Text=ex.Message;

//若产生异常显示异常情况

}

本加密演示系统运行的结果如图一所示:

基于C语言的MD5加密算法设计与实现

小知识之XML语言

用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。