package org.leopard.utils;
public class MD5Util {
/*************************************************
* 2.md5 类实现了RSA Data Security, Inc.在提交给IETF 3.的RFC1321中的MD5 message-digest
* 算法。 4.
*************************************************/
/*
* 下面这些S11-S44实际上是一个4*4的矩阵,在原始的C实现中是用#define 实现的, 这里把它们实现成为static
* final是表示了只读,切能在同一个进程空间内的多个 Instance间共享
*/
static final int S11 = 7;
static final int S12 = 12;
static final int S13 = 17;
static final int S14 = 22;
static final int S21 = 5;
static final int S22 = 9;
static final int S23 = 14;
static final int S24 = 20;
static final int S31 = 4;
static final int S32 = 11;
static final int S33 = 16;
static final int S34 = 23;
static final int S41 = 6;
static final int S42 = 10;
static final int S43 = 15;
static final int S44 = 21;
static final byte[] PADDING = { -128, 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 };
/*
* 下面的三个成员是MD5计算过程中用到的3个核心数据,在原始的C实现中 被定义到MD5_CTX结构中
*/
private static long[] state = new long[4]; // state (ABCD)
private static long[] count = new long[2]; // number of bits, modulo 2^64 (lsb
// first)
private static byte[] buffer = new byte[64]; // input buffer
/*
* digestHexStr是MD5的唯一一个公共成员,是最新一次计算结果的 16进制ASCII表示.
*/
public static String digestHexStr;
/*
* digest,是最新一次计算结果的2进制内部表示,表示128bit的MD5值.
*/
private static byte[] digest = new byte[16];
/*
* getMD5ofStr是类MD5最主要的公共方法,入口参数是你想要进行MD5变换的字符串
* 返回的是变换完的结果,这个结果是从公共成员digestHexStr取得的.
*/
public static String getMD5ofStr(String inbuf) {
md5Init();
md5Update(inbuf.getBytes(), inbuf.length());
md5Final();
digestHexStr = "";
for (int i = 0; i < 16; i++) {
digestHexStr += byteHEX(digest[i]);
}
return digestHexStr;
}
// 这是MD5这个类的标准构造函数,JavaBean要求有一个public的并且没有参数的构造函数
public MD5Util() {
md5Init();
return;
}
/* md5Init是一个初始化函数,初始化核心变量,装入标准的幻数 */
private static void md5Init() {
count[0] = 0L;
count[1] = 0L;
// /* Load magic initialization constants.
state[0] = 0x67452301L;
state[1] = 0xefcdab89L;
state[2] = 0x98badcfeL;
state[3] = 0x10325476L;
return;
}
/*
* F, G, H ,I 是4个基本的MD5函数,在原始的MD5的C实现中,由于它们是
* 简单的位运算,可能出于效率的考虑把它们实现成了宏,在java中,我们把它们 实现成了private方法,名字保持了原来C中的。
*/
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));
}
/*
* FF,GG,HH和II将调用F,G,H,I进行近一步变换 FF, GG, HH, and II transformations for
* rounds 1, 2, 3, and 4. Rotation is separate from addition to prevent
* recomputation.
*/
private static long FF(long a, long b, long c, long d, long x, long s, long ac) {
a += F(b, c, d) + x + ac;
a = ((int) a << s) | ((int) a >>> (32 - s));
a += b;
return a;
}
private static long GG(long a, long b, long c, long d, long x, long s, long ac) {
a += G(b, c, d) + x + ac;
a = ((int) a << s) | ((int) a >>> (32 - s));
a += b;
return a;
}
private static long HH(long a, long b, long c, long d, long x, long s, long ac) {
a += H(b, c, d) + x + ac;
a = ((int) a << s) | ((int) a >>> (32 - s));
a += b;
return a;
}
private static long II(long a, long b, long c, long d, long x, long s, long ac) {
a += I(b, c, d) + x + ac;
a = ((int) a << s) | ((int) a >>> (32 - s));
a += b;
return a;
}
/*
* md5Update是MD5的主计算过程,inbuf是要变换的字节串,inputlen是长度,这个
* 函数由getMD5ofStr调用,调用之前需要调用md5init,因此把它设计成private的
*/
private static void md5Update(byte[] inbuf, int inputLen) {
int i, index, partLen;
byte[] block = new byte[64];
index = (int) (count[0] >>> 3) & 0x3F;
// /* Update number of bits */
if ((count[0] += (inputLen << 3)) < (inputLen << 3))
count[1]++;
count[1] += (inputLen >>> 29);
partLen = 64 - index;
// Transform as many times as possible.
if (inputLen >= partLen) {
md5Memcpy(buffer, inbuf, index, 0, partLen);
md5Transform(buffer);
for (i = partLen; i + 63 < inputLen; i += 64) {
md5Memcpy(block, inbuf, 0, i, 64);
md5Transform(block);
}
index = 0;
} else
i = 0;
// /* Buffer remaining input */
md5Memcpy(buffer, inbuf, index, i, inputLen - i);
}
/*
* md5Final整理和填写输出结果
*/
private static void md5Final() {
byte[] bits = new byte[8];
int index, padLen;
// /* Save number of bits */
Encode(bits, count, 8);
// /* Pad out to 56 mod 64.
index = (int) (count[0] >>> 3) & 0x3f;
padLen = (index < 56) ? (56 - index) : (120 - index);
md5Update(PADDING, padLen);
// /* Append length (before padding) */
md5Update(bits, 8);
// /* Store state in digest */
Encode(digest, state, 16);
}
/*
* md5Memcpy是一个内部使用的byte数组的块拷贝函数,从input的inpos开始把len长度的
* 字节拷贝到output的outpos位置开始
*/
private static void md5Memcpy(byte[] output, byte[] input, int outpos, int inpos,
int len) {
int i;
for (i = 0; i < len; i++)
output[outpos + i] = input[inpos + i];
}
/*
* md5Transform是MD5核心变换程序,有md5Update调用,block是分块的原始字节
*/
private static void md5Transform(byte block[]) {
long a = state[0], b = state[1], c = state[2], d = state[3];
long[] x = new long[16];
Decode(x, block, 64);
/* Round 1 */
a = FF(a, b, c, d, x[0], S11, 0xd76aa478L); /* 1 */
d = FF(d, a, b, c, x[1], S12, 0xe8c7b756L); /* 2 */
c = FF(c, d, a, b, x[2], S13, 0x242070dbL); /* 3 */
b = FF(b, c, d, a, x[3], S14, 0xc1bdceeeL); /* 4 */
a = FF(a, b, c, d, x[4], S11, 0xf57c0fafL); /* 5 */
d = FF(d, a, b, c, x[5], S12, 0x4787c62aL); /* 6 */
c = FF(c, d, a, b, x[6], S13, 0xa8304613L); /* 7 */
b = FF(b, c, d, a, x[7], S14, 0xfd469501L); /* 8 */
a = FF(a, b, c, d, x[8], S11, 0x698098d8L); /* 9 */
d = FF(d, a, b, c, x[9], S12, 0x8b44f7afL); /* 10 */
c = FF(c, d, a, b, x[10], S13, 0xffff5bb1L); /* 11 */
b = FF(b, c, d, a, x[11], S14, 0x895cd7beL); /* 12 */
a = FF(a, b, c, d, x[12], S11, 0x6b901122L); /* 13 */
d = FF(d, a, b, c, x[13], S12, 0xfd987193L); /* 14 */
c = FF(c, d, a, b, x[14], S13, 0xa679438eL); /* 15 */
b = FF(b, c, d, a, x[15], S14, 0x49b40821L); /* 16 */
/* Round 2 */
a = GG(a, b, c, d, x[1], S21, 0xf61e2562L); /* 17 */
d = GG(d, a, b, c, x[6], S22, 0xc040b340L); /* 18 */
c = GG(c, d, a, b, x[11], S23, 0x265e5a51L); /* 19 */
b = GG(b, c, d, a, x[0], S24, 0xe9b6c7aaL); /* 20 */
a = GG(a, b, c, d, x[5], S21, 0xd62f105dL); /* 21 */
d = GG(d, a, b, c, x[10], S22, 0x2441453L); /* 22 */
c = GG(c, d, a, b, x[15], S23, 0xd8a1e681L); /* 23 */
b = GG(b, c, d, a, x[4], S24, 0xe7d3fbc8L); /* 24 */
a = GG(a, b, c, d, x[9], S21, 0x21e1cde6L); /* 25 */
d = GG(d, a, b, c, x[14], S22, 0xc33707d6L); /* 26 */
c = GG(c, d, a, b, x[3], S23, 0xf4d50d87L); /* 27 */
b = GG(b, c, d, a, x[8], S24, 0x455a14edL); /* 28 */
a = GG(a, b, c, d, x[13], S21, 0xa9e3e905L); /* 29 */
d = GG(d, a, b, c, x[2], S22, 0xfcefa3f8L); /* 30 */
c = GG(c, d, a, b, x[7], S23, 0x676f02d9L); /* 31 */
b = GG(b, c, d, a, x[12], S24, 0x8d2a4c8aL); /* 32 */
/* Round 3 */
a = HH(a, b, c, d, x[5], S31, 0xfffa39
没有合适的资源?快使用搜索试试~ 我知道了~
s2sh框架整合源码及所需jar包
共254个文件
svn-base:122个
jar:52个
xml:18个
3星 · 超过75%的资源 需积分: 3 14 下载量 25 浏览量
2014-04-08
15:19:42
上传
评论 1
收藏 34.76MB ZIP 举报
温馨提示
此框架为struts2+spring3.0+hibernate的整合以及配置,加载项目即可使用,其中含有mysql以及Oracle的配置。为了方便学习者使用,再次我写入了增删改查,还有所需的s2sh整合的jar包
资源推荐
资源详情
资源评论
收起资源包目录
s2sh框架整合源码及所需jar包 (254个子文件)
all-wcprops 7KB
all-wcprops 706B
all-wcprops 642B
all-wcprops 496B
all-wcprops 492B
all-wcprops 256B
all-wcprops 242B
all-wcprops 228B
all-wcprops 106B
all-wcprops 102B
all-wcprops 98B
all-wcprops 90B
MD5Util.class 7KB
FileUtil.class 6KB
ImageCodeServlet.class 4KB
BaseAction.class 2KB
Page.class 2KB
PropertiesUtil.class 1KB
User.class 1KB
DateUtil.class 1KB
UserServiceImpl.class 669B
UserAction.class 647B
UserDaoImpl.class 382B
UserService.class 128B
UserDao.class 116B
.classpath 833B
org.eclipse.wst.common.component 442B
org.eclipse.wst.jsdt.ui.superType.container 49B
entries 9KB
entries 974B
entries 808B
entries 657B
entries 656B
entries 395B
entries 387B
entries 367B
entries 296B
entries 245B
entries 241B
entries 208B
spring.jar 2.43MB
hibernate3.jar 1.88MB
aspectjweaver-1.6.12.jar 1.67MB
ojdbc14.jar 1.47MB
xwork-core-2.2.1.jar 997KB
xerces-2.6.2.jar 987KB
freemarker-2.3.16.jar 860KB
struts2-core-2.2.1.jar 755KB
commons-collections-3.2.1.jar 562KB
javassist-3.7.ga.jar 531KB
mysql-connector-java-5.0.4-bin.jar 484KB
c3p0-0.9.0.jar 476KB
antlr-2.7.5H3.jar 423KB
jstl-1.2.jar 405KB
standard.jar 384KB
ibatis-2.3.4.726.jar 375KB
log4j-1.2.14.jar 359KB
log4j-1.2.11.jar 342KB
cglib-nodep-2.1_3.jar 317KB
dom4j-1.6.1.jar 307KB
cglib-2.1.3.jar 276KB
commons-httpclient.jar 273KB
commons-lang-2.3.jar 240KB
commons-beanutils-1.8.0.jar 226KB
ognl-3.0.jar 224KB
jaxen-1.1-beta-7.jar 222KB
junit-4.4.jar 158KB
json-lib-2.4-jdk15.jar 155KB
oscache-2.4.1.jar 130KB
xml-apis.jar 121KB
commons-dbcp-1.2.2.jar 119KB
junit-3.8.1.jar 118KB
aspectjrt.jar 112KB
jaas.jar 102KB
servlet-api.jar 95KB
spring-context-support.jar 95KB
commons-io-1.3.2.jar 86KB
ezmorph-1.0.6.jar 84KB
struts2-convention-plugin-2.2.1.jar 64KB
commons-pool-1.3.jar 61KB
commons-fileupload-1.2.1.jar 56KB
struts2-json-plugin-2.2.1.jar 55KB
commons-logging-1.1.jar 52KB
ehcache-1.1.jar 46KB
commons-codec-1.3.jar 46KB
struts2-config-browser-plugin-2.2.1.jar 44KB
asm.jar 26KB
jstl.jar 20KB
asm-attrs.jar 16KB
jta.jar 9KB
struts2-spring-plugin-2.0.6.jar 8KB
jdbc2_0-stdext.jar 7KB
MD5Util.java 11KB
FileUtil.java 6KB
ImageCodeServlet.java 4KB
Page.java 1KB
BaseAction.java 1KB
User.java 980B
PropertiesUtil.java 913B
DateUtil.java 622B
共 254 条
- 1
- 2
- 3
资源评论
- 弹指2014-07-18呼呼 导入启动报错
- 秋天的云QQ2014-05-26怎么是报错的了
- 尼伯龍根2014-06-06很不错 很全
lucky_zmm
- 粉丝: 1
- 资源: 4
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功