GVKun编程网logo

一文搞懂Java MD5算法的原理及实现(java md5方法)

3

对于一文搞懂JavaMD5算法的原理及实现感兴趣的读者,本文将会是一篇不错的选择,我们将详细介绍javamd5方法,并为您提供关于C/C++MD5算法的实现代码、HMAC-MD5算法原理及实现、Jav

对于一文搞懂Java MD5算法的原理及实现感兴趣的读者,本文将会是一篇不错的选择,我们将详细介绍java md5方法,并为您提供关于C/C++ MD5算法的实现代码、HMAC-MD5算法原理及实现、Java MD5消息摘要算法原理及实现代码、java实现MD5算法的有用信息。

本文目录一览:

一文搞懂Java MD5算法的原理及实现(java md5方法)

一文搞懂Java MD5算法的原理及实现(java md5方法)

MD5加密简介

哈希算法又称散列算法,是将任何数据转换成固定长度的算法的统称。 从本质上讲,MD5也是一种哈希算法,其输出是生成128位的输出结果。 如果输入两个不同的明文,就会输出两个不同的输出值,并且根据输出值,不能得到原始的明文,这个过程是不可逆的。

MD5加密原理

MD5算法对512位报文的输入信息进行处理,每个报文被分成16个32位报文。 经过一系列处理后,算法的输出由4个32位的数据包组成,这些数据包级联生成一个128位的哈希值。  

   在MD5算法中,信息的填写方式是这样的:消息后面跟着一个1,然后是无数个0,直到512字节的剩余数等于448 (n*512) + 448。 为什么剩下的是448,因为剩下的512-448是64位,表示填充前的消息长度。 加上剩下的64位,(n+1)乘以512,也就是512的整数倍。  

然后循环通过link变量获得结果。 MD5包含四个32位整数参数,称为链接变量:A=0x01234567, B= 0x89ABCdef, C= 0xFeDCba98, D=0x76543210。 一旦设置好四个链接变量,算法就开始了四轮循环。 具体的内部计算是关于数学的。如果你感兴趣,你可以自己理解。这里没有更多的解释。

MD5加密常用方法

 /**  
     * 用MD5算法进行加密  
     * @param str 需要加密的字符串  
     * @return MD5加密后的结果  
	 * @throws UnsupportedEncodingException 
     */    
public static String encodeMD5String(String str) {    
       	return getMD5(str);
    }
 /**
     * MD5编码方法, 该方法存在漏洞,特殊情况下编码后的字符串只有31位长度
     * @param str
     * @param method
     * @return
     * @throws UnsupportedEncodingException
     */
private static String encode(String str, String method) throws UnsupportedEncodingException {    
        MessageDigest md = null;    
        String dstr = null;    
        try {    
            md = MessageDigest.getInstance(method);    
            md.update(str.getBytes("UTF-8"));    
            dstr = new BigInteger(1, md.digest()).toString(16);    
        } catch (NoSuchAlgorithmException e) {    
            e.printStackTrace();    
        }    
        return dstr;    
    }
/**
     * MD5编码方法
     * @param message
     * @return
     */
    public static String getMD5(String message) {  
        MessageDigest messageDigest = null;  
        StringBuffer md5StrBuff = new StringBuffer();  
        try {  
            messageDigest = MessageDigest.getInstance("MD5");  
            messageDigest.reset();  
            messageDigest.update(message.getBytes("UTF-8"));  
              
            byte[] byteArray = messageDigest.digest();  
            for (int i = 0; i < byteArray.length; i++)   
            {  
                if (Integer.toHexString(0xFF & byteArray[i]).length() == 1)  
                    md5StrBuff.append("0").append(Integer.toHexString(0xFF & byteArray[i]));  
                else  
                    md5StrBuff.append(Integer.toHexString(0xFF & byteArray[i]));  
            }  
        } catch (Exception e) {  
            throw new RuntimeException();  
        }  
        return md5StrBuff.toString().toUpperCase();//字母大写  
    } 
 /**
     * 加密
     * @param content
     * @return
     */
    public static String encrypt(String content) {
    	String password = "12345678dd";
    	byte[] encryptResult = encrypt(content, password);  
        String encryptResultStr = parseByte2HexStr(encryptResult);  
        return encryptResultStr;
    }
/**
     * 加密
     * @param content
     * @param password
     * @return
     */
    public static String encryptStr(String content, String password) {
    	byte[] encryptResult = encrypt(content, password);  
        return parseByte2HexStr(encryptResult);
    }
/**
     * 解密
     * @param encryptResultStr
     * @return
     * @throws UnsupportedEncodingException
     */
    public static String decrypt(String encryptResultStr) throws UnsupportedEncodingException {
    	String password = "12345678dd";
    	 byte[] decryptFrom = parseHexStr2Byte(encryptResultStr);  
	     byte[] decryptResult = decrypt(decryptFrom, password);  
	     // 解密内容进行解码  
	     String result = new String(decryptResult, UTF8);  
	     return result;
    }
/**
     * 解密
     * @param encryptStr
     * @param password
     * @return
     * @throws UnsupportedEncodingException
     */
    public static String decryptStr(String encryptStr, String password) throws UnsupportedEncodingException {
		byte[] decryptFrom = parseHexStr2Byte(encryptStr);
		byte[] decryptResult = decrypt(decryptFrom, password);
		// 解密内容进行解码
		return new String(decryptResult, UTF8);
    }

到此这篇关于一文搞懂Java MD5算法的原理及实现的文章就介绍到这了,更多相关Java MD5算法内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!

您可能感兴趣的文章:
  • Java MD5消息摘要算法原理及实现代码
  • java 实现MD5加密算法的简单实例
  • 关于MD5算法原理与常用实现方式

C/C++ MD5算法的实现代码

C/C++ MD5算法的实现代码

在逆向程序的时候,经常会碰到加密的算法的问题,前面分析UC的逆向工程师的面试题2的时候,发现使用了MD5的加密算法(MD5算法是自己实现的,不是使用的算法库函数)。尤其是在逆向分析网络协议的时候,一般的程序使用的加密算法都是使用的库函数提供的算法,有些程序使用的算法是自己实现的;相对来说使用函数库提供的加密函数的算法相对来说比较好识别,因为有算法常见函数在;但是如果不是使用的函数库提供的加密的函数而是自己去实现某些算法话,识别起来有一定的难度,这就需要你对函数的加密原理以及流程还算法的特征比较熟悉才能很快识别出来。下面就将网上有关MD5算法一些知识整理一下,方面自己查阅。

md5简介

消息摘要算法第五版(英语:Message-Digest Algorithm 5,缩写为MD5),是当前计算机领域用于确保信息传输完整一致而广泛使用的散列算法之一(又译哈希算法、摘要算法等),主流编程语言普遍已有MD5的实现。将数据 (如一段文字)运算变为另一固定长度值,是散列算法的基础原理,MD5的前身有MD2、MD3和MD4。MD5由MD4、MD3、MD2改进而来,主要增强算法复杂度和不可逆性。目前,MD5算法因其普遍、稳定、快速的特点,仍广泛应用于普通 数据的错误检查领域。例如在一些BitTorrent下载中,软件将通过计算MD5检验下载到的文件片段的完整性。MD5已经广泛使用在为文件传输提供一定的可靠性方面。例如,服务器预先提供一个MD5校验和,用户下载完文件以后, 用MD5算法计算下载文件的MD5校验和,然后通过检查这两个校验和是否一致,就能判断下载的文件是否出错。MD5是输入不定长度信息,输出固定长度128-bits的算法。经过程序流程,生成四个32位数据,最后联合起来成为一个 128-bits散列。基本方式为,求余、取余、调整长度、与链接变量进行循环运算。得出结果。

md5算法描述

假设输入信息(input message)的长度为b(bit),我们想要产生它的报文摘要,在此处b为任意的非负整数:b也可能为0,也不一定为8的整数倍,且可能是任意大的长度。设该信息的比特流表示如下: M[0] M[1] M[2] ... M[b-1] 计算此信息的报文摘要需要如下5步:

1.补位

信息计算前先要进行位补位,设补位后信息的长度为LEN(bit),则LEN%512 = 448(bit),即数据扩展至 K * 512 + 448(bit)。即K * 64+56(byte),K为整数。补位操作始终要执行,即使补位前信息的长度对512求余的结果是448。具体补位操作:补一个1,然后补0至满足上述要求。总共最少要补1bit,最多补512bit。

2.尾部加上信息长度

将输入信息的原始长度b(bit)表示成一个64-bit的数字,把它添加到上一步的结果后面(在32位的机器上,这64位将用2个字来表示并且低位在前)。当遇到b大于2^64这种极少的情况时,b的高位被截去,仅使用b的低64位。经过上面两步,数据就被填补成长度为512(bit)的倍数。也就是说,此时的数据长度是16个字(32byte)的整数倍。此时的数据表示为: M[0 ... N-1] 其中的N是16的倍数。

3.初始化缓存区

用一个四个字的缓冲器(A,B,C,D)来计算报文摘要,A,B,C,D分别是32位的寄存器,初始化使用的是十六进制表示的数字,注意低字节在前: word A: 01 23 45 67 word B: 89 ab cd ef word C: fe dc ba 98 word D: 76 54 32 10

4.转换

首先定义4个辅助函数,每个函数的输入是三个32位的字,输出是一个32位的字: F(X,Y,Z) = XY v not(X) Z G(X,Z) = XZ v Y not(Z) H(X,Z) = X xor Y xor Z I(X,Z) = Y xor (X v not(Z))

FF(a,b,c,d,Mj,s,ti)表示 a = b + ((a + F(b,d) + Mj + ti) << s)
GG(a,ti)表示 a = b + ((a + G(b,d) + Mj + ti) << s)
HH(a,ti)表示 a = b + ((a + H(b,d) + Mj + ti) << s)
Ⅱ(a,ti)表示 a = b + ((a + I(b,d) + Mj + ti) << s)

这四轮(64步)是:

第一轮

FF(a,M0,7,0xd76aa478) FF(d,a,M1,12,0xe8c7b756) FF(c,M2,17,0x242070db) FF(b,M3,22,0xc1bdceee) FF(a,M4,0xf57c0faf) FF(d,M5,0x4787c62a) FF(c,M6,0xa8304613) FF(b,M7,0xfd469501) FF(a,M8,0x698098d8) FF(d,M9,0x8b44f7af) FF(c,M10,0xffff5bb1) FF(b,M11,0x895cd7be) FF(a,M12,0x6b901122) FF(d,M13,0xfd987193) FF(c,M14,0xa679438e) FF(b,M15,0x49b40821)

第二轮

GG(a,5,0xf61e2562) GG(d,9,0xc040b340) GG(c,14,0x265e5a51) GG(b,20,0xe9b6c7aa) GG(a,0xd62f105d) GG(d,0x02441453) GG(c,0xd8a1e681) GG(b,0xe7d3fbc8) GG(a,0x21e1cde6) GG(d,0xc33707d6) GG(c,0xf4d50d87) GG(b,0x455a14ed) GG(a,0xa9e3e905) GG(d,0xfcefa3f8) GG(c,0x676f02d9) GG(b,0x8d2a4c8a)

第三轮

HH(a,4,0xfffa3942) HH(d,11,0x8771f681) HH(c,16,0x6d9d6122) HH(b,23,0xfde5380c) HH(a,0xa4beea44) HH(d,0x4bdecfa9) HH(c,0xf6bb4b60) HH(b,0xbebfbc70) HH(a,0x289b7ec6) HH(d,0xeaa127fa) HH(c,0xd4ef3085) HH(b,0x04881d05) HH(a,0xd9d4d039) HH(d,0xe6db99e5) HH(c,0x1fa27cf8) HH(b,0xc4ac5665)

第四轮

Ⅱ(a,6,0xf4292244) Ⅱ(d,10,0x432aff97) Ⅱ(c,15,0xab9423a7) Ⅱ(b,21,0xfc93a039) Ⅱ(a,0x655b59c3) Ⅱ(d,0x8f0ccc92) Ⅱ(c,0xffeff47d) Ⅱ(b,0x85845dd1) Ⅱ(a,0x6fa87e4f) Ⅱ(d,0xfe2ce6e0) Ⅱ(c,0xa3014314) Ⅱ(b,0x4e0811a1) Ⅱ(a,0xf7537e82) Ⅱ(d,0xbd3af235) Ⅱ(c,0x2ad7d2bb) Ⅱ(b,0xeb86d391)

下面是MD5算法的具体的实现

MD5算法的头文件Md5.h:

#ifndef MD5_H  
#define MD5_H  
 
typedef struct 
{ 
  unsigned int count[2]; 
  unsigned int state[4]; 
  unsigned char buffer[64]; 
}MD5_CTX; 
 
 
#define F(x,y,z) ((x & y) | (~x & z))  
#define G(x,z) ((x & z) | (y & ~z))  
#define H(x,z) (x^y^z)  
#define I(x,z) (y ^ (x | ~z))  
#define ROTATE_LEFT(x,n) ((x << n) | (x >> (32-n)))  
 
#define FF(a,x,ac) { \ 
a += F(b,d) + x + ac; \ 
a = ROTATE_LEFT(a,s); \ 
a += b; \ 
} 
 
#define GG(a,ac) { \ 
  a += G(b,d) + x + ac; \ 
  a = ROTATE_LEFT(a,s); \ 
  a += b; \ 
} 
 
#define HH(a,ac) { \ 
  a += H(b,s); \ 
  a += b; \ 
} 
#define II(a,ac) { \ 
  a += I(b,s); \ 
  a += b; \ 
} 
 
 
void MD5Init(MD5_CTX *context); 
void MD5Update(MD5_CTX *context,unsigned char *input,unsigned int inputlen); 
void MD5Final(MD5_CTX *context,unsigned char digest[16]); 
void MD5Transform(unsigned int state[4],unsigned char block[64]); 
void MD5Encode(unsigned char *output,unsigned int *input,unsigned int len); 
void MD5Decode(unsigned int *output,unsigned int len); 
 
#endif

MD5算法的实现文件Md5.cpp:

unsigned char PADDING[] = {  
  0x80,0 }; 
 
//在逆向代码的时候,需要关注下面的特征值 
void MD5Init(MD5_CTX *context) 
{ 
  context->count[0] = 0; 
  context->count[1] = 0; 
  context->state[0] = 0x67452301; 
  context->state[1] = 0xEFCDAB89; 
  context->state[2] = 0x98BADCFE; 
  context->state[3] = 0x10325476; 
} 
 
void MD5Update(MD5_CTX *context,unsigned int inputlen) 
{ 
  unsigned int i = 0,index = 0,partlen = 0; 
  index = (context->count[0] >> 3) & 0x3F; 
  partlen = 64 - index; 
  context->count[0] += inputlen << 3; 
  if (context->count[0] < (inputlen << 3)) 
    context->count[1]++; 
  context->count[1] += inputlen >> 29; 
 
  if (inputlen >= partlen) 
  { 
    memcpy(&context->buffer[index],input,partlen); 
    MD5Transform(context->state,context->buffer); 
    for (i = partlen; i + 64 <= inputlen; i += 64) 
      MD5Transform(context->state,&input[i]); 
    index = 0; 
  } 
  else 
  { 
    i = 0; 
  } 
  memcpy(&context->buffer[index],&input[i],inputlen - i); 
} 
 
void MD5Final(MD5_CTX *context,unsigned char digest[16]) 
{ 
  unsigned int index = 0,padlen = 0; 
  unsigned char bits[8]; 
  index = (context->count[0] >> 3) & 0x3F; 
  padlen = (index < 56) ? (56 - index) : (120 - index); 
  MD5Encode(bits,context->count,8); 
  MD5Update(context,PADDING,padlen); 
  MD5Update(context,bits,8); 
  MD5Encode(digest,context->state,16); 
} 
 
void MD5Encode(unsigned char *output,unsigned int len) 
{ 
  unsigned int i = 0,j = 0; 
  while (j < len) 
  { 
    output[j] = input[i] & 0xFF; 
    output[j + 1] = (input[i] >> 8) & 0xFF; 
    output[j + 2] = (input[i] >> 16) & 0xFF; 
    output[j + 3] = (input[i] >> 24) & 0xFF; 
    i++; 
    j += 4; 
  } 
} 
 
void MD5Decode(unsigned int *output,j = 0; 
  while (j < len) 
  { 
    output[i] = (input[j]) | 
      (input[j + 1] << 8) | 
      (input[j + 2] << 16) | 
      (input[j + 3] << 24); 
    i++; 
    j += 4; 
  } 
} 
 
void MD5Transform(unsigned int state[4],unsigned char block[64]) 
{ 
  unsigned int a = state[0]; 
  unsigned int b = state[1]; 
  unsigned int c = state[2]; 
  unsigned int d = state[3]; 
  unsigned int x[64]; 
 
  MD5Decode(x,block,64); 
  FF(a,x[0],0xd76aa478); 
  FF(d,x[1],0xe8c7b756); 
  FF(c,x[2],0x242070db); 
  FF(b,x[3],0xc1bdceee); 
  FF(a,x[4],0xf57c0faf); 
  FF(d,x[5],0x4787c62a); 
  FF(c,x[6],0xa8304613); 
  FF(b,x[7],0xfd469501); 
  FF(a,x[8],0x698098d8); 
  FF(d,x[9],0x8b44f7af); 
  FF(c,x[10],0xffff5bb1); 
  FF(b,x[11],0x895cd7be); 
  FF(a,x[12],0x6b901122); 
  FF(d,x[13],0xfd987193); 
  FF(c,x[14],0xa679438e); 
  FF(b,x[15],0x49b40821); 
 
 
  GG(a,0xf61e2562); 
  GG(d,0xc040b340); 
  GG(c,0x265e5a51); 
  GG(b,0xe9b6c7aa); 
  GG(a,0xd62f105d); 
  GG(d,0x2441453); 
  GG(c,0xd8a1e681); 
  GG(b,0xe7d3fbc8); 
  GG(a,0x21e1cde6); 
  GG(d,0xc33707d6); 
  GG(c,0xf4d50d87); 
  GG(b,0x455a14ed); 
  GG(a,0xa9e3e905); 
  GG(d,0xfcefa3f8); 
  GG(c,0x676f02d9); 
  GG(b,0x8d2a4c8a); 
 
 
  HH(a,0xfffa3942); 
  HH(d,0x8771f681); 
  HH(c,0x6d9d6122); 
  HH(b,0xfde5380c); 
  HH(a,0xa4beea44); 
  HH(d,0x4bdecfa9); 
  HH(c,0xf6bb4b60); 
  HH(b,0xbebfbc70); 
  HH(a,0x289b7ec6); 
  HH(d,0xeaa127fa); 
  HH(c,0xd4ef3085); 
  HH(b,0x4881d05); 
  HH(a,0xd9d4d039); 
  HH(d,0xe6db99e5); 
  HH(c,0x1fa27cf8); 
  HH(b,0xc4ac5665); 
 
 
  II(a,0xf4292244); 
  II(d,0x432aff97); 
  II(c,0xab9423a7); 
  II(b,0xfc93a039); 
  II(a,0x655b59c3); 
  II(d,0x8f0ccc92); 
  II(c,0xffeff47d); 
  II(b,0x85845dd1); 
  II(a,0x6fa87e4f); 
  II(d,0xfe2ce6e0); 
  II(c,0xa3014314); 
  II(b,0x4e0811a1); 
  II(a,0xf7537e82); 
  II(d,0xbd3af235); 
  II(c,0x2ad7d2bb); 
  II(b,0xeb86d391); 
  state[0] += a; 
  state[1] += b; 
  state[2] += c; 
  state[3] += d; 
} 

MD5算法的调用测试:

int _tmain(int argc,_TCHAR* argv[]) 
{ 
 
  int i; 
  unsigned char encrypt[] = "admin";//21232f297a57a5a743894a0e4a801fc3  
  unsigned char decrypt[16]; 
 
  MD5_CTX md5; 
 
  MD5Init(&md5); 
  MD5Update(&md5,encrypt,strlen((char *)encrypt)); 
  MD5Final(&md5,decrypt); 
 
  //Md5加密后的32位结果 
  printf("加密前:%s\n加密后16位:",encrypt); 
  for (i = 4; i<12; i++) 
  { 
    printf("%02x",decrypt[i]);  
  } 
 
  //Md5加密后的32位结果 
  printf("\n加密前:%s\n加密后32位:",encrypt); 
  for (i = 0; i<16; i++) 
  { 
    printf("%02x",decrypt[i]);  
  } 
 
  getchar(); 
 
  return 0; 
}

上面的代码工程的下载地址:Md5Demo201707.zip

破解MD5加密的网址:http://www.cmd5.com/

感谢链接:
http://blog.sina.com.cn/s/blog_693de6100101kcu6.html

https://github.com/JieweiWei/md5

HMAC-MD5算法原理及实现

HMAC-MD5算法原理及实现

以下是分析节选,对于更详细的描述可以查阅RFC2104文档。

HMAC需要一个加密用散列函数(表示为H)和一个密钥K。
假设H是一个将数据块用一个基本的迭代压缩函数来加密的散列函数。
用B来表示数据块的长。(以上说提到的散列函数的分割数据块长B=64),用L来表示散列函数的输出数据长(MD5中L=16,SHA—1中L=20)。

密钥的长度可以是小于等于数据块长的任何正整数值。应用程序中使用的密钥长度若是比B大,则首先用使用散列
函数H作用于它,然后用H输出的L长度字符串作为在HMAC中实际使用的密钥。

一般情况下,推荐的最小密钥K长度是L长。(与H的输出数据长度相等)。
我们将定义两个固定且不同的字符串ipad,opad:
ipad = the byte 0x36 repeated B times
opad = the byte 0x5C repeated B times.
计算‘text'的HMAC:
H( K XOR opad,H(K XOR ipad,text))
即为以下步骤:

void hmac_md5(char* out,char* data,int dlen,char* key,int klen)
{

(1) 在密钥key后面添加0来创建一个长为B(64字节)的字符串(str)。

(2) 将上一步生成的字符串(str)与ipad(0x36)做异或运算,形成结果字符串(istr)。
 
(3) 将数据流data附加到第二步的结果字符串(istr)的末尾。
 
(4) 做md5运算于第三步生成的数据流(istr)。
 
(5) 将第一步生成的字符串(str)与opad(0x5c)做异或运算,形成结果字符串(ostr)。
 
(6) 再将第四步的结果(istr)附加到第五步的结果字符串(ostr)的末尾。
 
(7) 做md5运算于第六步生成的数据流(ostr),输出最终结果(out)。

}
注:如果第一步中,key的长度klen大于64字节,则先进行md5运算,使其长度klen=16字节。

Java MD5消息摘要算法原理及实现代码

Java MD5消息摘要算法原理及实现代码

这篇文章主要介绍了Java MD5消息摘要算法原理及实现代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

md5 属于hash算法一类,是不可逆的消息摘要算法。与对称加密和非对称加密算法不一样,不需要加密密钥。

注意:

md5不是加密算法,只是将数据进行散列计算后生成一个唯一值的算法,没有加密密钥也没有解密密钥。

下面说的md5加密是指对密码加密成32位长度字符串的过程

md5可以用于密码的加密,如123456,加密后的字符串,在很大条件下不能被电脑强行破解出来,只能通过字典匹配的方式同样用md5加密后的字符串进行比较破解。

MessageDigest消息摘要是安全的单向散列函数,它将任意大小的字符串数据转换成固定长度的散列值。

加密后的字符串一般有8位、16位,32位,(64位好像没有)这三种长度的字符串。

默认标准加密后直接获得的就是32位长度的十六进制字符串

数据加密后返回32位长度数据

MessageDigest md = MessageDigest.getInstance(String algorithm)

这个方法可以获得三种加密对象实例

MD5, SHA-1, SHA-256

1、得到MD5算法的MessageDigest实例 ,

2、md.update(readEncryptStr.getBytes()) 将要加密的数据转换为字节数组更新到md5对象实例的字节数组中保存起来。

3 、通过执行填充等最终操作来完成哈希计算。返回加密后的结果,即128位字节数据

4、将128位即16长度字节数据转换为16进制数据输出总共32长度的字符串

Intrger.toHexString(int i)

这个方法是将一个整形转换为十六进制的字符串,由于int是32位,而参数是Byte为8位,需要和十六进制数OxFF进行与操作将前面24位,置0处理后再做为方法的参数

得出来的结果是两个十六进制数,但如果这个数是小于10的数,方法只会返回一个十六进制字符,需要前面补一个0,再追加返回结果。

最后输出的结果就是32个长度的十六进制字符串

/** * MD5 32bit Encrypt Methods. * @param readyEncryptStr ready encrypt string * @return String encrypt result string * @throws NoSuchAlgorithmException * */ public static final String MD5_32bit(String readyEncryptStr) throws NoSuchAlgorithmException{ if(readyEncryptStr != null){ //Get MD5 digest algorithm's MessageDigest's instance. MessageDigest md = MessageDigest.getInstance("MD5"); //Use specified byte update digest. md.update(readyEncryptStr.getBytes()); //Get cipher text byte [] b = md.digest(); //The cipher text converted to hexadecimal string StringBuilder su = new StringBuilder(); //byte array switch hexadecimal number. for(int offset = 0,bLen = b.length; offset

加密后返回的三种字符串长度8位,16位,32,位

只知道16位是通过加密后返回的32位字符串长度处理后的结果,也就是从32位加密后的字符串中间截取16位长度作为返回值。

8位的加密暂时不清楚。

来自百度百科的

java版原始加密算法

public class MD5{ /* *四个链接变量 */ private final int A=0x67452301; private final int B=0xefcdab89; private final int C=0x98badcfe; private final int D=0x10325476; /* *ABCD的临时变量 */ private int Atemp,Btemp,Ctemp,Dtemp; /* *常量ti *公式:floor(abs(sin(i+1))×(2pow32) */ private final int K[]={ 0xd76aa478,0xe8c7b756,0x242070db,0xc1bdceee, 0xf57c0faf,0x4787c62a,0xa8304613,0xfd469501,0x698098d8, 0x8b44f7af,0xffff5bb1,0x895cd7be,0x6b901122,0xfd987193, 0xa679438e,0x49b40821,0xf61e2562,0xc040b340,0x265e5a51, 0xe9b6c7aa,0xd62f105d,0x02441453,0xd8a1e681,0xe7d3fbc8, 0x21e1cde6,0xc33707d6,0xf4d50d87,0x455a14ed,0xa9e3e905, 0xfcefa3f8,0x676f02d9,0x8d2a4c8a,0xfffa3942,0x8771f681, 0x6d9d6122,0xfde5380c,0xa4beea44,0x4bdecfa9,0xf6bb4b60, 0xbebfbc70,0x289b7ec6,0xeaa127fa,0xd4ef3085,0x04881d05, 0xd9d4d039,0xe6db99e5,0x1fa27cf8,0xc4ac5665,0xf4292244, 0x432aff97,0xab9423a7,0xfc93a039,0x655b59c3,0x8f0ccc92, 0xffeff47d,0x85845dd1,0x6fa87e4f,0xfe2ce6e0,0xa3014314, 0x4e0811a1,0xf7537e82,0xbd3af235,0x2ad7d2bb,0xeb86d391}; /* *向左位移数,计算方法未知 */ private final int s[]={7,12,17,22,7,12,17,22,7,12,17,22,7, 12,17,22,5,9,14,20,5,9,14,20,5,9,14,20,5,9,14,20, 4,11,16,23,4,11,16,23,4,11,16,23,4,11,16,23,6,10, 15,21,6,10,15,21,6,10,15,21,6,10,15,21}; /* *初始化函数 */ private void init(){ Atemp=A; Btemp=B; Ctemp=C; Dtemp=D; } /* *移动一定位数 */ private int shift(int a,int s){ return(a>>(32-s));//右移的时候,高位一定要补零,而不是补充符号位 } /* *主循环 */ private void MainLoop(int M[]){ int F,g; int a=Atemp; int b=Btemp; int c=Ctemp; int d=Dtemp; for(int i = 0; i >2]|=str.charat(i)>2]|=0x80>i*8)%(1

java实现MD5算法

java实现MD5算法

import java.security.MessageDigest;

/** 加密工具

  • @author 刘彦青

**/
public class EncryptUtil {


/** MD5加密
 * 
 * @param jiami
 *            源字符串
 * @return 加密后的字符串 */
public final static String md5(String jiami) {
    char hexDigits[] = { ''0'', ''1'', ''2'', ''3'', ''4'', ''5'', ''6'', ''7'', ''8'', ''9'', ''A'', ''B'', ''C'', ''D'', ''E'', ''F'' };
    try {
        byte[] btInput = jiami.getBytes();
        MessageDigest mdInst = MessageDigest.getInstance("MD5");
        mdInst.update(btInput);
        byte[] md = mdInst.digest();
        int j = md.length;
        char str[] = new char[j * 2];
        int k = 0;
        for (int i = 0; i < j; i++) {
            byte byte0 = md[i];
            str[k++] = hexDigits[byte0 >>> 4 & 0xf];
            str[k++] = hexDigits[byte0 & 0xf];
        }
        return new String(str);
    } catch (Exception e) {
        throw new RuntimeException(e);
    }
}

private EncryptUtil() {
    // 禁止实例化
}

}


码字不易如果对你有帮助请给个关注

爱技术爱生活 QQ群: 894109590

今天关于一文搞懂Java MD5算法的原理及实现java md5方法的分享就到这里,希望大家有所收获,若想了解更多关于C/C++ MD5算法的实现代码、HMAC-MD5算法原理及实现、Java MD5消息摘要算法原理及实现代码、java实现MD5算法等相关知识,可以在本站进行查询。

本文标签: