日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

md5加密 java原理_md5 32位 加密原理 Java实现md5加密

發布時間:2023/12/19 java 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 md5加密 java原理_md5 32位 加密原理 Java实现md5加密 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

md5 32位 加密原理

簡單概括起來,MD5 算法的過程分為四步:處理原文,設置初始值,循環加工,拼接結果。

第一步:處理原文

首先,我們計算出原文長度(bit)對 512 求余的結果,如果不等于 448,就需要填充原文使得原文對 512 求余的結果等于 448。填充的方法是第一位填充 1,其余位填充 0。填充完后,信息的長度就是 512*N+448。

之后,用剩余的位置(512-448=64 位)記錄原文的真正長度,把長度的二進制值補在最后。這樣處理后的信息長度就是 512*(N+1)。

第二步:設置初始值

MD5 的哈希結果長度為 128 位,按每 32 位分成一組共 4 組。這 4 組結果是由 4 個初始值 A、B、C、D 經過不斷演變得到。MD5 的官方實現中,A、B、C、D 的初始值如下(16 進制):

public class md5Util {

/*

*四個鏈接變量

*/

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

}else{

F=c^(b|(~d));

g=(7*i)%16;

}

int tmp=d;

d=c;

c=b;

b=b+shift(a+F+K[i]+M[g],s[i]);

a=tmp;

}

Atemp=a+Atemp;

Btemp=b+Btemp;

Ctemp=c+Ctemp;

Dtemp=d+Dtemp;

}

/*

*填充函數

*處理后應滿足bits≡448(mod512),字節就是bytes≡56(mode64)

*填充方式為先加一個1,其它位補零

*最后加上64位的原來長度

*/

private int[] add(String str){

int num=((str.length()+8)/64)+1;//以512位,64個字節為一組

int strByte[]=new int[num*16];//64/4=16,所以有16個整數

for(int i=0;i

strByte[i]=0;

}

int i;

for(i=0;i

strByte[i>>2]|=str.charAt(i)<

}

strByte[i>>2]|=0x80<

/*

*添加原長度,長度指位的長度,所以要乘8,然后是小端序,所以放在倒數第二個,這里長度只用了32位

*/

strByte[num*16-2]=str.length()*8;

return strByte;

}

/*

*調用函數

*/

public String getMD5(String source){

init();

int strByte[]=add(source);

for(int i=0;i

int num[]=new int[16];

for(int j=0;j<16;j++){

num[j]=strByte[i*16+j];

}

MainLoop(num);

}

return changeHex(Atemp)+changeHex(Btemp)+changeHex(Ctemp)+changeHex(Dtemp);

}

/*

*整數變成16進制字符串

*/

private String changeHex(int a){

String str="";

for(int i=0;i<4;i++){

str+=String.format("%2s", Integer.toHexString(((a>>i*8)%(1<<8))&0xff)).replace(' ', '0');

}

return str;

}

}

總結

以上是生活随笔為你收集整理的md5加密 java原理_md5 32位 加密原理 Java实现md5加密的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。