MD5算法及源代码

合集下载

java中常用的md5方法

java中常用的md5方法

java中常用的md5方法Java是一种广泛使用的编程语言,特别适合用于开发各种类型的应用程序。

在Java中,MD5(Message-Digest Algorithm 5)是一种常用的哈希算法,用于产生唯一的消息摘要。

本文将详细介绍在Java中常用的MD5方法。

第一步:导入相关的包使用MD5算法需要导入Java的Security包。

在代码的开头加上以下导入语句:import java.security.MessageDigest;第二步:创建一个方法在Java中,我们可以创建一个方法用于计算MD5消息摘要。

下面是一个示例:public static String getMD5(String input) {try {MessageDigest md =MessageDigest.getInstance("MD5"); 创建MD5加密对象byte[] messageDigest = md.digest(input.getBytes()); 获取二进制摘要值转化为十六进制字符串形式StringBuilder hexString = new StringBuilder();for (byte b : messageDigest) {String hex = Integer.toHexString(0xFF & b);if (hex.length() == 1) {hexString.append('0');}hexString.append(hex);}return hexString.toString();} catch (Exception ex) {ex.printStackTrace();return null;}}第三步:调用方法要使用这个方法,只需在代码中调用getMD5()方法,并传递要进行MD5加密的消息作为参数。

以下是一个使用示例:String input = "Hello World";String md5Hash = getMD5(input);System.out.println("MD5加密后的结果:" + md5Hash);以上代码将输出:MD5加密后的结果:0a4d55a8d778e5022fab701977c5d840第四步:解释代码让我们来解释一下上面的代码。

加密系列MD5加密和解密算法详解代码示例

加密系列MD5加密和解密算法详解代码示例

加密系列MD5加密和解密算法详解代码示例MD5加密算法是一种广泛应用的密码加密算法,它将任意长度的数据映射为固定长度的128位哈希值。

MD5加密算法是不可逆的,即通过密文无法还原得到原始数据。

MD5加密算法的实现可以通过编写代码来完成。

下面是一个示例的MD5加密算法的代码:```import hashlibdef md5_encrypt(data):md5 = hashlib.md5md5.update(data.encode('utf-8'))return md5.hexdigestif __name__ == '__main__':data = input("请输入需要加密的数据:")encrypted_data = md5_encrypt(data)print("加密结果为:", encrypted_data)```以上代码实现了一个简单的MD5加密算法。

首先导入了`hashlib`模块,该模块提供了一系列用于数据加密的算法,包括MD5算法。

`md5_encrypt`函数接收一个字符串作为输入数据,并将其转换为字节流形式,然后使用`hashlib.md5`方法创建了一个MD5对象。

接着,通过调用MD5对象的`update`方法将输入数据添加到加密流程中。

最后,通过调用MD5对象的`hexdigest`方法获得加密后的结果,并将其返回。

在`if __name__ == '__main__'`下方的代码段中,首先获取用户输入的数据,然后调用`md5_encrypt`函数对其进行加密,并将结果打印到控制台。

下面是MD5解密算法的示例代码:```import hashlibdef md5_decrypt(encrypted_data):md5 = hashlib.md5md5.update(encrypted_data.encode('utf-8'))return md5.hexdigestif __name__ == '__main__':encrypted_data = input("请输入需要解密的数据:")decrypted_data = md5_decrypt(encrypted_data)print("解密结果为:", decrypted_data)```以上代码实现了一个简单的MD5解密算法。

详解C#实现MD5加密的示例代码

详解C#实现MD5加密的示例代码

详解C#实现MD5加密的⽰例代码C#实现MD5加密,具体如下:⽅法⼀⾸先,先简单介绍⼀下MD5MD5的全称是message-digest algorithm 5(信息-摘要算法,在90年代初由mit laboratory for computer science和rsa data security inc的ronald l. rivest开发出来,经md2、md3和md4发展⽽来。

MD5具有很好的安全性(因为它具有不可逆的特征,加过密的密⽂经过解密后和加密前的东东相同的可能性极⼩)引⽤using System.Security.Cryptography;using System.Text;具体代码如下(写在按钮的Click事件⾥):byte[] result = Encoding.Default.GetBytes(this.tbPass.Text.Trim()); //tbPass为输⼊密码的⽂本框MD5 md5 = new MD5CryptoServiceProvider();byte[] output = puteHash(result);this.tbMd5pass.Text = BitConverter.ToString(output).Replace("-",""); //tbMd5pass为输出加密⽂本的⽂本框⽅法⼆C# md5加密(上)string a; //加密前数据string b; //加密后数据b=System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(a,"MD5")using System;using System.Security.Cryptography;⽅法2public static string GetMD5(string myString){MD5 md5 = new MD5CryptoServiceProvider();byte[] fromData = System.Text.Encoding.Unicode.GetBytes(myString);byte[] targetData = puteHash(fromData);string byte2String = null;for (int i=0; i<targetData.Length; i++){byte2String += targetData[i].ToString("x");}return byte2String;}using System.Security.Cryptography;/// <summary>/// 给⼀个字符串进⾏MD5加密/// </summary>/// <param name="strText">待加密字符串</param>/// <returns>加密后的字符串</returns>public static string MD5Encrypt(string strText){MD5 md5 = new MD5CryptoServiceProvider();byte[] result = puteHash(System.Text.Encoding.Default.GetBytes(strText));return System.Text.Encoding.Default.GetString(result);}C# MD5加密using System.Security.Cryptography;private void btnOK_Click(object sender, System.EventArgs e){string strConn = "server=192.168.0.51;database=chengheng;User id=sa; password=123";if(texName.Text.Trim()==""){this.RegisterStartupScript("sf","<script language='javascript'>alert('⽤户名不能为空');document.all('texName').focus()</script>"); return;}else if(texPassword.Text.Trim()==""){this.RegisterStartupScript("sfs","<script language='javascript'>alert('密码不能为空');document.all('texPassword').focus()</script>"); return;}else{//将获取的密码加密与数据库中加了密的密码相⽐较byte[] by = puteHash(utf.GetBytes(texPassword.Text.Trim()));string resultPass = System.Text.UTF8Encoding.Unicode.GetString(by);conn.ConnectionString=strConn;SqlCommand comm = new SqlCommand();string name = texName.Text.Trim().ToString();mandText="select Ruser_pwd,Ruser_nm from Ruser where Accountno = @name";comm.Parameters.Add("@name",SqlDbType.NVarChar,40);comm.Parameters["@name"].Value=name;try{conn.Open();comm.Connection=conn;SqlDataReader dr=comm.ExecuteReader();if(dr.Read()){//⽤户存在,对密码进⾏检查if(dr.GetValue(0).Equals(resultPass)){string user_name=dr.GetValue(1).ToString();string user_Accountno=texName.Text.Trim();Session["logon_name"]=user_name;Session["logon_Accountno"]=user_Accountno;//登录成功,进⾏页⾯导向}else{this.RegisterStartupScript("wp","<script language='javascript'>alert('密码错误,请检查。

MD5加密C语言实现

MD5加密C语言实现

MD5加密C语言实现MD5 (Message Digest Algorithm 5) 是一种常用的密码散列函数,用于将数据加密为128位长度的摘要。

在C语言中,可以通过一系列步骤来实现MD5加密算法。

1.准备工作:首先需要包含一些C标准头文件和预定义常量。

在C语言中,可以使用以下代码来实现:```c#include <stdio.h>#include <stdlib.h>#include <string.h>#include <stdint.h>#define HASH_LENGTH 16```2.定义数据结构:MD5算法涉及到一个64字节的消息块和一个4字节的消息摘要块。

在C语言中,可以使用以下代码来定义这些结构:```ctypedef structuint8_t data[64];uint32_t datalen;uint32_t bitlen[2];uint32_t state[4];}MD5_CTX;typedef uint8_t (*hash_function)(uint8_t *);```3.定义常量和函数:MD5算法使用到一些常量和函数。

在C语言中,可以使用以下代码来定义这些常量和函数:```cconst uint32_t k[64] =// more constants ...};const uint32_t r[64] =7,12,17,22,7,12,17,22,// more constants ...};void md5_transform(MD5_CTX *ctx, uint8_t data[]);void md5_init(MD5_CTX *ctx)ctx->datalen = 0;ctx->bitlen[0] = 0;ctx->bitlen[1] = 0;ctx->state[1] = 0xEFCDAB89;ctx->state[2] = 0x98BADCFE;void md5_update(MD5_CTX *ctx, uint8_t data[], uint32_t len) for (uint32_t i = 0; i < len; i++)ctx->data[ctx->datalen] = data[i];ctx->datalen++;if (ctx->datalen == 64)md5_transform(ctx, ctx->data);ctx->bitlen[0] += 512;ctx->bitlen[1] += (ctx->bitlen[0] < 512);ctx->datalen = 0;}}void md5_final(MD5_CTX *ctx, uint8_t hash[])uint32_t i = ctx->datalen;if (ctx->datalen < 56)ctx->data[i++] = 0x80;while (i < 56)ctx->data[i++] = 0x00;}} elsectx->data[i++] = 0x80;while (i < 64)ctx->data[i++] = 0x00;}md5_transform(ctx, ctx->data);memset(ctx->data, 0, 56);}ctx->bitlen[0] += ctx->datalen * 8;ctx->bitlen[1] += (ctx->bitlen[0] < ctx->datalen * 8); ctx->data[63] = ctx->bitlen[0] & 0xff;ctx->data[62] = (ctx->bitlen[0] >> 8) & 0xff;ctx->data[61] = (ctx->bitlen[0] >> 16) & 0xff;ctx->data[60] = (ctx->bitlen[0] >> 24) & 0xff;ctx->data[59] = ctx->bitlen[1] & 0xff;ctx->data[58] = (ctx->bitlen[1] >> 8) & 0xff;ctx->data[57] = (ctx->bitlen[1] >> 16) & 0xff;ctx->data[56] = (ctx->bitlen[1] >> 24) & 0xff;md5_transform(ctx, ctx->data);for (i = 0; i < 4; i++)hash[i] = (ctx->state[0] >> (i * 8)) & 0xff;hash[i + 4] = (ctx->state[1] >> (i * 8)) & 0xff;hash[i + 8] = (ctx->state[2] >> (i * 8)) & 0xff;hash[i + 12] = (ctx->state[3] >> (i * 8)) & 0xff;}void md5_transform(MD5_CTX *ctx, uint8_t data[])uint32_t a, b, c, d, f, g, temp;uint32_t m[16], i, j;for (i = 0, j = 0; i < 16; i++, j += 4)m[i] = (data[j]) + (data[j + 1] << 8) + (data[j + 2] << 16) + (data[j + 3] << 24);}a = ctx->state[0];b = ctx->state[1];c = ctx->state[2];d = ctx->state[3];for (i = 0; i < 64; i++)if (i < 16)f=(b&c),((~b)&d);g=i;} else if (i < 32)f=(d&b),((~d)&c);g=(5*i+1)%16;} else if (i < 48)f=b^c^d;g=(3*i+5)%16;} elsef=c^(b,(~d));g=(7*i)%16;}temp = d;d=c;c=b;b = b + leftrotate((a + f + k[i] + m[g]), r[i]);a = temp;}ctx->state[0] += a;ctx->state[1] += b;ctx->state[2] += c;ctx->state[3] += d;```4.实现加密函数:最后,可以编写一个简单的调用MD5算法的加密函数。

MD5算法原理及代码实现

MD5算法原理及代码实现

MD5算法原理及代码实现MD5(Message Digest Algorithm 5)是一种被广泛使用的消息摘要算法,它是MD家族中的第五个版本。

MD5算法能将任意长度的输入数据转换为一个128位(16字节)的散列值,通常表示为32个十六进制数。

1. 填充(Padding):为了使输入消息的位数对512求余数等于448,填充是必要的。

例如,如果输入消息的位数是L,填充后的消息长度为K* 512 + 448,其中K是一个非负整数。

填充后的消息被分为512位(64字节)的块。

2. 初始化(Initialization):算法对四个32位的缓冲区A、B、C、D进行初始化,通常初始化为常量。

这些缓冲区用于保存中间计算结果。

3. 循环(Iteration):通过进行四轮循环的操作,将每个512位的块以及前一个块的连续散列结果作为输入,产生新的散列结果。

每轮循环包括四个步骤:数据的复制、数据的变换、数据的交换以及数据的加法。

4. 输出(Output):将最后一轮循环的输出结果根据顺序连接起来,形成128位的散列值。

下面是一个简单的MD5算法的代码示例,使用Python语言实现:```pythonimport hashlibdef md5(message):md5_hash = hashlib.md5md5_hash.update(message.encode('utf-8'))return md5_hash.hexdigest#测试message = "Hello, world!"md5_value = md5(message)print("MD5 hash value:", md5_value)```在上述代码中,我们首先导入了Python标准库中的hashlib模块,该模块提供了MD5算法的实现。

然后,我们定义了一个名为md5的函数,它接受一个字符串形式的消息作为输入,并返回该消息的MD5散列值。

单向散列算法--MD5算法逆向分析

单向散列算法--MD5算法逆向分析

单向散列算法--MD5算法逆向分析单向散列算法之——MD5算法MD5算法(Message-Digest Algorithm 5)属于单向散列算法的⼀种。

它的功能是将任意长度的消息在经过处理后输出⼀个128位的信息,从⽽实现加密,此加密不可逆,即⽆法通过密⽂反推出输⼊的信息。

1、算法原理(1)数据填充填充待加密的消息使其长度与448模512同余(即消息长度=448mod512,byte=56mod64)。

因此,消息的长度被拓展⾄N*512+448(位),即N*64+56(字节)。

换句话说,填充后的消息长度⽐512的倍数⼩64位的数。

注意,即使消息长度本⾝已经满⾜上述需求,仍然需要填充。

填充⽅法是在数的后⾯附⼀个1,然后⽤0来进⾏填充,直到满⾜填充要求。

⾄少填充1位,⾄多填充512位。

(2)添加长度在第⼀步的结果后添加64位长度的数据填充之前的消息长度(消息长度指位的长度)。

如果填充前的消息长度⼤于264则取其低64位。

在添加完长度后,最终消息长度是512的整数倍((N+1)*512位)。

(3)初始化变量⽤四个变量(A,B,C,D)计算信息摘要。

A,B,C,D分别为⼀个32位的寄存器,⽤⼗六进制数初始化为A=01234567h,B=89abcdefh,C=fedcba98h,D=76543210h。

由于Intel x86系列都使⽤⼩端序进⾏存储,所以在程序初始化时要注意书写顺序。

(4)数据处理以512位分组位单位处理消息,⾸先定义4个辅助函数,每个都是以3个32位双字作为输⼊,输出为⼀个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轮变换是对进⼊主循环的512位消息分组的16个32位字(即每512位消息,再划分位16个32位消息进⾏处理)分别进⾏如下操作:使⽤临时变量a,b,c,d中的三个经F,G,H,I变换后的结果与第4个相加,再加上32位字和⼀个32位字的加法常数,并将所得值循环左移若⼲位,最后将所得结果加上a,b,c,d之⼀,并返回A,B,C,D,由此完成⼀次循环。

C语言实现MD5算法

C语言实现MD5算法

C语言实现MD5算法MD5(Message-Digest Algorithm 5)是一种常用的哈希函数算法,广泛用于验证数据完整性、密码存储和数字证书等领域。

下面是使用C语言实现MD5算法的代码。

这段代码包含了MD5算法的各个步骤,包括初始化MD5结构体、填充数据、更新状态、计算摘要等。

```c#include <stdio.h>#include <stdint.h>#include <string.h>//定义MD5常量#define B 0xEFCDAB89#define C 0x98BADCFE//循环左移宏定义#define LEFT_ROTATE(x, n) (((x) << (n)) , ((x) >> (32-(n)))) //填充消息void padMessage(uint8_t *message, uint32_t length)//计算需要填充的字节数uint32_t padLength = (length % sizeof(uint32_t) == 56) ? 64 : 56;padLength = padLength - (length % sizeof(uint32_t));//填充1位1message[length++] = 0x80;//填充0位for (uint32_t i = 0; i < padLength; i++) message[length++] = 0x00;}//在消息末尾添加原始消息的长度(以位表示)for (uint32_t i = 0; i < sizeof(uint32_t); i++) message[length++] = (length << 3) >> (i * 8); }//初始化MD5结构体void initMD5(uint32_t *state)state[0] = A;state[1] = B;state[2] = C;state[3] = D;//更新状态void updateState(uint32_t *state, uint32_t *M)uint32_t A = state[0], B = state[1], C = state[2], D = state[3];//定义MD5循环运算函数#define MD5_FUNCTION(a, b, c, d, k, s, i) \a=b+LEFT_ROTATE((a+F(b,c,d)+M[k]+T[i]),s)//迭代压缩消息MD5_FUNCTION(A,B,C,D,0,7,1);MD5_FUNCTION(D,A,B,C,1,12,2);MD5_FUNCTION(C,D,A,B,2,17,3);MD5_FUNCTION(B,C,D,A,3,22,4);MD5_FUNCTION(A,B,C,D,4,7,5);MD5_FUNCTION(D,A,B,C,5,12,6);MD5_FUNCTION(C,D,A,B,6,17,7);MD5_FUNCTION(B,C,D,A,7,22,8);MD5_FUNCTION(A,B,C,D,8,7,9);MD5_FUNCTION(D,A,B,C,9,12,10);MD5_FUNCTION(C,D,A,B,10,17,11);MD5_FUNCTION(B,C,D,A,11,22,12);MD5_FUNCTION(A,B,C,D,12,7,13);MD5_FUNCTION(C,D,A,B,14,17,15); MD5_FUNCTION(B,C,D,A,15,22,16); MD5_FUNCTION(A,B,C,D,1,5,17); MD5_FUNCTION(D,A,B,C,6,9,18); MD5_FUNCTION(C,D,A,B,11,14,19); MD5_FUNCTION(B,C,D,A,0,20,20); MD5_FUNCTION(A,B,C,D,5,5,21); MD5_FUNCTION(D,A,B,C,10,9,22); MD5_FUNCTION(C,D,A,B,15,14,23); MD5_FUNCTION(B,C,D,A,4,20,24); MD5_FUNCTION(A,B,C,D,9,5,25); MD5_FUNCTION(D,A,B,C,14,9,26); MD5_FUNCTION(C,D,A,B,3,14,27); MD5_FUNCTION(B,C,D,A,8,20,28); MD5_FUNCTION(A,B,C,D,13,5,29); MD5_FUNCTION(D,A,B,C,2,9,30); MD5_FUNCTION(C,D,A,B,7,14,31); MD5_FUNCTION(B,C,D,A,12,20,32);MD5_FUNCTION(D,A,B,C,8,11,34); MD5_FUNCTION(C,D,A,B,11,16,35); MD5_FUNCTION(B,C,D,A,14,23,36); MD5_FUNCTION(A,B,C,D,1,4,37); MD5_FUNCTION(D,A,B,C,4,11,38); MD5_FUNCTION(C,D,A,B,7,16,39); MD5_FUNCTION(B,C,D,A,10,23,40); MD5_FUNCTION(A,B,C,D,13,4,41); MD5_FUNCTION(D,A,B,C,0,11,42); MD5_FUNCTION(C,D,A,B,3,16,43); MD5_FUNCTION(B,C,D,A,6,23,44); MD5_FUNCTION(A,B,C,D,9,4,45); MD5_FUNCTION(D,A,B,C,12,11,46); MD5_FUNCTION(C,D,A,B,15,16,47); MD5_FUNCTION(B,C,D,A,2,23,48); MD5_FUNCTION(A,B,C,D,0,6,49); MD5_FUNCTION(D,A,B,C,7,10,50); MD5_FUNCTION(C,D,A,B,14,15,51);MD5_FUNCTION(A,B,C,D,12,6,53); MD5_FUNCTION(D,A,B,C,3,10,54); MD5_FUNCTION(C,D,A,B,10,15,55); MD5_FUNCTION(B,C,D,A,1,21,56); MD5_FUNCTION(A,B,C,D,8,6,57); MD5_FUNCTION(D,A,B,C,15,10,58); MD5_FUNCTION(C,D,A,B,6,15,59); MD5_FUNCTION(B,C,D,A,13,21,60); MD5_FUNCTION(A,B,C,D,4,6,61); MD5_FUNCTION(D,A,B,C,11,10,62); MD5_FUNCTION(C,D,A,B,2,15,63); MD5_FUNCTION(B,C,D,A,9,21,64); #undef MD5_FUNCTION//更新状态state[0] += A;state[1] += B;state[2] += C;state[3] += D;//计算MD5摘要void md5(uint8_t *message, uint32_t length, uint32_t *digest) //初始化MD5结构体uint32_t state[4];initMD5(state);//填充消息padMessage(message, length);//计算消息分组数量uint32_t numOfBlocks = length / 64;//处理每个分组for (uint32_t i = 0; i < numOfBlocks; i++)uint32_t M[16];memcpy(M, message + (i * 64), 64);//更新状态updateState(state, M);}//获取MD5摘要memcpy(digest, state, 16);int mai//测试用例uint8_t message[] = "Hello, MD5!";uint32_t length = sizeof(message) - 1;//计算MD5摘要uint32_t digest[4];md5(message, length, digest);//输出摘要printf("MD5 Digest: ");for (int i = 0; i < 4; i++)printf("%02x", ((uint8_t*)digest)[i]);}printf("\n");return 0;```以上是使用C语言实现MD5算法的代码。

MD5源代码

MD5源代码

Md5源代码using System;using System.Collections.Generic;using System.Text;using System.IO;using System.Security.Cryptography;namespace CSharpMD5{class Program{static void Main(string[] args){CreatNew();}public static void CreatNew(){string name = "";string fileNameMD5 = "";string code = "";string code2 = "";string codeMD5 = "";do{try{Console.WriteLine("输入用户名:");name = Console.ReadLine();fileNameMD5 = GetMD5(name);string filename = @"c:\" + fileNameMD5 + ".data";if (File.Exists(filename)){Console.WriteLine("密码文件已存在,是否修改密码? y/n");string temp = "";temp = Console.ReadLine();if (temp == "Y" || temp == "y"){//File.Delete(filename);Enter(fileNameMD5);}else{CreatNew();}}else{code = SetCode();codeMD5 = GetMD5(code);SaveToFile(filename, codeMD5);}}catch (Exception e){Console.WriteLine(e.ToString());}} while (code != code2);}public static void Enter(string fileNameMD5){string fileName = @"c:\" + fileNameMD5 + ".data";string codeBuffer = "";string code = "";try{using (StreamReader sr = new StreamReader(fileName)) {string temp;while ((temp = sr.ReadLine()) != null){codeBuffer += temp;}}Console.WriteLine("输入原密码:");string codeTemp = Console.ReadLine();codeTemp = GetMD5(codeTemp);if (codeTemp == codeBuffer){code = SetCode();SaveToFile(fileName, code);}else{Console.WriteLine("密码错误!");return;}}catch (Exception e){Console.WriteLine("The file could not be read:");Console.WriteLine(e.Message);}}public static string GetMD5(string str){string temp = "";try{MD5CryptoServiceProvider md5Hasher = new MD5CryptoServiceProvider();UTF8Encoding encoder = new UTF8Encoding();byte[] hashedDataBytes = puteHash(encoder.GetBytes(str)); temp = System.BitConverter.ToString(hashedDataBytes);temp = temp.Replace("-", "");}catch (Exception e){Console.WriteLine(e.Message);}return temp;}public static string SetCode(){string code = "";string code2 = "";try{do{Console.WriteLine("输入新口令:");code = Console.ReadLine();Console.WriteLine("请再次输入口令确认:");code2 = Console.ReadLine();if (code != code2)Console.WriteLine("两次输入的口令不一致,请重新输入!\n");} while (code != code2);}catch (Exception e){Console.WriteLine(e.Message);}return code;}public static void SaveToFile(string fileName, string text){FileStream fs = new FileStream(fileName, FileMode.Append, FileAccess.Write, FileShare.Write);fs.Close();StreamWriter sw = new StreamWriter(fileName, true, Encoding.ASCII);sw.WriteLine(text + '\n');sw.Close();Console.WriteLine("文件建立成功!");}}}========================================================================================================================================================。

JAVA生成MD5校验码及算法实现

JAVA生成MD5校验码及算法实现

JAVA生成MD5校验码及算法实现MD5是一种常用的消息摘要算法,用于验证数据完整性和生成校验码。

在Java中,可以使用`java.security.MessageDigest`类来实现MD5算法,以下是实现MD5算法的步骤和代码示例。

步骤1:获取MessageDigest实例首先,需要获取`MessageDigest`类的实例来计算MD5摘要。

可以通过`getInstance`方法传入算法名称来获取实例。

MD5算法的算法名称为"MD5"。

```javaimport java.security.MessageDigest;import java.security.NoSuchAlgorithmException;public class MD5Generatorpublic static void main(String[] args)try// 获取MD5的MessageDigest实例MessageDigest md = MessageDigest.getInstance("MD5");//执行后续操作} catch (NoSuchAlgorithmException e)e.printStackTrace(;}}```步骤2:计算MD5摘要接下来,可以使用`MessageDigest`实例的`digest`方法计算MD5摘要。

该方法接受一个字节数组作为输入,并返回一个计算好的摘要值的字节数组。

```javabyte[] data = "Hello, World!".getBytes(;byte[] digest = md.digest(data);```步骤3:转换为十六进制字符串MD5摘要通常以十六进制字符串的形式表示。

可以使用以下代码将摘要值转换为十六进制字符串。

```javaStringBuilder sb = new StringBuilder(;for (byte b : digest)String hex = Integer.toHexString(b & 0xff);if (hex.length( == 1)sb.append("0");}sb.append(hex);String md5 = sb.toString(;System.out.println("MD5: " + md5);```步骤4(可选):使用Base64编码生成校验码如果需要以可读的方式展示校验码(例如作为字符串),可以使用Base64编码对摘要值进行编码。

MD5算法详解

MD5算法详解

MD5算法详解前⾯⼀篇,带⼤家对加密算法进⾏了鸟瞰,本篇主要谈md5算法的实现。

MD5:Message-Digest Algorithm 5(信息摘要5),确保信息的完整性。

其算法是1992年公开的,那时我才⼏岁,鉴于⼤家对md5都很熟悉,且程序中经常应⽤,我就不再介绍了。

我简单的介绍下设计者。

其⼈是罗纳德·李维斯特,美国密码学家,后来发明了⾮对称秘钥RSA 算法,因这个算法的在信息安全中的突破与重要性⽽获得了2002年的图灵奖。

好了,接下来⼀起看算法步骤以及源代码:1、填充在MD5算法中,⾸先需要对信息进⾏填充,使其位长对512求余的结果等于448,并且填充必须进⾏,使其位长对512求余的结果等于448。

因此,信息的位长(Bits Length)将被扩展⾄N*512+448,N为⼀个⾮负整数,N可以是零。

理解:位长,就是位数。

⽐如⼀个“wbq”,字符串是三个字节存储,⼀个字节8bit,所以位长就是24。

⽤数学语⾔可能更简洁:设M为位长,当且仅当 M%512==448时,才可以处理。

换另⼀种表⽰⽅式,M=N*512+448 ,N>=0填充的⽅法如下:1) 在信息的后⾯填充⼀个1和⽆数个0,直到满⾜上⾯的条件时才停⽌⽤0对信息的填充。

2) 在这个结果后⾯附加⼀个以64位⼆进制表⽰的填充前信息长度(单位为Bit),如果⼆进制表⽰的填充前信息长度超过64位,则取低64位。

经过这两步的处理,M=N*512+448+64=(N+1)*512,即长度恰好是512的整数倍。

这样做的原因是为满⾜后⾯处理中对信息长度的要求。

经过两步处理后,信息变成了这样,如下图所⽰:64位,8个字节,⽤来表⽰原始信息的位长。

1private static UInt32[] MD5_Append(byte[] input)2 {3int zeros = 0;4int ones = 1;5int size = 0;6int n = input.Length;7int m = n % 64;8if (m < 56)9 {10 zeros = 55 - m;11 size = n - m + 64;12 }13else if (m == 56)14 {15 zeros = 0;16 ones = 0;17 size = n + 8;18 }19else20 {21 zeros = 63 - m + 56;22 size = n + 64 - m + 64;23 }2425 ArrayList bs = new ArrayList(input);26if (ones == 1)27 {28 bs.Add((byte)0x80); // 0x80 = $1000000029 }30for (int i = 0; i < zeros; i++)31 {32 bs.Add((byte)0);33 }3435 UInt64 N = (UInt64)n * 8;36byte h1 = (byte)(N & 0xFF);37byte h2 = (byte)((N >> 8) & 0xFF);3839byte h3 = (byte)((N >> 16) & 0xFF);40byte h4 = (byte)((N >> 24) & 0xFF);41byte h5 = (byte)((N >> 32) & 0xFF);42byte h6 = (byte)((N >> 40) & 0xFF);43byte h7 = (byte)((N >> 48) & 0xFF);44byte h8 = (byte)(N >> 56);45 bs.Add(h1);46 bs.Add(h2);47 bs.Add(h3);48 bs.Add(h4);49 bs.Add(h5);50 bs.Add(h6);51 bs.Add(h7);52 bs.Add(h8);53byte[] ts = (byte[])bs.ToArray(typeof(byte));5455/* Decodes input (byte[]) into output (UInt32[]). Assumes len is56 * a multiple of 4.57*/58 UInt32[] output = new UInt32[size / 4];59for (Int64 i = 0, j = 0; i < size; j++, i += 4)60 {61 output[j] = (UInt32)(ts[i] | ts[i + 1] << 8 | ts[i + 2] << 16 | ts[i + 3] << 24);62 }63return output;64 }说明,补多少0,如何补?第7⾏,求余。

md5加密算法的C(C++)代码实现(完整)

md5加密算法的C(C++)代码实现(完整)

正是因为这个原因,现在被黑客使用最多的一种破译密码的方法就是一种被称为"跑字典"的方法。有两种方法得到字典,一种是日常搜集的用做密码的字符串表,另一种是用排列组合方法生成的,先用md5程序计算出这些字典项的md5值,然后再用目标的md5值在这个字典中检索。我们假设密码的最大长度为8位字节(8 bytes),同时密码只能是字母和数字,共26+26+10=62个字符,排列组合出的字典的项数则是p(62,1)+p(62,2)…。+p(62,8),那也已经是一个很天文的数字了,存储这个字典就需要tb级的磁盘阵列,而且这种方法还有一个前提,就是能获得目标账户的密码md5值的情况下才可以。这种加密技术被广泛的应用于unix系统中,这也是为什么unix系统比一般操作系统更为坚固一个重要原因。
<< 这四轮(64步)是:
第一轮
ff(a,b,c,d,m0,7,0xd76aa478)
ff(d,a,b,c,m1,12,0xe8c7b756)
ff(c,d,a,b,m2,17,0x242070db)
ff(b,c,d,a,m3,22,0xc1bdceee)
将上面四个链接变量复制到另外四个变量中:a到a,b到b,c到c,d到d.
主循环有四轮(md4只有三轮),每轮循环都很相似。第一轮进行16次操作。每次操作对a、b、c和d中的其中三个作一次非线性函数运算,然后将所得结果加上第四个变量,文本的一个子分组和一个常数。再将所得结果向右环移一个不定的数,并加上a、b、c或d中之一。最后用该结果取代a、b、c或d中之一。
rivest在1989年开发出md2算法。在这个算法中,首先对信息进行数据补位,使信息的字节长度是16的倍数。然后,以一个16位的检验和追加到信息末尾。并且根据这个新产生的信息计算出散列值。后来,rogier和chauvaud发现如果忽略了检验和将产生md2冲突。md2算法的加密后结果是唯一的——既没有重复。

MD5算法详细介绍

MD5算法详细介绍

MD5算法详细介绍MD5(Message Digest Algorithm 5)是一种常用的哈希算法,用于将任意长度的数据块转换为固定长度(128位)的哈希值。

它由美国密码学家Ronald Rivest设计于1991年,并于1992年公开发表。

1.原理:填充:将输入数据的位数补足至64位的倍数。

划分:将填充后的数据分为若干个512位(64字节)的数据块。

循环:对每个数据块进行MD5压缩函数的操作,生成中间结果。

输出:将所有中间结果拼接,得到最终的128位哈希值。

2.算法流程:F函数:将输入数据进行位运算和逻辑运算,生成一个32位中间结果。

G函数:将F函数的中间结果进行不同的位运算和逻辑运算,生成另一个32位中间结果。

H函数:将G函数的中间结果进行不同的位运算和逻辑运算,生成第三个32位中间结果。

I函数:将H函数的中间结果进行不同的位运算和逻辑运算,生成最终的32位中间结果。

3.特点:(1)填充:MD5算法对输入数据进行位数填充,确保输入数据长度是64的倍数,增加了算法的安全性和可靠性。

(2)复杂性:MD5算法通过多轮的循环和逻辑运算,使得哈希值与输入数据之间没有明显的关联,确保了哈希值的唯一性。

(3)高效性:MD5算法在生成128位哈希值的同时,具有较高的执行速度,适用于处理大规模数据的场景。

(4)安全性:MD5算法能够抵抗常见的哈希碰撞攻击和逆向破解,但在一些特殊情况下可能存在安全漏洞,因此在安全加密领域中被一些更安全的算法所取代。

总之,MD5算法是一种广泛应用于安全领域的哈希算法,具有填充、循环和输出等特点。

它能够将任意长度的数据块转换为固定长度的哈希值,并满足唯一性、不可逆转和高效性的要求。

然而,由于其存在一些安全性上的缺陷,建议在对数据进行安全加密和传输时,选择更加安全可靠的算法。

c语言md5加密函数

c语言md5加密函数

c语言md5加密函数【最新版】目录1.MD5 加密算法简介2.C 语言中的 MD5 加密函数3.MD5 加密函数的使用示例正文【1.MD5 加密算法简介】MD5 加密算法是一种广泛应用的哈希函数,它可以将任意长度的明文转换为固定长度的密文。

MD5 加密算法的主要特点是加密速度快、安全性高,适用于各种数据加密和完整性校验场景。

【2.C 语言中的 MD5 加密函数】在 C 语言中,我们可以使用第三方库如 crypto++或自行编写 MD5 加密函数。

这里以 crypto++库为例,介绍如何在 C 语言中使用 MD5 加密函数。

首先,需要安装 crypto++库。

在 Linux 系统下,可以使用以下命令进行安装:```bashsudo apt-get install libcrypto++-dev```然后,在 C 代码中引入 crypto++库:```cpp#include <iostream>#include <crypto++/md5.h>```接下来,可以编写一个 MD5 加密函数:```cppstd::string md5_encrypt(const std::string& input) {std::string output;CryptoPP::MD5 md5;md5.Update(input.c_str(), input.size());md5.Final(output.begin(), output.end());return output;}```【3.MD5 加密函数的使用示例】以下是一个使用上述 MD5 加密函数的简单示例:```cppint main() {std::string input = "Hello, world!";std::string encrypted = md5_encrypt(input);std::cout << "原始字符串:" << input << std::endl;std::cout << "加密后的字符串:" << encrypted << std::endl; return 0;}```运行上述代码,可以得到加密后的字符串。

md5加密用法范文

md5加密用法范文

md5加密用法范文MD5是一种广泛使用的密码哈希函数,也是一种常见的加密算法。

下面将介绍MD5加密的用法、工作原理、优缺点以及如何使用MD5来加密数据。

一、MD5加密的用法:MD5加密算法最常见的用法是将密码或敏感信息加密存储在数据库中,以保护用户的隐私。

它可以用于用户登录、验证数据完整性、数字签名等应用场景。

MD5加密还常用于文件校验和,用于验证文件在传输过程中是否被修改。

此外,MD5还可以用于生成随机的摘要值,以作为数据的唯一标识。

二、MD5加密的工作原理:MD5加密算法是将输入的数据(如密码、文本等)通过MD5算法计算得到128位(16字节)的哈希值,这个哈希值是一个固定长度的串。

MD5算法的工作原理如下:1.对输入数据进行数据填充,使得输入数据长度满足512位的倍数。

2.将填充后的数据分为若干个512位(64字节)的分组。

3.对每个分组进行四轮运算(将初始的4个32位的寄存器每轮更新一次),最终得到每个分组的消息摘要。

4.将所有分组的消息摘要连接起来,得到最终的MD5哈希值。

三、MD5加密的优缺点:MD5加密算法有一些优点,如加密速度快、生成的哈希值固定长度等。

然而,MD5加密也存在一些缺点,导致现在已不再推荐使用:1.易碰撞:MD5算法被广泛破解,存在碰撞问题。

也就是说,不同的输入可能导致相同的MD5哈希值,这降低了MD5的安全性。

2.易被暴力破解:MD5哈希值可以通过穷举法暴力破解,也就是通过尝试将不同的输入与目标MD5哈希值进行比对,找到对应的明文。

3.不抗彩虹表攻击:彩虹表是一种预先计算的哈希表,用于快速破解MD5哈希值。

通过使用彩虹表,黑客可以更快地找到对应的明文。

基于以上缺点,现在通常不再推荐使用MD5加密算法来存储密码等敏感信息。

而是采用更为安全的加密算法,如SHA-256四、如何使用MD5来加密数据:尽管MD5算法已被破解,并不再安全,这里还是介绍一下如何使用MD5来加密数据。

C++ MD5算法

C++ MD5算法

C++出现的问题杂锦(逐步累积)MD5算法及vc实现(一个MD5对象)- -(1)MD5简介MD5的全称是Message-Digest Algorithm 5,在90年代初由MIT的计算机科学实验室和RSA Data Security Inc发明,经MD2、MD3和MD4发展而来。

Message-Digest泛指字节串(Message)的Hash变换,就是把一个任意长度的字节串变换成一定长的大整数。

请注意我使用了“字节串”而不是“字符串”这个词,是因为这种变换只与字节的值有关,与字符集或编码方式无关。

MD5将任意长度的“字节串”变换成一个128bit的大整数,并且它是一个不可逆的字符串变换算法,换句话说就是,即使你看到源程序和算法描述,也无法将一个MD5的值变换回原始的字符串,从数学原理上说,是因为原始的字符串有无穷多个,这有点象不存在反函数的数学函数。

MD5的典型应用是对一段Message(字节串)产生fingerprint(指纹),以防止被“篡改”。

举个例子,你将一段话写在一个叫readme.txt文件中,并对这个readme.txt产生一个MD5的值并记录在案,然后你可以传播这个文件给别人,别人如果修改了文件中的任何内容,你对这个文件重新计算MD5时就会发现。

如果再有一个第三方的认证机构,用MD5还可以防止文件作者的“抵赖”,这就是所谓的数字签名应用。

MD5还广泛用于加密和解密技术上,在很多操作系统中,用户的密码是以MD5值(或类似的其它算法)的方式保存的,用户Login的时候,系统是把用户输入的密码计算成MD5值,然后再去和系统中保存的MD5值进行比较,而系统并不“知道”用户的密码是什么。

一些黑客破获这种密码的方法是一种被称为“跑字典”的方法。

有两种方法得到字典,一种是日常搜集的用做密码的字符串表,另一种是用排列组合方法生成的,先用MD5程序计算出这些字典项的MD5值,然后再用目标的MD5值在这个字典中检索。

cuda编程实现md5算法

cuda编程实现md5算法

cuda编程实现md5算法MD5是一种常用的哈希算法,通常用于数据完整性验证和密码存储。

然而,MD5算法并不适合用于加密,因为存在已知的攻击可以使其在理论上被破解。

在CUDA编程中实现MD5算法涉及到并行计算,这可以显著提高算法的执行速度。

以下是一个简单的示例,说明如何在CUDA中实现MD5算法。

请注意,这个示例是为了教学目的而提供的,可能不是最优的实现。

在实际应用中,您可能需要考虑更多的优化措施。

```cppinclude <iostream>include <vector>include <thrust/device_>include <thrust/>include <thrust/iterator/zip_>include <thrust/execution_>include <thrust/cuda/>int main(void){// 输入数据std::string input = "Hello, world!";thrust::device_vector<char> d_input(_str(), _str() + () + 1);thrust::device_vector<unsigned int> d_output(16); // 存储16个32位无符号整数,对应于MD5哈希的输出// 计算MD5哈希值thrust::cuda::md5 hash(d_(), d_());hash(thrust::device, d_());// 将结果复制回主机并打印std::vector<unsigned int> output(d_(), d_());std::cout << "MD5 hash: ";for (int i = 0; i < (); i++) {std::cout << std::hex << output[i] << " ";}std::cout << std::endl;return 0;}```这个示例使用了Thrust库,这是一个C++模板库,用于编写并行算法。

MD5-加密算法以及原理-delphi版

MD5-加密算法以及原理-delphi版

1.MD5算法说明一、补位二、补数据长度三、初始化MD5参数四、处理位操作函数五、主要变换过程六、输出结果补位:MD5算法先对输入的数据进行补位,使得数据位长度LEN对512求余的结果是448。

即数据扩展至K*512+448位。

即K*64+56个字节,K为整数。

具体补位操作:补一个1,然后补0至满足上述要求。

补数据长度:用一个64位的数字表示数据的原始长度B,把B用两个32位数表示。

这时,数据就被填补成长度为512位的倍数。

初始化MD5参数:四个32位整数(A,B,C,D) 用来计算信息摘要,初始化使用的是十六进制表示的数字A=0X01234567B=0X89abcdefC=0Xfedcba98D=0X76543210处理位操作函数:X,Y,Z为32位整数。

F(X,Y,Z) = X&Y|NOT(X)&ZG(X,Y,Z) = X&Z|Y?(Z)H(X,Y,Z) = X xor Y xor ZI(X,Y,Z) = Y xor (X|not(Z))主要变换过程:使用常数组T[1 ... 64],T[i]为32位整数用16进制表示,数据用16个32位的整数数组M[]表示。

具体过程如下:For i = 0 to N/16-1 doFor j = 0 to 15 doSet X[j] to M[i*16+j].end /结束对J的循环AA = ABB = BCC = CDD = D[ABCD 0 7 1] [DABC 1 12 2] [CDAB 2 17 3] [BCDA 3 22 4][ABCD 4 7 5] [DABC 5 12 6] [CDAB 6 17 7] [BCDA 7 22 8][ABCD 8 7 9] [DABC 9 12 10] [CDAB 10 17 11] [BCDA 11 22 12][ABCD 12 7 13] [DABC 13 12 14] [CDAB 14 17 15] [BCDA 15 22 16][ABCD 1 5 17] [DABC 6 9 18] [CDAB 11 14 19] [BCDA 0 20 20][ABCD 5 5 21] [DABC 10 9 22] [CDAB 15 14 23] [BCDA 4 20 24][ABCD 9 5 25] [DABC 14 9 26] [CDAB 3 14 27] [BCDA 8 20 28][ABCD 13 5 29] [DABC 2 9 30] [CDAB 7 14 31] [BCDA 12 20 32][ABCD 5 4 33] [DABC 8 11 34] [CDAB 11 16 35] [BCDA 14 23 36][ABCD 1 4 37] [DABC 4 11 38] [CDAB 7 16 39] [BCDA 10 23 40][ABCD 13 4 41] [DABC 0 11 42] [CDAB 3 16 43] [BCDA 6 23 44][ABCD 9 4 45] [DABC 12 11 46] [CDAB 15 16 47] [BCDA 2 23 48][ABCD 0 6 49] [DABC 7 10 50] [CDAB 14 15 51][BCDA 5 21 52][ABCD 12 6 53] [DABC 3 10 54] [CDAB 10 15 55][BCDA 1 21 56][ABCD 8 6 57] [DABC 15 10 58] [CDAB 6 15 59][BCDA 13 21 60][ABCD 4 6 61] [DABC 11 10 62] [CDAB 2 15 63][BCDA 9 21 64]A = A + AAB = B + BBC = C + CCD = D + DDend输出结果。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

MD5算法及源代码分类:计算机密码//获得MD5的二个数组和一个buffer并初始化MD5 *GetMD5();//初始化MD5的二个数据和一个buffervoid MD5Init (MD5 *context);//用于计算MD5值的函数void MD5Update (MD5 *context, unsigned char *input, unsigned int inputLen);//输出结果void MD5Final (MD5 *context, unsigned char digest[16]);//对input数据做一次完整的MD5运算void MD5Out (MD5 *md5, unsigned char *input, unsigned int inputLen, unsigned char out[16]);//计算一个文件的MD5值int 计算一个文件的MD5值(TCHAR* 文件路径, unsigned char md5值[16]){MD5 context;int 缓冲区长度 = 1024,读取到的字节数;unsigned char *缓冲区 = new unsigned char[缓冲区长度];FILE *文件指针 = fopen(文件路径, "rb");if(文件指针 == NULL)return 1;MD5Init(&context);while ( (读取到的字节数 = fread (缓冲区, 1, 缓冲区长度, 文件指针 )) ! =EOF){MD5Update (&context, 缓冲区, 读取到的字节数);//判断是否为已经读到文件尾if ( 读取到的字节数 < 缓冲区长度 )break;}MD5Final (&context, md5值);free ( 缓冲区 );return 0;}/****MD5.h**/typedef struct {unsigned long state[4]; /* state (ABCD) */unsigned long count[2]; /* number of bits, modulo 2^64 */unsigned char buffer[64]; /* input buffer */} MD5;MD5 *GetMD5();void MD5Init (MD5 *context);void MD5Update (MD5 *context, unsigned char *input, unsigned int inputLen);void MD5Final (MD5 *context, unsigned char digest[16]);void MD5Out (MD5 *md5, unsigned char *input, unsigned int inputLen, unsigned char out[16]); /***MD5.cpp*/#include "stdafx.h"#include <string.h>#include "md5.h"#define S11 7#define S12 12#define S13 17#define S14 22#define S21 5#define S22 9#define S23 14#define S24 20#define S31 4#define S32 11#define S33 16#define S34 23#define S41 6#define S42 10#define S43 15#define S44 21static void MD5Transform (unsigned long int state[4], unsigned char block[64]);static void Encode (unsigned char *output, unsigned long int *input,unsigned int len); static void Decode (unsigned long int *output, unsigned char *input, unsigned int len);//static void MD5_memcpy (unsigned char* output, unsigned char* input,unsigned int len);//static void MD5_memset (unsigned char* output,int value,unsigned int len);static unsigned char PADDING[64] = {0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};/* F, G, H and I are basic MD5 functions.*/#define F(x, y, z) (((x) & (y)) | ((~x) & (z)))#define G(x, y, z) (((x) & (z)) | ((y) & (~z)))#define H(x, y, z) ((x) ^ (y) ^ (z))#define I(x, y, z) ((y) ^ ((x) | (~z)))/* ROTATE_LEFT rotates x left n bits.*/#define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32-(n))))/* FF, GG, HH, and II transformations for rounds 1, 2, 3, and 4. Rotation is separate from addition to prevent recomputation.*/#define FF(a, b, c, d, x, s, ac) { \(a) += F ((b), (c), (d)) + (x) + (unsigned long int)(ac); \ (a) = ROTATE_LEFT ((a), (s)); \(a) += (b); \}#define GG(a, b, c, d, x, s, ac) { \(a) += G ((b), (c), (d)) + (x) + (unsigned long int)(ac); \ (a) = ROTATE_LEFT ((a), (s)); \(a) += (b); \}#define HH(a, b, c, d, x, s, ac) { \(a) += H ((b), (c), (d)) + (x) + (unsigned long int)(ac); \ (a) = ROTATE_LEFT ((a), (s)); \(a) += (b); \}#define II(a, b, c, d, x, s, ac) { \(a) += I ((b), (c), (d)) + (x) + (unsigned long int)(ac); \ (a) = ROTATE_LEFT ((a), (s)); \(a) += (b); \}MD5 *GetMD5(){MD5 *md5 = new MD5();MD5Init(md5);return md5;}void MD5Init (MD5 *context){context->count[0] = context->count[1] = 0;/* Load magic initialization constants.*/context->state[0] = 0x67452301;context->state[1] = 0xefcdab89;context->state[2] = 0x98badcfe;context->state[3] = 0x10325476;}/* MD5 block update operation. Continues an MD5 message-digestoperation, processing another message block, and updating thecontext.*/void MD5Update (MD5 *context, unsigned char *input, unsigned int inputLen){unsigned int i, index, partLen;/* Compute number of bytes mod 64 */index = (unsigned int)((context->count[0] >> 3) & 0x3F);/* Update number of bits */if ((context->count[0] += ((unsigned long int)inputLen << 3))< ((unsigned long int)inputLen << 3))context->count[1]++;context->count[1] += ((unsigned long int)inputLen >> 29);partLen = 64 - index;/* Transform as many times as possible.*/if (inputLen >= partLen) {memcpy((unsigned char*)&context->buffer[index],(unsigned char*)input, partLen);MD5Transform (context->state, context->buffer);for (i = partLen; i + 63 < inputLen; i += 64)MD5Transform (context->state, &input[i]);index = 0;}elsei = 0;/* Buffer remaining input */memcpy ((unsigned char*)&context->buffer[index], (unsigned char*)&input[i], inputLen-i); }/* MD5 finalization. Ends an MD5 message-digest operation, writing thethe message digest and zeroizing the context.*/void MD5Final (MD5 *context, unsigned char digest[16]){unsigned char bits[8];unsigned int index, padLen;/* Save number of bits */Encode (bits, context ->count, 8);/* Pad out to 56 mod 64.*/index = (unsigned int)((context->count[0] >> 3) & 0x3f);padLen = (index < 56) ? (56 - index) : (120 - index);MD5Update ( context, PADDING, padLen);/* Append length (before padding) */MD5Update (context, bits, 8);/* Store state in digest */Encode (digest, context->state, 16);MD5Init(context);}void MD5Out(MD5 *md5, unsigned char *input, unsigned int inputLen, unsigned char out[16]) {MD5Update(md5, input, inputLen);MD5Final(md5, out);}/* MD5 basic transformation. Transforms state based on block.*/void MD5Transform (unsigned long int state[4], unsigned char block[64]){unsigned long int a = state[0], b = state[1], c = state[2], d = state[3], x[16]; Decode (x, block, 64);/* Round 1 */FF (a, b, c, d, x[ 0], S11, 0xd76aa478); /* 1 */FF (d, a, b, c, x[ 1], S12, 0xe8c7b756); /* 2 */FF (c, d, a, b, x[ 2], S13, 0x242070db); /* 3 */FF (b, c, d, a, x[ 3], S14, 0xc1bdceee); /* 4 */FF (a, b, c, d, x[ 4], S11, 0xf57c0faf); /* 5 */FF (d, a, b, c, x[ 5], S12, 0x4787c62a); /* 6 */FF (c, d, a, b, x[ 6], S13, 0xa8304613); /* 7 */FF (b, c, d, a, x[ 7], S14, 0xfd469501); /* 8 */FF (a, b, c, d, x[ 8], S11, 0x698098d8); /* 9 */FF (d, a, b, c, x[ 9], S12, 0x8b44f7af); /* 10 */FF (c, d, a, b, x[10], S13, 0xffff5bb1); /* 11 */FF (b, c, d, a, x[11], S14, 0x895cd7be); /* 12 */FF (a, b, c, d, x[12], S11, 0x6b901122); /* 13 */FF (c, d, a, b, x[14], S13, 0xa679438e); /* 15 */ FF (b, c, d, a, x[15], S14, 0x49b40821); /* 16 *//* Round 2 */GG (a, b, c, d, x[ 1], S21, 0xf61e2562); /* 17 */ GG (d, a, b, c, x[ 6], S22, 0xc040b340); /* 18 */ GG (c, d, a, b, x[11], S23, 0x265e5a51); /* 19 */ GG (b, c, d, a, x[ 0], S24, 0xe9b6c7aa); /* 20 */ GG (a, b, c, d, x[ 5], S21, 0xd62f105d); /* 21 */ GG (d, a, b, c, x[10], S22, 0x2441453); /* 22 */ GG (c, d, a, b, x[15], S23, 0xd8a1e681); /* 23 */ GG (b, c, d, a, x[ 4], S24, 0xe7d3fbc8); /* 24 */ GG (a, b, c, d, x[ 9], S21, 0x21e1cde6); /* 25 */ GG (d, a, b, c, x[14], S22, 0xc33707d6); /* 26 */ GG (c, d, a, b, x[ 3], S23, 0xf4d50d87); /* 27 */ GG (b, c, d, a, x[ 8], S24, 0x455a14ed); /* 28 */ GG (a, b, c, d, x[13], S21, 0xa9e3e905); /* 29 */ GG (d, a, b, c, x[ 2], S22, 0xfcefa3f8); /* 30 */ GG (c, d, a, b, x[ 7], S23, 0x676f02d9); /* 31 */ GG (b, c, d, a, x[12], S24, 0x8d2a4c8a); /* 32 *//* Round 3 */HH (a, b, c, d, x[ 5], S31, 0xfffa3942); /* 33 */ HH (d, a, b, c, x[ 8], S32, 0x8771f681); /* 34 */ HH (c, d, a, b, x[11], S33, 0x6d9d6122); /* 35 */ HH (b, c, d, a, x[14], S34, 0xfde5380c); /* 36 */ HH (a, b, c, d, x[ 1], S31, 0xa4beea44); /* 37 */ HH (d, a, b, c, x[ 4], S32, 0x4bdecfa9); /* 38 */ HH (c, d, a, b, x[ 7], S33, 0xf6bb4b60); /* 39 */ HH (b, c, d, a, x[10], S34, 0xbebfbc70); /* 40 */ HH (a, b, c, d, x[13], S31, 0x289b7ec6); /* 41 */ HH (d, a, b, c, x[ 0], S32, 0xeaa127fa); /* 42 */ HH (c, d, a, b, x[ 3], S33, 0xd4ef3085); /* 43 */ HH (b, c, d, a, x[ 6], S34, 0x4881d05); /* 44 */ HH (a, b, c, d, x[ 9], S31, 0xd9d4d039); /* 45 */ HH (d, a, b, c, x[12], S32, 0xe6db99e5); /* 46 */ HH (c, d, a, b, x[15], S33, 0x1fa27cf8); /* 47 */ HH (b, c, d, a, x[ 2], S34, 0xc4ac5665); /* 48 *//* Round 4 */II (a, b, c, d, x[ 0], S41, 0xf4292244); /* 49 */ II (d, a, b, c, x[ 7], S42, 0x432aff97); /* 50 */ II (c, d, a, b, x[14], S43, 0xab9423a7); /* 51 */II (a, b, c, d, x[12], S41, 0x655b59c3); /* 53 */II (d, a, b, c, x[ 3], S42, 0x8f0ccc92); /* 54 */II (c, d, a, b, x[10], S43, 0xffeff47d); /* 55 */II (b, c, d, a, x[ 1], S44, 0x85845dd1); /* 56 */II (a, b, c, d, x[ 8], S41, 0x6fa87e4f); /* 57 */II (d, a, b, c, x[15], S42, 0xfe2ce6e0); /* 58 */II (c, d, a, b, x[ 6], S43, 0xa3014314); /* 59 */II (b, c, d, a, x[13], S44, 0x4e0811a1); /* 60 */II (a, b, c, d, x[ 4], S41, 0xf7537e82); /* 61 */II (d, a, b, c, x[11], S42, 0xbd3af235); /* 62 */II (c, d, a, b, x[ 2], S43, 0x2ad7d2bb); /* 63 */II (b, c, d, a, x[ 9], S44, 0xeb86d391); /* 64 */state[0] += a;state[1] += b;state[2] += c;state[3] += d;/* Zeroize sensitive information.*/memset ((unsigned char*)x, 0, sizeof (x));}/* Encodes input (unsigned long int) into output (unsigned char). Assumes len is a multiple of 4.*/void Encode (unsigned char *output, unsigned long int *input,unsigned int len) {unsigned int i, j;for (i = 0, j = 0; j < len; i++, j += 4) {output[j] = (unsigned char)(input[i] & 0xff);output[j+1] = (unsigned char)((input[i] >> 8) & 0xff);output[j+2] = (unsigned char)((input[i] >> 16) & 0xff);output[j+3] = (unsigned char)((input[i] >> 24) & 0xff);}}/* Decodes input (unsigned char) into output (unsigned long int). Assumes len is a multiple of 4.*/void Decode (unsigned long int *output, unsigned char *input, unsigned int len) {unsigned int i, j;for (i = 0, j = 0; j < len; i++, j += 4)output[i] = ((unsigned long int)input[j]) | (((unsigned long int)input[j+1]) << 8) | (((unsigned long int)input[j+2]) << 16) | (((unsigned long int)input[j+3]) << 24); }。

相关文档
最新文档