`
luo1984207
  • 浏览: 3258 次
  • 性别: Icon_minigender_1
  • 来自: 上海
最近访客 更多访客>>
社区版块
存档分类
最新评论

JAVA MD5加密例子

    博客分类:
  • java
阅读更多
package md5;

import java.io.IOException;
import java.security.MessageDigest;

class MD5State {
int state[];
int count[];
byte buffer[];

public MD5State() {
buffer = new byte[64];
count = new int[2];
state = new int[4];

state[0] = 0x67452301;
state[1] = 0xefcdab89;
state[2] = 0x98badcfe;
state[3] = 0x10325476;

count[0] = count[1] = 0;
}

/** Create this State as a copy of another state */
public MD5State(MD5State from) {
this();

int i;

for (i = 0; i < buffer.length; i++)
this.buffer[i] = from.buffer[i];

for (i = 0; i < state.length; i++)
this.state[i] = from.state[i];

for (i = 0; i < count.length; i++)
this.count[i] = from.count[i];
}
};

public class MD5 {
/**
* MD5 state
*/
MD5State state;

/**
* If Final() has been called, finals is set to the current finals state.
* Any Update() causes this to be set to null.
*/
MD5State finals;

/**
* Padding for Final()
*/
static byte padding[] = { (byte) 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 };

/**
* Initialize MD5 internal state (object can be reused just by calling
* Init() after every Final()
*/
public synchronized void Init() {
state = new MD5State();
finals = null;
}

public MD5() {
this.Init();
}

public MD5(Object ob) {
this();
Update(ob.toString());
}

public String debugDump() {
return asHex();
}

private int rotate_left(int x, int n) {
return (x << n) | (x >>> (32 - n));
}

/*
* I wonder how many loops and hoops you'll have to go through to get
* unsigned add for longs in java
*/

private int uadd(int a, int b) {
long aa, bb;
aa = ((long) a) & 0xffffffffL;
bb = ((long) b) & 0xffffffffL;

aa += bb;

return (int) (aa & 0xffffffffL);
}

private int uadd(int a, int b, int c) {
return uadd(uadd(a, b), c);
}

private int uadd(int a, int b, int c, int d) {
return uadd(uadd(a, b, c), d);
}

private int FF(int a, int b, int c, int d, int x, int s, int ac) {
a = uadd(a, ((b & c) | (~b & d)), x, ac);
return uadd(rotate_left(a, s), b);
}

private int GG(int a, int b, int c, int d, int x, int s, int ac) {
a = uadd(a, ((b & d) | (c & ~d)), x, ac);
return uadd(rotate_left(a, s), b);
}

private int HH(int a, int b, int c, int d, int x, int s, int ac) {
a = uadd(a, (b ^ c ^ d), x, ac);
return uadd(rotate_left(a, s), b);
}

private int II(int a, int b, int c, int d, int x, int s, int ac) {
a = uadd(a, (c ^ (b | ~d)), x, ac);
return uadd(rotate_left(a, s), b);
}

private int[] Decode(byte buffer[], int len, int shift) {
int out[];
int i, j;

out = new int[16];

for (i = j = 0; j < len; i++, j += 4) {
out[i] = ((int) (buffer[j + shift] & 0xff))
| (((int) (buffer[j + 1 + shift] & 0xff)) <<
| (((int) (buffer[j + 2 + shift] & 0xff)) << 16)
| (((int) (buffer[j + 3 + shift] & 0xff)) << 24);
}

return out;
}

private void Transform(MD5State state, byte buffer[], int shift) {
int a = state.state[0], b = state.state[1], c = state.state[2], d = state.state[3], x[];

x = Decode(buffer, 64, shift);

/* Round 1 */
a = FF(a, b, c, d, x[0], 7, 0xd76aa478); /* 1 */
d = FF(d, a, b, c, x[1], 12, 0xe8c7b756); /* 2 */
c = FF(c, d, a, b, x[2], 17, 0x242070db); /* 3 */
b = FF(b, c, d, a, x[3], 22, 0xc1bdceee); /* 4 */
a = FF(a, b, c, d, x[4], 7, 0xf57c0faf); /* 5 */
d = FF(d, a, b, c, x[5], 12, 0x4787c62a); /* 6 */
c = FF(c, d, a, b, x[6], 17, 0xa8304613); /* 7 */
b = FF(b, c, d, a, x[7], 22, 0xfd469501); /* 8 */
a = FF(a, b, c, d, x[8], 7, 0x698098d8); /* 9 */
d = FF(d, a, b, c, x[9], 12, 0x8b44f7af); /* 10 */
c = FF(c, d, a, b, x[10], 17, 0xffff5bb1); /* 11 */
b = FF(b, c, d, a, x[11], 22, 0x895cd7be); /* 12 */
a = FF(a, b, c, d, x[12], 7, 0x6b901122); /* 13 */
d = FF(d, a, b, c, x[13], 12, 0xfd987193); /* 14 */
c = FF(c, d, a, b, x[14], 17, 0xa679438e); /* 15 */
b = FF(b, c, d, a, x[15], 22, 0x49b40821); /* 16 */

/* Round 2 */
a = GG(a, b, c, d, x[1], 5, 0xf61e2562); /* 17 */
d = GG(d, a, b, c, x[6], 9, 0xc040b340); /* 18 */
c = GG(c, d, a, b, x[11], 14, 0x265e5a51); /* 19 */
b = GG(b, c, d, a, x[0], 20, 0xe9b6c7aa); /* 20 */
a = GG(a, b, c, d, x[5], 5, 0xd62f105d); /* 21 */
d = GG(d, a, b, c, x[10], 9, 0x2441453); /* 22 */
c = GG(c, d, a, b, x[15], 14, 0xd8a1e681); /* 23 */
b = GG(b, c, d, a, x[4], 20, 0xe7d3fbc8); /* 24 */
a = GG(a, b, c, d, x[9], 5, 0x21e1cde6); /* 25 */
d = GG(d, a, b, c, x[14], 9, 0xc33707d6); /* 26 */
c = GG(c, d, a, b, x[3], 14, 0xf4d50d87); /* 27 */
b = GG(b, c, d, a, x[8], 20, 0x455a14ed); /* 28 */
a = GG(a, b, c, d, x[13], 5, 0xa9e3e905); /* 29 */
d = GG(d, a, b, c, x[2], 9, 0xfcefa3f8); /* 30 */
c = GG(c, d, a, b, x[7], 14, 0x676f02d9); /* 31 */
b = GG(b, c, d, a, x[12], 20, 0x8d2a4c8a); /* 32 */

/* Round 3 */
a = HH(a, b, c, d, x[5], 4, 0xfffa3942); /* 33 */
d = HH(d, a, b, c, x[8], 11, 0x8771f681); /* 34 */
c = HH(c, d, a, b, x[11], 16, 0x6d9d6122); /* 35 */
b = HH(b, c, d, a, x[14], 23, 0xfde5380c); /* 36 */
a = HH(a, b, c, d, x[1], 4, 0xa4beea44); /* 37 */
d = HH(d, a, b, c, x[4], 11, 0x4bdecfa9); /* 38 */
c = HH(c, d, a, b, x[7], 16, 0xf6bb4b60); /* 39 */
b = HH(b, c, d, a, x[10], 23, 0xbebfbc70); /* 40 */
a = HH(a, b, c, d, x[13], 4, 0x289b7ec6); /* 41 */
d = HH(d, a, b, c, x[0], 11, 0xeaa127fa); /* 42 */
c = HH(c, d, a, b, x[3], 16, 0xd4ef3085); /* 43 */
b = HH(b, c, d, a, x[6], 23, 0x4881d05); /* 44 */
a = HH(a, b, c, d, x[9], 4, 0xd9d4d039); /* 45 */
d = HH(d, a, b, c, x[12], 11, 0xe6db99e5); /* 46 */
c = HH(c, d, a, b, x[15], 16, 0x1fa27cf8); /* 47 */
b = HH(b, c, d, a, x[2], 23, 0xc4ac5665); /* 48 */

/* Round 4 */
a = II(a, b, c, d, x[0], 6, 0xf4292244); /* 49 */
d = II(d, a, b, c, x[7], 10, 0x432aff97); /* 50 */
c = II(c, d, a, b, x[14], 15, 0xab9423a7); /* 51 */
b = II(b, c, d, a, x[5], 21, 0xfc93a039); /* 52 */
a = II(a, b, c, d, x[12], 6, 0x655b59c3); /* 53 */
d = II(d, a, b, c, x[3], 10, 0x8f0ccc92); /* 54 */
c = II(c, d, a, b, x[10], 15, 0xffeff47d); /* 55 */
b = II(b, c, d, a, x[1], 21, 0x85845dd1); /* 56 */
a = II(a, b, c, d, x[8], 6, 0x6fa87e4f); /* 57 */
d = II(d, a, b, c, x[15], 10, 0xfe2ce6e0); /* 58 */
c = II(c, d, a, b, x[6], 15, 0xa3014314); /* 59 */
b = II(b, c, d, a, x[13], 21, 0x4e0811a1); /* 60 */
a = II(a, b, c, d, x[4], 6, 0xf7537e82); /* 61 */
d = II(d, a, b, c, x[11], 10, 0xbd3af235); /* 62 */
c = II(c, d, a, b, x[2], 15, 0x2ad7d2bb); /* 63 */
b = II(b, c, d, a, x[9], 21, 0xeb86d391); /* 64 */

state.state[0] += a;
state.state[1] += b;
state.state[2] += c;
state.state[3] += d;
}

public void Update(MD5State stat, byte buffer[], int offset, int length) {
int index, partlen, i, start;

finals = null;

/* Length can be told to be shorter, but not inter */
if ((length - offset) > buffer.length)
length = buffer.length - offset;

/* compute number of bytes mod 64 */
index = (int) (stat.count[0] >>> 3) & 0x3f;

if ((stat.count[0] += (length << 3)) < (length << 3))
stat.count[1]++;

stat.count[1] += length >>> 29;

partlen = 64 - index;

if (length >= partlen) {
for (i = 0; i < partlen; i++)
stat.buffer[i + index] = buffer[i + offset];

Transform(stat, stat.buffer, 0);

for (i = partlen; (i + 63) < length; i += 64)
Transform(stat, buffer, i);

index = 0;
} else
i = 0;

/* buffer remaining input */
if (i < length) {
start = i;
for (; i < length; i++)
stat.buffer[index + i - start] = buffer[i + offset];
}
}

public void Update(byte buffer[], int offset, int length) {
Update(this.state, buffer, offset, length);
}

public void Update(byte buffer[], int length) {
Update(this.state, buffer, 0, length);
}

public void Update(byte buffer[]) {
Update(buffer, 0, buffer.length);
}

public void Update(byte b) {
byte buffer[] = new byte[1];
buffer[0] = b;

Update(buffer, 1);
}

public void Update(String s) {
byte chars[];

chars = s.getBytes();

Update(chars, chars.length);
}

private byte[] Encode(int input[], int len) {
int i, j;
byte out[];

out = new byte[len];

for (i = j = 0; j < len; i++, j += 4) {
out[j] = (byte) (input[i] & 0xff);
out[j + 1] = (byte) ((input[i] >>> & 0xff);
out[j + 2] = (byte) ((input[i] >>> 16) & 0xff);
out[j + 3] = (byte) ((input[i] >>> 24) & 0xff);
}

return out;
}
public synchronized byte[] Final() {
byte bits[];
int index, padlen;
MD5State fin;

if (null == finals) {
fin = new MD5State(state);

bits = Encode(fin.count,;

index = (int) ((fin.count[0] >>> 3) & 0x3f);
padlen = (index < 56) ? (56 - index) : (120 - index);

Update(fin, padding, 0, padlen);
/**/
Update(fin, bits, 0,;

/* Update() sets finalds to null */
finals = fin;
}

return Encode(finals.state, 16);
}
public static String asHex(byte hash[]) {
StringBuilder buf = new StringBuilder(hash.length * 2);
int i;

for (i = 0; i < hash.length; i++) {
if (((int) hash[i] & 0xff) < 0x10)
buf.append("0");

buf.append(Long.toString((int) hash[i] & 0xff, 16));
}

return buf.toString();
}
public String asHex() {
return asHex(this.Final());
}

public static String md5crypt(String input) {
MD5 md5 = new MD5();
md5.Init();
md5.Update(input);
return md5.asHex();
}

public static String encodePassword(String password, String algorithm) {
byte[] unencodedPassword = password.getBytes();
MessageDigest md = null;
try {
// first create an instance, given the provider
md = MessageDigest.getInstance(algorithm);
} catch (Exception e) {
System.out.println(e.getMessage());
return password;
}
md.reset();
// call the update method one or more times
// (useful when you don't know the size of your data, eg. stream)
md.update(unencodedPassword);
// now calculate the hash
byte[] encodedPassword = md.digest();
StringBuffer buf = new StringBuffer();
for (int i = 0; i < encodedPassword.length; i++) {
if ((encodedPassword[i] & 0xff) < 0x10) {
buf.append("0");
}
buf.append(Long.toString(encodedPassword[i] & 0xff, 16));
}
return buf.toString();
}

public static String encodeString(String str) {
sun.misc.BASE64Encoder encoder = new sun.misc.BASE64Encoder();
return encoder.encodeBuffer(str.getBytes()).trim();
}

public static String decodeString(String str) {
sun.misc.BASE64Decoder dec = new sun.misc.BASE64Decoder();
try {
return new String(dec.decodeBuffer(str));
} catch (IOException io) {
throw new RuntimeException(io.getMessage(), io.getCause());
}
}

/**
* 算法可以使用:SHA-512,MD5,SHA-256等
* @param args
*/
public static void main(String[] args) {
String passwd = "admin";
String encodeString = encodePassword(passwd, "MD5");
System.out.println(encodeString);
System.out.println(md5crypt(passwd));
}
}
分享到:
评论

相关推荐

    java MD5加密 实例 例子

    java MD5加密的例子。可直接运行。

    MD5 加密解密例子

    MD5 加密解密例子 j2ee struts spring hibernate MD5

    java MD5加密

    java MD5加密 代码实例 没有bug 典型例子

    javaMD5加密小例子

    java MD5加密小例子 使用java实现MD5加密无需导入其它的支持包

    用java实现的md5加密与例子

    用java实现的md5加密与例子

    md5加密源码

    JAVA实现MD5加密的例子,调用getMD5String方法,双次MD5加密,单次MD5加密

    java 实现MD5加密算法的简单实例

    主要介绍了java 实现MD5加密算法的简单实例的相关资料,这里提供实例帮助大家应用这样的加密算法,需要的朋友可以参考下

    delphi的MD5加密

    在delphi7下md5加密好象不如JAVA下那么方便,收集网上的方法后做个这个例子。

    实现MD5加密实例代码

    本实例是java利用MD5进行加密的例子,md5加密为不可逆转加密方式

    Java-MD5加密

    用于MD5密码加密 方法简单现成例子! String str = HexUtil.hash(String); 即可!!!

    控制台输出用MD5加密方法

    很简单的例子 网上好多说的都看不懂 这个大家有点JAVA基础的都能看懂

    MD5加密实例

    一个超简单的MD5加密例子。。和大家来分享。QQ:332787853

    在java中使用MD5进行密码加密

    现在项目中,有很多基于安全的考虑,所以学习关于加密的知识已显得很重要啦,先上传一小例子,希望对大家有所帮助....

    JS实现AES-GCM加密,java实现AES-GCM解密。.md

    在工作中会经常遇到密码加密,URL传参要进行加密,在此我参照一个例子将用java实现的AES加解密程序用实例写出。JS实现AES-GCM加密,java实现AES-GCM解密

    MD5计算检验工具 x64

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

    java版web登录用RSA加密

    一个小例子,web加密登录,只有登录页面,请debug仔细看,验证时需看前台密码用md5加密后字符串跟后台解密后的字符串是否一致

    java licence生成例子

    Signature signet = java.security.Signature.getInstance("MD5withRSA"); signet.initSign(prikey); signet.update(plainText.getBytes()); byte[] signed = Base64.encodeToByte(signet.sign()); return ...

    [S036] MD5算法.rar

    介绍MD5加密算法基本情况MD5的全称是Message-Digest Algorithm 5,在90年代初由MIT的计算机科学实验室和RSA Data Security Inc发明,经MD2、MD3和MD4发展而来。 Message-Digest泛指字节串(Message)的Hash变换,就是...

    常见的加密算法实现源码分享-Java语言编写

    下载RAR文件后,对压缩包进行解压后,里面有详细的例子,导入IDEA或者ECLIPSE后,运行指定的Java文件,即可以直接使用。压缩包里面包含的加密算法有: AES、BASE4、DES、DH、HMAC、MD、PBE、SHA 这些算法可以直接...

Global site tag (gtag.js) - Google Analytics