一段MD5编码程序,在WTK2.2中编译通过,但模拟器中运行报错.请大家帮忙看看.

xhenry 2005-08-30 10:44:27
错误信息如下:
java.lang.SecurityException: Application not authorized to access the restricted API
at com.sun.midp.security.SecurityToken.checkIfPermissionAllowed(+40)
at com.sun.midp.security.SecurityToken.checkIfPermissionAllowed(+7)
at com.sun.midp.midletsuite.MIDletSuiteImpl.checkIfPermissionAllowed(+8)
at com.sun.midp.midlet.MIDletState.<init>(+78)
at javax.microedition.midlet.MIDletProxy.<init>(+5)
at javax.microedition.midlet.MIDlet.<init>(+13)
at Key.<init>(+4)
at Key.getHashString(+7)
at Key.MD5(+26)
at Key.commandAction(+144)
at javax.microedition.lcdui.Display$DisplayAccessor.commandAction(+282)
at javax.microedition.lcdui.Display$DisplayManagerImpl.commandAction(+10)
at com.sun.midp.lcdui.DefaultEventHandler.commandEvent(+68)
at com.sun.midp.lcdui.AutomatedEventHandler.commandEvent(+47)
at com.sun.midp.lcdui.DefaultEventHandler$QueuedEventHandler.run(+250)

源代码是从网上找的,主要都是数组和位运算,应该没有问题. 不知道j2me环境有什么特殊限制?
代码太长, 我就不放上来了, 大家可以自己搜索. 或者哪位能提供一个可以在j2me环境下运行的md5算法实现代码?
...全文
304 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
zjDelphiX 2005-12-05
  • 打赏
  • 举报
回复
这里有一段代码.基本不是硬编码的.标准C++下实现
你可以参考一下.
http://www.intergamezone.com/bbs/viewthread.php?tid=149&fpage=1
zyg158 2005-12-04
  • 打赏
  • 举报
回复

byte workBuf[] = new byte[32];
MD5 m = new MD5();
outbytes = m.getMD5ofByte(workBuf, workBuf.length);
zyg158 2005-12-04
  • 打赏
  • 举报
回复

// md5Transform是MD5核心变换程序,有md5Update调用,block是分块的原始字节
private void md5Transform(byte block[]) {
long a = state[0];
long b = state[1];
long c = state[2];
long 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, 0xfffa3942L); /* 33 */
d = HH(d, a, b, c, x[8], S32, 0x8771f681L); /* 34 */
c = HH(c, d, a, b, x[11], S33, 0x6d9d6122L); /* 35 */
b = HH(b, c, d, a, x[14], S34, 0xfde5380cL); /* 36 */
a = HH(a, b, c, d, x[1], S31, 0xa4beea44L); /* 37 */
d = HH(d, a, b, c, x[4], S32, 0x4bdecfa9L); /* 38 */
c = HH(c, d, a, b, x[7], S33, 0xf6bb4b60L); /* 39 */
b = HH(b, c, d, a, x[10], S34, 0xbebfbc70L); /* 40 */
a = HH(a, b, c, d, x[13], S31, 0x289b7ec6L); /* 41 */
d = HH(d, a, b, c, x[0], S32, 0xeaa127faL); /* 42 */
c = HH(c, d, a, b, x[3], S33, 0xd4ef3085L); /* 43 */
b = HH(b, c, d, a, x[6], S34, 0x4881d05L); /* 44 */
a = HH(a, b, c, d, x[9], S31, 0xd9d4d039L); /* 45 */
d = HH(d, a, b, c, x[12], S32, 0xe6db99e5L); /* 46 */
c = HH(c, d, a, b, x[15], S33, 0x1fa27cf8L); /* 47 */
b = HH(b, c, d, a, x[2], S34, 0xc4ac5665L); /* 48 */

/* Round 4 */
a = II(a, b, c, d, x[0], S41, 0xf4292244L); /* 49 */
d = II(d, a, b, c, x[7], S42, 0x432aff97L); /* 50 */
c = II(c, d, a, b, x[14], S43, 0xab9423a7L); /* 51 */
b = II(b, c, d, a, x[5], S44, 0xfc93a039L); /* 52 */
a = II(a, b, c, d, x[12], S41, 0x655b59c3L); /* 53 */
d = II(d, a, b, c, x[3], S42, 0x8f0ccc92L); /* 54 */
c = II(c, d, a, b, x[10], S43, 0xffeff47dL); /* 55 */
b = II(b, c, d, a, x[1], S44, 0x85845dd1L); /* 56 */
a = II(a, b, c, d, x[8], S41, 0x6fa87e4fL); /* 57 */
d = II(d, a, b, c, x[15], S42, 0xfe2ce6e0L); /* 58 */
c = II(c, d, a, b, x[6], S43, 0xa3014314L); /* 59 */
b = II(b, c, d, a, x[13], S44, 0x4e0811a1L); /* 60 */
a = II(a, b, c, d, x[4], S41, 0xf7537e82L); /* 61 */
d = II(d, a, b, c, x[11], S42, 0xbd3af235L); /* 62 */
c = II(c, d, a, b, x[2], S43, 0x2ad7d2bbL); /* 63 */
b = II(b, c, d, a, x[9], S44, 0xeb86d391L); /* 64 */
state[0] += a;
state[1] += b;
state[2] += c;
state[3] += d;
}

// Encode把long数组按顺序拆成byte数组,因为java的long类型是64bit的, 只拆低32bit,以适应原始C实现的用途
private void Encode(byte output[], long input[], int len) {
int i;
int j;

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

// Decode把byte数组按顺序合成成long数组,因为java的long类型是64bit的,
// 只合成低32bit,高32bit清零,以适应原始C实现的用途
private void Decode(long output[], byte input[], int len) {
int i;
int j;

for(i = 0, j = 0; j < len; i++, j += 4) {
output[i] = b2iu(input[j]) | (b2iu(input[j + 1])<<8) | (b2iu(input[j + 2])<<16) | (b2iu(input[j + 3])<<24);
}

return;
}

// b2iu是一个把byte按照不考虑正负号的原则的"升位"程序,因为java没有unsigned运算
private static long b2iu(byte b) {
return (b < 0) ? (b & (0x7F + 128)) : b;
}

// byteHEX(),用来把一个byte类型的数转换成十六进制的ASCII表示,
// 因为java中的byte的toString无法实现这一点,我们又没有C语言中的 sprintf(outbuf,"%02X",ib)
private static String byteHEX(byte ib) {
char Digit[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };
char ob[] = new char[2];
ob[0] = Digit[(ib>>>4) & 0X0F];
ob[1] = Digit[ib & 0X0F];

String s = new String(ob);

return s;
}
}
zyg158 2005-12-04
  • 打赏
  • 举报
回复
package dynamicP;

public class MD5 {
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 };
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;
private long state[] = new long[4]; // state(ABCD)
private long count[] = new long[2]; // number of bits, modulo 2^64
private byte buffer[] = new byte[64]; // input buffer

// digestHexStr是MD5的唯一一个公共成员,是最新一次计算结果的16进制ASCII表示.
private String digestHexStr;

// digest,是最新一次计算结果的2进制内部表示,表示128bit的MD5值.
private byte digest[] = new byte[16];

// 这是MD5这个类的标准构造函数,JavaBean要求有一个public的并且没有参数的构造函数
public MD5() {
md5Init();

return;
}

// getMD5ofStr是类MD5最主要的公共方法,入口参数是你想要进行MD5变换的字符串
// 返回的是变换完的结果,这个结果是从公共成员digestHexStr取得的.
public byte[] getMD5ofByte(byte inbuf[], int buflen) {
int len = buflen;
md5Init();
md5Update(inbuf, len);
md5Final();

byte digest2[] = new byte[16];
System.arraycopy(digest, 0, digest2, 0, digest.length);

return digest2;
}

// md5Init是一个初始化函数,初始化核心变量,装入标准的幻数
private void md5Init() {
count[0] = 0L;
count[1] = 0L;
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 long F(long x, long y, long z) {
return (x & y) | ((~x) & z);
}

private long G(long x, long y, long z) {
return (x & z) | (y & (~z));
}

private long H(long x, long y, long z) {
return x ^ y ^ z;
}

private 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 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 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 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 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 void md5Update(byte inbuf[], int inputLen) {
int i;
int index;
int 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 void md5Final() {
byte bits[] = new byte[8];
int index;
int 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 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];
}
}
prqin 2005-11-24
  • 打赏
  • 举报
回复
确实够晕的,还一个方法套一个方法,我觉得这样的代码不适合j2me,可以使用复杂度低一些的加密方法
sunjiancn 2005-10-31
  • 打赏
  • 举报
回复
中午没吃饭,现在看的有些头晕~
xhenry 2005-08-30
  • 打赏
  • 举报
回复
String str = MD5.getHashString("xxxxxx");
homesos 2005-08-30
  • 打赏
  • 举报
回复
你咋用滴
xhenry 2005-08-30
  • 打赏
  • 举报
回复

private static byte[] encode(long l){
byte[] out = new byte[8];
out[0] = (byte) (l & 0xff);
out[1] = (byte) ((l >>> 8) & 0xff);
out[2] = (byte) ((l >>> 16) & 0xff);
out[3] = (byte) ((l >>> 24) & 0xff);
out[4] = (byte) ((l >>> 32) & 0xff);
out[5] = (byte) ((l >>> 40) & 0xff);
out[6] = (byte) ((l >>> 48) & 0xff);
out[7] = (byte) ((l >>> 56) & 0xff);
return out;
}

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

private int[] decode(byte buffer[], int len, int offset){
int i, j;
for (i = j = 0; j < len; i++, j += 4) {
decodeBuffer[i] = (
(int) (buffer[j + offset] & 0xff)) |
(((int) (buffer[j + 1 + offset] & 0xff)) << 8) |
(((int) (buffer[j + 2 + offset] & 0xff)) << 16) |
(((int) (buffer[j + 3 + offset] & 0xff)) << 24
);
}
return decodeBuffer;
}

private static void transform(MD5State state, int[] x){
int a = state.state[0];
int b = state.state[1];
int c = state.state[2];
int d = state.state[3];

/* 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, 0x02441453); /* 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, 0x04881d05); /* 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;
}
}
xhenry 2005-08-30
  • 打赏
  • 举报
回复

private static final 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,
};

private class MD5State {

public boolean valid = true;

public void reset(){
state[0] = 0x67452301;
state[1] = 0xefcdab89;
state[2] = 0x98badcfe;
state[3] = 0x10325476;

bitCount = 0;
}

public int state[] = new int[4];

public long bitCount;

public byte buffer[] = new byte[64];

public MD5State() {
reset();
}

public void copy(MD5State from) {
System.arraycopy(from.buffer, 0, this.buffer, 0, this.buffer.length);
System.arraycopy(from.state, 0, this.state, 0, this.state.length);
this.valid = from.valid;
this.bitCount = from.bitCount;
}

public String toString(){
return state[0] + " " + state[1] + " " + state[2] + " " + state[3];
}
}


private static String toHex(byte hash[]){
StringBuffer buf = new StringBuffer(hash.length * 2);
for (int i=0; i<hash.length; i++){
int intVal = hash[i] & 0xff;
if (intVal < 0x10){
// append a zero before a one digit hex
// number to make it two digits.
buf.append("0");
}
buf.append(Integer.toHexString(intVal));
}
return buf.toString();
}

private static int FF (int a, int b, int c, int d, int x, int s, int ac) {
a += ((b & c) | (~b & d));
a += x;
a += ac;
//return rotateLeft(a, s) + b;
a = (a << s) | (a >>> (32 - s));
return a + b;
}

private static int GG (int a, int b, int c, int d, int x, int s, int ac) {
a += ((b & d) | (c & ~d));
a += x;
a += ac;
//return rotateLeft(a, s) + b;
a = (a << s) | (a >>> (32 - s));
return a + b;
}

private static int HH (int a, int b, int c, int d, int x, int s, int ac) {
a += (b ^ c ^ d);
a += x;
a += ac;
//return rotateLeft(a, s) + b;
a = (a << s) | (a >>> (32 - s));
return a + b;
}

private static int II (int a, int b, int c, int d, int x, int s, int ac) {
a += (c ^ (b | ~d));
a += x;
a += ac;
//return rotateLeft(a, s) + b;
a = (a << s) | (a >>> (32 - s));
return a + b;
}
xhenry 2005-08-30
  • 打赏
  • 举报
回复
public class MD5 {

public MD5 () {
reset();
}

public byte[] getHash() {
if (!finalState.valid) {
finalState.copy(workingState);
long bitCount = finalState.bitCount;
// Compute the number of left over bits
int leftOver = (int) (((bitCount >>> 3)) & 0x3f);
// Compute the amount of padding to add based on number of left over bits.
int padlen = (leftOver < 56) ? (56 - leftOver) : (120 - leftOver);
// add the padding
update(finalState, padding, 0, padlen);
// add the length (computed before padding was added)
update(finalState, encode(bitCount), 0, 8);
finalState.valid = true;
}
// make a copy of the hash before returning it.
return encode(finalState.state, 16);
}

public String getHashString(){
return toHex(this.getHash());
}

public static byte[] getHash(String s){
MD5 md5 = new MD5();
md5.update(s);
return md5.getHash();
}

public static String getHashString(String s){
MD5 md5 = new MD5();
md5.update(s);
return md5.getHashString();
}

public static byte[] getHash(String s, String enc) throws UnsupportedEncodingException {
MD5 md5 = new MD5();
md5.update(s, enc);
return md5.getHash();
}

public static String getHashString(String s, String enc) throws UnsupportedEncodingException {
MD5 md5 = new MD5();
md5.update(s, enc);
return md5.getHashString();
}


public void reset() {
workingState.reset();
finalState.valid = false;
}

public String toString(){
return getHashString();
}

private void update (MD5State state, byte buffer[], int offset, int length) {

finalState.valid = false;

// if length goes beyond the end of the buffer, cut it short.
if ((length + offset) > buffer.length){
length = buffer.length - offset;
}

// compute number of bytes mod 64
// this is what we have sitting in a buffer
// that have not been hashed yet
int index = (int) (state.bitCount >>> 3) & 0x3f;

// add the length to the count (translate bytes to bits)
state.bitCount += length << 3;

int partlen = 64 - index;

int i = 0;
if (length >= partlen) {
System.arraycopy(buffer, offset, state.buffer, index, partlen);
transform(state, decode(state.buffer, 64, 0));
for (i = partlen; (i + 63) < length; i+= 64){
transform(state, decode(buffer, 64, i));
}
index = 0;
}

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

public void update (byte buffer[], int offset, int length) {
update(workingState, buffer, offset, length);
}

public void update (byte buffer[], int length) {
update(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);
}

private void update (MD5State state, long l) {
update(
state,
new byte[] {
(byte)((l >>> 0) & 0xff),
(byte)((l >>> 8) & 0xff),
(byte)((l >>> 16) & 0xff),
(byte)((l >>> 24) & 0xff),
(byte)((l >>> 32) & 0xff),
(byte)((l >>> 40) & 0xff),
(byte)((l >>> 48) & 0xff),
(byte)((l >>> 56) & 0xff),
},
0,
8
);
}

public void update (String s) {
update(s.getBytes());
}

public void update (String s, String enc) throws UnsupportedEncodingException {
update(s.getBytes(enc));
}

private MD5State workingState = new MD5State();

private MD5State finalState = new MD5State();

private int[] decodeBuffer = new int[16];
prok 2005-08-30
  • 打赏
  • 举报
回复
不支持的api

13,100

社区成员

发帖
与我相关
我的任务
社区描述
Java J2ME
社区管理员
  • J2ME社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧