MD5加密

  • 加密原理
    • 大端小端
    • 算法
  • 代码实现

加密原理

大端小端

一个字节是8位即0000 0000,它能表示2^8=256个数,最大的数为255,那我们如果要表示数256,就需要两个字节即16位,
数256=0000 0001 0000 0000,左边8位为高位。
计算机存储单位是字节,也就是这两个字节的存储必须有顺序,是先存储0000 0001,还是先存储0000 0000,就涉及到大端和小端存储。

大端存储即高位字节存放在低内存地址,低位字节存放在高内存地址
小端存储即低位字节存放在低内存地址,高位字节存放在高内存地址
256的大端存储即0000 0001    0000 0000 (低地址->高地址)
256的小端存储即0000 0000    0000 0001 (低地址->高地址)

下面都是从左往右是低地址->高地址

算法

我们首先以admin为例,接下来从十进制和二进制两个角度来说明代码。

admin的十进制为97 100 109 105 110 (ASCII码值),将十进制转为二进制的话01100001 01100100 01101101 01101001 01101110(大端)

MD5加密以512bit为一组,512/8=64字节

第一步,填充
首先我们的admin有5个字节40bit,需要让它填充到bit长度%512=448即448/8=56个字节,还差56-5=51个字节,填充的时候第一位为1,剩下的为0,即
10000000 00000000(重复50次)=-128,0(重复50次),至于为什么是-128,因为在计算机里是用补码存储的
当我们填充完之后应该达到56个字节448bit,然后进行第二次填充,还剩8个字节64bit,首先用原消息长度即admin的长度5*8=40bit来填充第一个字节,其余7个字节用0填充。即40,0(重复7次)=00101000 00000000(7次)

我们的第一步填充工作就完成了,会得到一个512bit64字节的需要加密的内容:

97 100 109 105 110 -128 0(50次) 40 0(7次)

第二步,分组
需要把512bit分为16个小组,一组32bit即4字节
那么,
M0=97 100 109 105(01100001 01100100 01101101 01101001)
M1=110 -128 0 0(01101110 10000000 00000000 00000000)
M2=0 0 0 0 (00000000 00000000 00000000 00000000)

M14=40 0 0 0 (00101000 00000000 00000000 00000000)
M15=0 0 0 0(00000000 00000000 00000000 00000000)

由于后面运算的需要,我们将它们转成小端存储即

M0=105 109 100 97
M1=0 0 -128 110
.....

需要注意的是,一定要进行扩大倍数,以M0为例
105需要左移24位=01101001 00000000 00000000 00000000即扩大为105*2^24
109需要左移16位=01101101 00000000 00000000
100需要左移8位=01100100 00000000
97不左移
然后这几个做按位或|运算才能得到真正的M0=1768776801(十进制)

第三步,初始化常量
计算时,我们要用到四个常数A,B,C,D(小端)

A=0x67452301,B=0xefcdab89,C=0x98badcfe,D=0x10325476(十六进制)

所以我们刚刚把M0转成小端了,这样ABCD就不用变了,当然M0也可以不用转,这样ABCD需要转成大端存储即A=0x01234567。

    //循环左移位数static 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};//常数数组Tstatic final long t[]={0xd76aa478L,0xe8c7b756L,0x242070dbL,0xc1bdceeeL,0xf57c0fafL,0x4787c62aL,0xa8304613L,0xfd469501L,0x698098d8L,0x8b44f7afL,0xffff5bb1L,0x895cd7beL,0x6b901122L,0xfd987193L,0xa679438eL,0x49b40821L,0xf61e2562L,0xc040b340L,0x265e5a51L,0xe9b6c7aaL,0xd62f105dL,0x02441453L,0xd8a1e681L,0xe7d3fbc8L,0x21e1cde6L,0xc33707d6L,0xf4d50d87L,0x455a14edL,0xa9e3e905L,0xfcefa3f8L,0x676f02d9L,0x8d2a4c8aL,0xfffa3942L,0x8771f681L,0x6d9d6122L,0xfde5380cL,0xa4beea44L,0x4bdecfa9L,0xf6bb4b60L,0xbebfbc70L,0x289b7ec6L,0xeaa127faL,0xd4ef3085L,0x4881d05L,0xd9d4d039L,0xe6db99e5L,0x1fa27cf8L,0xc4ac5665L,0xf4292244L,0x432aff97L,0xab9423a7L,0xfc93a039L,0x655b59c3L,0x8f0ccc92L,0xffeff47dL,0x85845dd1L,0x6fa87e4fL,0xfe2ce6e0L,0xa3014314L,0x4e0811a1L,0xf7537e82L,0xbd3af235L,0x2ad7d2bbL,0xeb86d391L};

第四步,计算:
首先定义四个基础运算并重新定义四个变量:
a=A,b=B,c=C,d=D

F(X,Y,Z)=(X&Y)|((~X)&Z)
G(X,Y,Z)=(X&Z)|(Y&(~Z))
H(X,Y,Z)=XYZ
I(X,Y,Z)=Y^(X|(~Z))

    private static long F(long x, long y, long z) {return (x & y) | ((~x) & z);}private static long G(long x, long y, long z) {return (x & z) | (y & (~z));}private static long H(long x, long y, long z) {return x ^ y ^ z;}private static long I(long x, long y, long z) {return y ^ (x | (~z));}

四轮大运算,每一轮运算包括16小轮,不断更新abcd的值

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

        /*第一轮*/a = FF(a, b, c, d, groups[0], s[i++], t[j++]); /* 1 i=0*/d = FF(d, a, b, c, groups[1], s[i++], t[j++]); /* 2 1*/c = FF(c, d, a, b, groups[2], s[i++], t[j++]); /* 3 2*/b = FF(b, c, d, a, groups[3], s[i++], t[j++]); /* 4 3*/a = FF(a, b, c, d, groups[4], s[i++], t[j++]); /* 5 4*/d = FF(d, a, b, c, groups[5], s[i++], t[j++]); /* 6 5*/c = FF(c, d, a, b, groups[6], s[i++], t[j++]); /* 7 6*/b = FF(b, c, d, a, groups[7], s[i++], t[j++]); /* 8 7*/a = FF(a, b, c, d, groups[8], s[i++], t[j++]); /* 9 8*/d = FF(d, a, b, c, groups[9], s[i++], t[j++]); /* 10 9 */c = FF(c, d, a, b, groups[10], s[i++], t[j++]); /* 11 10*/b = FF(b, c, d, a, groups[11], s[i++], t[j++]); /* 12 11*/a = FF(a, b, c, d, groups[12], s[i++], t[j++]); /* 13 12*/d = FF(d, a, b, c, groups[13], s[i++], t[j++]); /* 14 13*/c = FF(c, d, a, b, groups[14], s[i++], t[j++]); /* 15 14*/b = FF(b, c, d, a, groups[15], s[i++], t[j++]); /* 16 15*//*第二轮*/a = GG(a, b, c, d, groups[1], s[i++], t[j++]); /* 17 */d = GG(d, a, b, c, groups[6], s[i++], t[j++]); /* 18 */c = GG(c, d, a, b, groups[11], s[i++], t[j++]); /* 19 */b = GG(b, c, d, a, groups[0], s[i++], t[j++]); /* 20 */a = GG(a, b, c, d, groups[5], s[i++], t[j++]); /* 21 */d = GG(d, a, b, c, groups[10], s[i++], t[j++]); /* 22 */c = GG(c, d, a, b, groups[15], s[i++], t[j++]); /* 23 */b = GG(b, c, d, a, groups[4], s[i++], t[j++]); /* 24 */a = GG(a, b, c, d, groups[9], s[i++], t[j++]); /* 25 */d = GG(d, a, b, c, groups[14], s[i++], t[j++]); /* 26 */c = GG(c, d, a, b, groups[3], s[i++], t[j++]); /* 27 */b = GG(b, c, d, a, groups[8], s[i++], t[j++]); /* 28 */a = GG(a, b, c, d, groups[13], s[i++], t[j++]); /* 29 */d = GG(d, a, b, c, groups[2], s[i++], t[j++]); /* 30 */c = GG(c, d, a, b, groups[7], s[i++], t[j++]); /* 31 */b = GG(b, c, d, a, groups[12], s[i++], t[j++]); /* 32 *//*第三轮*/a = HH(a, b, c, d, groups[5], s[i++], t[j++]); /* 33 */d = HH(d, a, b, c, groups[8], s[i++], t[j++]); /* 34 */c = HH(c, d, a, b, groups[11], s[i++], t[j++]); /* 35 */b = HH(b, c, d, a, groups[14], s[i++], t[j++]); /* 36 */a = HH(a, b, c, d, groups[1], s[i++], t[j++]); /* 37 */d = HH(d, a, b, c, groups[4], s[i++], t[j++]); /* 38 */c = HH(c, d, a, b, groups[7], s[i++], t[j++]); /* 39 */b = HH(b, c, d, a, groups[10], s[i++], t[j++]); /* 40 */a = HH(a, b, c, d, groups[13], s[i++], t[j++]); /* 41 */d = HH(d, a, b, c, groups[0], s[i++], t[j++]); /* 42 */c = HH(c, d, a, b, groups[3], s[i++], t[j++]); /* 43 */b = HH(b, c, d, a, groups[6], s[i++], t[j++]); /* 44 */a = HH(a, b, c, d, groups[9], s[i++], t[j++]); /* 45 */d = HH(d, a, b, c, groups[12], s[i++], t[j++]); /* 46 */c = HH(c, d, a, b, groups[15], s[i++], t[j++]); /* 47 */b = HH(b, c, d, a, groups[2], s[i++], t[j++]); /* 48 *//*第四轮*/a = II(a, b, c, d, groups[0], s[i++], t[j++]); /* 49 */d = II(d, a, b, c, groups[7], s[i++], t[j++]); /* 50 */c = II(c, d, a, b, groups[14], s[i++], t[j++]); /* 51 */b = II(b, c, d, a, groups[5], s[i++], t[j++]); /* 52 */a = II(a, b, c, d, groups[12], s[i++], t[j++]); /* 53 */d = II(d, a, b, c, groups[3], s[i++], t[j++]); /* 54 */c = II(c, d, a, b, groups[10], s[i++], t[j++]); /* 55 */b = II(b, c, d, a, groups[1], s[i++], t[j++]); /* 56 */a = II(a, b, c, d, groups[8], s[i++], t[j++]); /* 57 */d = II(d, a, b, c, groups[15], s[i++], t[j++]); /* 58 */c = II(c, d, a, b, groups[6], s[i++], t[j++]); /* 59 */b = II(b, c, d, a, groups[13], s[i++], t[j++]); /* 60 */a = II(a, b, c, d, groups[4], s[i++], t[j++]); /* 61 */d = II(d, a, b, c, groups[11], s[i++], t[j++]); /* 62 */c = II(c, d, a, b, groups[2], s[i++], t[j++]); /* 63 */b = II(b, c, d, a, groups[9], s[i++], t[j++]); /* 64 */

运算完后,abcd获得了更新,然后赋值给ABCD;
A=A+a,B=b+B,C=c+C,D=d+D

第五步,输出
因为完成后,我们的结果还是小端存储的,即从左往右低地址->高地址,低字节->高字节
所以输出的时候需要从后往前输出,一直右移四位即可,并要十进制转十六进制。

代码实现

import java.util.Scanner;public class md5 {//存储应为小端存储static final String hexs[]={"0","1","2","3","4","5","6","7","8","9","a","b","c","d","e","f"};private static final long A=0x67452301L; //小端private static final long B=0xefcdab89L;private static final long C=0x98badcfeL;private static final long D=0x10325476L;//循环左移位数static 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};//常数数组Tstatic final long t[]={0xd76aa478L,0xe8c7b756L,0x242070dbL,0xc1bdceeeL,0xf57c0fafL,0x4787c62aL,0xa8304613L,0xfd469501L,0x698098d8L,0x8b44f7afL,0xffff5bb1L,0x895cd7beL,0x6b901122L,0xfd987193L,0xa679438eL,0x49b40821L,0xf61e2562L,0xc040b340L,0x265e5a51L,0xe9b6c7aaL,0xd62f105dL,0x02441453L,0xd8a1e681L,0xe7d3fbc8L,0x21e1cde6L,0xc33707d6L,0xf4d50d87L,0x455a14edL,0xa9e3e905L,0xfcefa3f8L,0x676f02d9L,0x8d2a4c8aL,0xfffa3942L,0x8771f681L,0x6d9d6122L,0xfde5380cL,0xa4beea44L,0x4bdecfa9L,0xf6bb4b60L,0xbebfbc70L,0x289b7ec6L,0xeaa127faL,0xd4ef3085L,0x4881d05L,0xd9d4d039L,0xe6db99e5L,0x1fa27cf8L,0xc4ac5665L,0xf4292244L,0x432aff97L,0xab9423a7L,0xfc93a039L,0x655b59c3L,0x8f0ccc92L,0xffeff47dL,0x85845dd1L,0x6fa87e4fL,0xfe2ce6e0L,0xa3014314L,0x4e0811a1L,0xf7537e82L,0xbd3af235L,0x2ad7d2bbL,0xeb86d391L};private long [] result={A,B,C,D};//存储hash结果,共4×32=128位private String digest(String inputStr){byte [] inputBytes=inputStr.getBytes();        //目前输入得到的为大端int byteLen=inputBytes.length;//长度(字节)long []groups=null;//每个小组(64字节)再细分后的16个小组(4字节)//进行填充int rest=byteLen%64;byte [] tempBytes=new byte[64]; //512/8=64字节for(int i=0;i<rest;i++)tempBytes[i]=inputBytes[byteLen-rest+i];if(rest<56){ //448/8=56tempBytes[rest]=(byte)(1<<7);//使用1填充10000000for(int i=1;i<56-rest;i++)tempBytes[rest+i]=0;//剩下的使用0填充}long len=(long)(byteLen<<3);//5*8=40,得到消息长度for(int i=0;i<8;i++){    //64-56=8,还剩下8个没有赋值if(i==0){tempBytes[56+i]=(byte)(len&0xFFL);}elsetempBytes[56+i]=0;}groups=divide_group(tempBytes);xunhuan(groups);//处理分组//将Hash值转换成十六进制的字符串(小端转大端)    低字节->高字节,所以从后往前输出String str="";long temp=0;for(int i=0;i<4;i++){for(int j=0;j<4;j++){ //[690955041, 2812630906, 239765827, 3273621578]    需要大小端转换,所以从后往前temp=result[i]&0x0FL;//提取十进制的最后一位即二进制的后四位String a=hexs[(int)(temp)];result[i]=result[i]>>4;   //最后一位已经拿出来,去掉,相当于除以16temp=result[i]&0x0FL;  //十进制转二进制最后四位str+=hexs[(int)(temp)]+a;result[i]=result[i]>>4; //再进行取出后四位操作}}return str;}/*** 从inputBytes的index开始取512位,作为新的分组* 将每一个512位的分组再细分成16个小组*/private static long[] divide_group(byte[] inputBytes){long [] temp=new long[16];for(int i=0;i<16;i++){temp[i]=www(inputBytes[4*i])|(www(inputBytes[4*i+1]))<<8|(www(inputBytes[4*i+2]))<<16|(www(inputBytes[4*i+3]))<<24;//将他们扩大相应的倍数,转成小端}return temp;}//调整符号,全都变成正值public static long www(byte b){return b < 0 ? b & 0x7F + 128 : b;}/*** 主要的操作,四轮循环* @param groups[]--每一个分组512位(64字节)*/private void xunhuan(long[] groups) {long a = result[0], b = result[1], c = result[2], d = result[3];int i=0,j=0;/*第一轮*/a = FF(a, b, c, d, groups[0], s[i++], t[j++]); /* 1 i=0*/d = FF(d, a, b, c, groups[1], s[i++], t[j++]); /* 2 1*/c = FF(c, d, a, b, groups[2], s[i++], t[j++]); /* 3 2*/b = FF(b, c, d, a, groups[3], s[i++], t[j++]); /* 4 3*/a = FF(a, b, c, d, groups[4], s[i++], t[j++]); /* 5 4*/d = FF(d, a, b, c, groups[5], s[i++], t[j++]); /* 6 5*/c = FF(c, d, a, b, groups[6], s[i++], t[j++]); /* 7 6*/b = FF(b, c, d, a, groups[7], s[i++], t[j++]); /* 8 7*/a = FF(a, b, c, d, groups[8], s[i++], t[j++]); /* 9 8*/d = FF(d, a, b, c, groups[9], s[i++], t[j++]); /* 10 9 */c = FF(c, d, a, b, groups[10], s[i++], t[j++]); /* 11 10*/b = FF(b, c, d, a, groups[11], s[i++], t[j++]); /* 12 11*/a = FF(a, b, c, d, groups[12], s[i++], t[j++]); /* 13 12*/d = FF(d, a, b, c, groups[13], s[i++], t[j++]); /* 14 13*/c = FF(c, d, a, b, groups[14], s[i++], t[j++]); /* 15 14*/b = FF(b, c, d, a, groups[15], s[i++], t[j++]); /* 16 15*//*第二轮*/a = GG(a, b, c, d, groups[1], s[i++], t[j++]); /* 17 */d = GG(d, a, b, c, groups[6], s[i++], t[j++]); /* 18 */c = GG(c, d, a, b, groups[11], s[i++], t[j++]); /* 19 */b = GG(b, c, d, a, groups[0], s[i++], t[j++]); /* 20 */a = GG(a, b, c, d, groups[5], s[i++], t[j++]); /* 21 */d = GG(d, a, b, c, groups[10], s[i++], t[j++]); /* 22 */c = GG(c, d, a, b, groups[15], s[i++], t[j++]); /* 23 */b = GG(b, c, d, a, groups[4], s[i++], t[j++]); /* 24 */a = GG(a, b, c, d, groups[9], s[i++], t[j++]); /* 25 */d = GG(d, a, b, c, groups[14], s[i++], t[j++]); /* 26 */c = GG(c, d, a, b, groups[3], s[i++], t[j++]); /* 27 */b = GG(b, c, d, a, groups[8], s[i++], t[j++]); /* 28 */a = GG(a, b, c, d, groups[13], s[i++], t[j++]); /* 29 */d = GG(d, a, b, c, groups[2], s[i++], t[j++]); /* 30 */c = GG(c, d, a, b, groups[7], s[i++], t[j++]); /* 31 */b = GG(b, c, d, a, groups[12], s[i++], t[j++]); /* 32 *//*第三轮*/a = HH(a, b, c, d, groups[5], s[i++], t[j++]); /* 33 */d = HH(d, a, b, c, groups[8], s[i++], t[j++]); /* 34 */c = HH(c, d, a, b, groups[11], s[i++], t[j++]); /* 35 */b = HH(b, c, d, a, groups[14], s[i++], t[j++]); /* 36 */a = HH(a, b, c, d, groups[1], s[i++], t[j++]); /* 37 */d = HH(d, a, b, c, groups[4], s[i++], t[j++]); /* 38 */c = HH(c, d, a, b, groups[7], s[i++], t[j++]); /* 39 */b = HH(b, c, d, a, groups[10], s[i++], t[j++]); /* 40 */a = HH(a, b, c, d, groups[13], s[i++], t[j++]); /* 41 */d = HH(d, a, b, c, groups[0], s[i++], t[j++]); /* 42 */c = HH(c, d, a, b, groups[3], s[i++], t[j++]); /* 43 */b = HH(b, c, d, a, groups[6], s[i++], t[j++]); /* 44 */a = HH(a, b, c, d, groups[9], s[i++], t[j++]); /* 45 */d = HH(d, a, b, c, groups[12], s[i++], t[j++]); /* 46 */c = HH(c, d, a, b, groups[15], s[i++], t[j++]); /* 47 */b = HH(b, c, d, a, groups[2], s[i++], t[j++]); /* 48 *//*第四轮*/a = II(a, b, c, d, groups[0], s[i++], t[j++]); /* 49 */d = II(d, a, b, c, groups[7], s[i++], t[j++]); /* 50 */c = II(c, d, a, b, groups[14], s[i++], t[j++]); /* 51 */b = II(b, c, d, a, groups[5], s[i++], t[j++]); /* 52 */a = II(a, b, c, d, groups[12], s[i++], t[j++]); /* 53 */d = II(d, a, b, c, groups[3], s[i++], t[j++]); /* 54 */c = II(c, d, a, b, groups[10], s[i++], t[j++]); /* 55 */b = II(b, c, d, a, groups[1], s[i++], t[j++]); /* 56 */a = II(a, b, c, d, groups[8], s[i++], t[j++]); /* 57 */d = II(d, a, b, c, groups[15], s[i++], t[j++]); /* 58 */c = II(c, d, a, b, groups[6], s[i++], t[j++]); /* 59 */b = II(b, c, d, a, groups[13], s[i++], t[j++]); /* 60 */a = II(a, b, c, d, groups[4], s[i++], t[j++]); /* 61 */d = II(d, a, b, c, groups[11], s[i++], t[j++]); /* 62 */c = II(c, d, a, b, groups[2], s[i++], t[j++]); /* 63 */b = II(b, c, d, a, groups[9], s[i++], t[j++]); /* 64 */result[0] = (result[0] + a) & 0xFFFFFFFFL;result[1] = (result[1] + b) & 0xFFFFFFFFL;result[2] = (result[2] + c) & 0xFFFFFFFFL;result[3] = (result[3] + d) & 0xFFFFFFFFL;}private static long F(long x, long y, long z) {return (x & y) | ((~x) & z);}private static long G(long x, long y, long z) {return (x & z) | (y & (~z));}private static long H(long x, long y, long z) {return x ^ y ^ z;}private static long I(long x, long y, long z) {return y ^ (x | (~z));}private static long FF(long a, long b, long c, long d, long x, long s,long t) {a = a + (F(b, c, d)&0xFFFFFFFFL) + x + t;a = ((a&0xFFFFFFFFL)<< s) | ((a&0xFFFFFFFFL) >>> (32 - s));a = a + b;return (a&0xFFFFFFFFL);}private static long GG(long a, long b, long c, long d, long x, long s,long t) {a = a + (G(b, c, d)&0xFFFFFFFFL) + x + t;a = ((a&0xFFFFFFFFL) << s) | ((a&0xFFFFFFFFL) >>> (32 - s));a = a + b;return (a&0xFFFFFFFFL);}private static long HH(long a, long b, long c, long d, long x, long s,long t) {a = a + (H(b, c, d)&0xFFFFFFFFL) + x + t;a = ((a&0xFFFFFFFFL) << s) | ((a&0xFFFFFFFFL) >>> (32 - s));a = a + b;return (a&0xFFFFFFFFL);}private static long II(long a, long b, long c, long d, long x, long s,long t) {a = a + (I(b, c, d)&0xFFFFFFFFL) + x + t;a = ((a&0xFFFFFFFFL) << s) | ((a&0xFFFFFFFFL) >>> (32 - s));a = a + b;return (a&0xFFFFFFFFL);}public static void main(String []args){md5 md=new md5();@SuppressWarnings("resource")Scanner sc=new Scanner(System.in);System.out.println("请输入你要加密的数据:");String str=sc.nextLine();System.out.println(str+"的MD5密文为:"+md.digest(str));}
}

详细过程MD5加密的原理+java实现相关推荐

  1. MD5加密原理和Java实现

    MD5加密算法为现在应用最广泛的哈希算法之一,该算法广泛应用于互联网网站的用户文件加密,能够将用户密码加密为128位的长整数.数据库并不明文存储用户密码,而是在用户登录时将输入密码字符串进行MD5加密 ...

  2. c md5加密 和java不一样_C#的MD5加密为什么和JAVA的加密出来的结果不一样?

    下面这个和java结果一样了.static void Main(string[] args) { string input = "3500000112345620141118050554&q ...

  3. MD5加密是什么?为什么不可解密?

    MD5是一种我们日常开发中经常使用到的加密方式,它使用起来操作简单且不可逆向解密.那么MD5到底是什么呢?又为什么不可逆呢?下面就来为大家介绍一下MD5加密的原理. 1.什么是MD5加密 MD5消息摘 ...

  4. RSA、MD5加密解密算法全套解析安装教程

    第一部分介绍加密解密算法, 第二部分介绍我小组成功应用的RSA.MD5两种加密解密算法,以及心得体会. 1.加密解密算法介绍 应用的开发中安全很重要,所以信息加密技术显得尤为重要.我们需要对应用中的多 ...

  5. Java实现Linux的md5加密,Linux_详细讲解:Linux系统GRUB的MD5加密方法,1、用grub-md5-crypt成生GRUB的md5密 - phpStudy...

    详细讲解:Linux系统GRUB的MD5加密方法 1.用grub-md5-crypt成生GRUB的md5密码: 通过grub-md5-crypt对GRUB的密码进行加密码运算,比如我们想设置grub的 ...

  6. 网站渗透测试原理及详细过程

    渗透测试实战 site:baidu.com 渗透测试思路 site:baidu.com 带你入门渗透测试的5个项目:https://www.jianshu.com/p/5b82e42ae346 渗透测 ...

  7. Java MD5加密工具

    1.基本原理 MD5加密算法,其全称是Message-Digest Algorithm 5,通常被称为信息摘要算法,所谓的信息摘要就是把明文内容按一定规则生成一段哈希(hash)值,即得到这段明文内容 ...

  8. Java实现MD5加密以及解密

    MD5的介绍 从本质上来说,MD5并不是一种加密算法,其全称是Message Digest Algorithm MD5(中文名:信息摘要算法第五版),为计算机安全领域广泛使用的一种散列函数,主要用于确 ...

  9. Java实现MD5加密和文件校验

    MD5简介: MD5的全称:Message-Digest Algorithm 5(信息-摘要算法5) MD5的加密方式是一种哈希加密.一些主流的编程语言都已经实现了MD5的加密,所以如果你的程序或是系 ...

最新文章

  1. hdu4740 Sum
  2. linux命令之vmstat
  3. 软概(lesson 2):课堂测试
  4. 线程可警告状态以及APC队列
  5. 带你自学Python系列(十四):Python函数的用法(四)
  6. 推荐分享一个自定义绑定控件(附源码)
  7. 别人改出了新BUG,怎么看?
  8. STM32示波器设计
  9. 【java】解决安装时时显示this version of the jdk is already installed……
  10. Hive文件存储格式(建表stored as 的五种类型)
  11. 鹅厂开源框架tars之基础组件
  12. 【Benewake(北醒) 】中距 TF02-Pro 40m介绍以及资料整理
  13. curator(curator)
  14. 最常用的10个mac应用,别问,问就是精品
  15. TrustData 2015年Q3中国移动互联网与双十一移动电商数据报告
  16. Linux之dd工具
  17. 法宣在线积分小程序python学满指定分钟数自动关闭
  18. Python报错:python.h 没有那个文件或目录
  19. 3.3V转1.8V外围简单降压芯片
  20. 深度报文检测 linux,深度报文检测,deep packet inspection,音标,读音,翻译,英文例句,英语词典...

热门文章

  1. Selenium的PO模式(Page Object Model)|(Selenium Webdriver For Python)
  2. DPC(Defect Pixel Correction)——坏点检测
  3. mysql随机生成名字,起名不求人
  4. 【机器学习经典算法】K近邻(KNN):核心与总结
  5. 《基于Python的金融分析与风险管理》学习笔记
  6. 计算机qwerty键盘,QWERTY键盘输入
  7. 计算机一级mcoffice考试题型,计算机一级MSOffice考试试题
  8. 228句最常用英文口语短句(转)
  9. 【力扣】买卖股票的最佳时机 II
  10. Flink滚动窗口函数的开窗起始时间计算规则