JavaMD5加密算法

package net.com.security;


import java.security.MessageDigest;

import java.security.NoSuchAlgorithmException;


public class MD5Test {




public String testMD5(String str){

String result = null;

try {

MessageDigest mdInst = MessageDigest.getInstance("MD5");

byte[] buffer = str.getBytes();

mdInst.update(buffer);

result = byteToHex(mdInst.digest());

} catch (NoSuchAlgorithmException e) {

e.printStackTrace();

}

return result;

}

private String byteToHex(byte[] buffer){

String temp = "";

String hex = "";

for(int i = 0; i if((temp = Integer.toHexString(buffer[i]&0xff)).length() == 1){

hex += "0"+temp;

}else{

hex += temp;

}

}

return hex;

}



public static void main(String[] args){

MD5Test md5Test = new MD5Test();



String str = "123456";

String result = md5Test.testMD5(str);

System.out.println("result="+result);

}



}

在32位的电脑中数字都是以32格式存放的,如果是一个byte(8位)类型的数字,他的高24位里面都是随机数字,低8位

才是实际的数据。java.lang.Integer.toHexString() 方法的参数是int(32位)类型,如果输入一个byte(8位)类型的数字,这个

方法会把这个数字的高24为也看作有效位,这就必然导致错误,使用& 0XFF操作,可以把高24位置0以避免这样错误


说明:

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=0X01234567

B=0X89abcdef

C=0Xfedcba98

D=0X76543210 处理位操作函数:

X,Y,Z为32位整数。

F(X,Y,Z) = X&Y|NOT(X)&Z

G(X,Y,Z) = X&Z|Y?(Z)

H(X,Y,Z) = X xor Y xor Z

I(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 do /*每一次,把数据原文存放在16个元素的数组X中. */

For j = 0 to 15 do

Set X[j] to M[i*16+j].

end /结束对J的循环 /* Save A as AA, B as BB, C as CC, and D as DD.

*/

AA = A

BB = B

CC = C

DD = D /* 第1轮*/

/* 以 [abcd k s i]表示如下操作

a = b + ((a + F(b,c,d) + X[k] + T[i]) <<< s). */ /* Do the following 16 operations. */

[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] /* 第2轮* */

/* 以 [abcd k s i]表示如下操作

a = b + ((a + G(b,c,d) + X[k] + T[i]) <<< s). */

/* Do the following 16 operations. */

[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] /* 第3轮*/

/* 以 [abcd k s i]表示如下操作

a = b + ((a + H(b,c,d) + X[k] + T[i]) <<< s). */

/* Do the following 16 operations. */

[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] /* 第4轮*/

/* 以 [abcd k s i]表示如下操作

a = b + ((a + I(b,c,d) + X[k] + T[i]) <<< s). */

/* Do the following 16 operations. */

[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 + AA

B = B + BB

C = C + CC

D = D + DD end /* 结束对I的循环*/ 输出结果。    RSA算法非常简单,概述如下:

找两素数p和q

取n=p*q

取t=(p-1)*(q-1)

取任何一个数e,要求满足e<t并且e与t互素(就是最大公因数为1)

取d*e%t==1

这样最终得到三个数: n d e

设消息为数M (M <n)

设c=(M**d)%n就得到了加密后的消息c

设m=(c**e)%n则 m == M,从而完成对c的解密。

注:**表示次方,上面两式中的d和e可以互换。

在对称加密中:

n d两个数构成公钥,可以告诉别人;

n e两个数构成私钥,e自己保留,不让任何人知道。

给别人发送的信息使用e加密,只要别人能用d解开就证明信息是由你发送的,构成了签名机制。

别人给你发送信息时使用d加密,这样只有拥有e的你能够对其解密。

rsa的安全性在于对于一个大数n,没有有效的方法能够将其分解

从而在已知n d的情况下无法获得e;同样在已知n e的情况下无法

求得d。

RSA简洁幽雅,但计算速度比较慢,通常加密中并不是直接使用RSA 来对所有的信息进行加密,

最常见的情况是随机产生一个对称加密的密钥,然后使用对称加密算法对信息加密,之后用

RSA对刚才的加密密钥进行加密。

最后需要说明的是,当前小于1024位的N已经被证明是不安全的

自己使用中不要使用小于1024位的RSA,最好使用2048位的。

你可能感兴趣的:(java,MD5)