`

MD4加密源码

    博客分类:
  • JAVA
阅读更多
public class MD4 {
	private int A, B, C, D;
	private int X[] = new int[16];

	public MD4() {

	}

	public String getMD4ofStr(String s) {
		byte[] buffer = new byte[str.length() * 2];
		byte[] bytes = str.getBytes();
		int j = 0;
		for (int i = 0; i < bytes.length; i++) {
			buffer[j++] = bytes[i];
			buffer[j++] = 0;
		}
		return toHexString(mdfour(buffer)).toUpperCase();	}

	private int F(int X, int Y, int Z) {
		return (X & Y) | ((~X) & Z);
	}

	private int G(int X, int Y, int Z) {
		return (X & Y) | (X & Z) | (Y & Z);
	}

	private int H(int X, int Y, int Z) {
		return X ^ Y ^ Z;
	}

	private int lshift(int x, int s) {
		if (s == 0) {
			return x;
		}
		return (((x << s) & 0xFFFFFFFF) | ((x >> (32 - s)) & (0x7FFFFFFF >> (31 - s))));
	}

	private int ROUND1(int a, int b, int c, int d, int k, int s) {
		return (lshift(a + F(b, c, d) + X[k], s));
	}

	private int ROUND2(int a, int b, int c, int d, int k, int s) {
		return (lshift(a + G(b, c, d) + X[k] + (int) 0x5A827999, s));
	}

	private int ROUND3(int a, int b, int c, int d, int k, int s) {
		return (lshift(a + H(b, c, d) + X[k] + (int) 0x6ED9EBA1, s));
	}

	private void mdfour64(int M[]) {
		int j;
		int AA, BB, CC, DD;
		for (j = 0; j < 16; j++) {
			X[j] = M[j];
		}
		AA = A;
		BB = B;
		CC = C;
		DD = D;
		A = ROUND1(A, B, C, D, 0, 3);
		D = ROUND1(D, A, B, C, 1, 7);
		C = ROUND1(C, D, A, B, 2, 11);
		B = ROUND1(B, C, D, A, 3, 19);
		A = ROUND1(A, B, C, D, 4, 3);
		D = ROUND1(D, A, B, C, 5, 7);
		C = ROUND1(C, D, A, B, 6, 11);
		B = ROUND1(B, C, D, A, 7, 19);
		A = ROUND1(A, B, C, D, 8, 3);
		D = ROUND1(D, A, B, C, 9, 7);
		C = ROUND1(C, D, A, B, 10, 11);
		B = ROUND1(B, C, D, A, 11, 19);
		A = ROUND1(A, B, C, D, 12, 3);
		D = ROUND1(D, A, B, C, 13, 7);
		C = ROUND1(C, D, A, B, 14, 11);
		B = ROUND1(B, C, D, A, 15, 19);
		
		A = ROUND2(A, B, C, D, 0, 3);
		D = ROUND2(D, A, B, C, 4, 5);
		C = ROUND2(C, D, A, B, 8, 9);
		B = ROUND2(B, C, D, A, 12, 13);
		A = ROUND2(A, B, C, D, 1, 3);
		D = ROUND2(D, A, B, C, 5, 5);
		C = ROUND2(C, D, A, B, 9, 9);
		B = ROUND2(B, C, D, A, 13, 13);
		A = ROUND2(A, B, C, D, 2, 3);
		D = ROUND2(D, A, B, C, 6, 5);
		C = ROUND2(C, D, A, B, 10, 9);
		B = ROUND2(B, C, D, A, 14, 13);
		A = ROUND2(A, B, C, D, 3, 3);
		D = ROUND2(D, A, B, C, 7, 5);
		C = ROUND2(C, D, A, B, 11, 9);
		B = ROUND2(B, C, D, A, 15, 13);
		
		A = ROUND3(A, B, C, D, 0, 3);
		D = ROUND3(D, A, B, C, 8, 9);
		C = ROUND3(C, D, A, B, 4, 11);
		B = ROUND3(B, C, D, A, 12, 15);
		A = ROUND3(A, B, C, D, 2, 3);
		D = ROUND3(D, A, B, C, 10, 9);
		C = ROUND3(C, D, A, B, 6, 11);
		B = ROUND3(B, C, D, A, 14, 15);
		A = ROUND3(A, B, C, D, 1, 3);
		D = ROUND3(D, A, B, C, 9, 9);
		C = ROUND3(C, D, A, B, 5, 11);
		B = ROUND3(B, C, D, A, 13, 15);
		A = ROUND3(A, B, C, D, 3, 3);
		D = ROUND3(D, A, B, C, 11, 9);
		C = ROUND3(C, D, A, B, 7, 11);
		B = ROUND3(B, C, D, A, 15, 15);
		
		A += AA;
		B += BB;
		C += CC;
		D += DD;
		A &= 0xFFFFFFFF;
		B &= 0xFFFFFFFF;
		C &= 0xFFFFFFFF;
		D &= 0xFFFFFFFF;
	}

	private void copy64(int M[], byte in[], int offset) {
		int i;
		for (i = 0; i < 16; i++) {
			M[i] = ((in[offset + i * 4 + 3] << 24) & 0xFF000000)
					| ((in[offset + i * 4 + 2] << 16) & 0xFF0000)
					| ((in[offset + i * 4 + 1] << 8) & 0xFF00)
					| (((int) in[offset + i * 4 + 0]) & 0xFF);
		}
	}

	private void copy64(int M[], byte in[]) {
		copy64(M, in, 0);
	}

	private void copy4(byte out[], int offset, int x) {
		out[offset] = (byte) (x & 0xFF);
		out[1 + offset] = (byte) ((x >> 8) & 0xFF);
		out[2 + offset] = (byte) ((x >> 16) & 0xFF);
		out[3 + offset] = (byte) ((x >> 24) & 0xFF);
	}

	private byte[] mdfour(byte in[]) {
		byte out[] = new byte[16];
		byte buf[] = new byte[128];
		int n = in.length;
		int M[] = new int[16];
		int b = n * 8;
		int i;
		int offset;
		A = 0x67452301;
		B = 0xefcdab89;
		C = 0x98badcfe;
		D = 0x10325476;
		offset = 0;
		while (n > 64) {
			copy64(M, in, offset);
			mdfour64(M);
			offset += 64;
			n -= 64;
		}
		for (i = 0; i < 128; i++) {
			buf[i] = (i + offset < in.length) ? in[offset + i] : 0;
		}
		buf[n] = (byte) 0x80;
		if (n <= 55) {
			copy4(buf, 56, b);
			copy64(M, buf);
			mdfour64(M);
		} else {
			copy4(buf, 120, b);
			copy64(M, buf);
			mdfour64(M);
			copy64(M, buf, 64);
			mdfour64(M);
		}
		for (i = 0; i < 128; i++) {
			buf[i] = 0;
		}
		copy64(M, buf);
		copy4(out, 0, A);
		copy4(out, 4, B);
		copy4(out, 8, C);
		copy4(out, 12, D);
		A = B = C = D = 0;
		return out;
	}

	private final char[] HEX_DIGITS = { '0', '1', '2', '3', '4', '5', '6', '7',
			'8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };

	private String toHexString(byte[] b) {
		return toHexString(b, 0, b.length);
	}

	private String toHexString(byte[] b, int off, int len) {
		char[] buf = new char[len * 2];
		for (int i = 0, j = 0, k; i < len;) {
			k = b[off + i++];
			buf[j++] = HEX_DIGITS[(k >>> 4) & 0x0F];
			buf[j++] = HEX_DIGITS[k & 0x0F];
		}
		return new String(buf);
	}

	public static void main(String[] args) {
		//System.out.println("MD4(\"root123\"):" + new MD4().getMD4ofStr("root123"));
		System.out.println("MD4(\"bms123\"):" + new MD4().getMD4ofStr("bms123"));
		System.out.println("MD4(\"bms123\"):" + new MD4().getMD4ofStr("bms123bms123bms123bms123bms123bms123bms123bms123"));
		//System.out.println("MD4(\"123456\"):" + new MD4().getMD4ofStr("123456"));
	}
}
分享到:
评论

相关推荐

    MD5 加密工具源码

    4. **安全应用**:理解MD5的局限性,避免在安全性要求高的场合直接使用MD5加密密码或其他敏感信息。 总之,MD5加密工具源码提供了一种便捷的方式来实现MD5哈希运算,无论是为了验证数据完整性还是进行其他用途,...

    MD4加密算法源码

    在C++中实现MD4加密,你需要理解以上概念并能够有效地将其转化为代码。这通常涉及定义结构体来存储中间结果,编写位操作函数,以及将输入字符串转化为适合处理的字节序列。C++源码文件可能包含了以下关键部分: 1. ...

    python进行MD5加密源码.zip

    Python中的MD5加密是一种常用的哈希函数,用于对数据进行单向加密,广泛应用于密码存储、数据完整性校验等领域。MD5全称为Message-Digest Algorithm 5,它将任意长度的二进制数据映射为固定长度的128位(16字节)的...

    md5加密算法源码,c语言源码

    md5加密算法源码: 一 \md5加密是对字符或密码进行的16位或32位等加密方式! 一般在普通MDB数据库经常用到,比如论坛数据库等.有用! 二 \加密解密并不矛盾,比如银行系统的128位加密现在谁可以轻易破的了呢? 虽然md5...

    易语言MD5加密源码.7z

    这个“易语言MD5加密源码”文件可能是为了帮助易语言开发者理解MD5算法的实现细节,或者提供一个可以直接在易语言项目中使用的MD5加密组件。通过学习和研究这些源代码,开发者可以加深对MD5算法的理解,并将其应用到...

    MD5加密源码

    以下是对MD5加密源码的详细解读: 1. **MD5算法概述** MD5算法是由美国计算机科学家Ronald Rivest于1991年设计的,它能将任意长度的输入(也叫做预映射)转换为固定长度的输出,通常是128位的哈希值,通常以32个...

    C# MD5加密 实例源码(加密解密)

    MD5(Message-Digest Algorithm 5)是一种广泛使用的哈希函数,它能够将任意长度的数据转化为固定长度的摘要,通常用于数据完整性校验和密码加密。在C#编程语言中,MD5加密也是一项常用的技术。下面我们将深入探讨C#...

    MD5加密算法源码.rar

    在给定的"MD5加密算法源码"中,你可能会看到以下结构: 1. **初始化**: 使用一组预定义的常量初始化四个32位的中间结果寄存器A、B、C和D。 2. **处理消息块**: MD5处理的是512位的消息块,将消息块分为16个32位的...

    易语言源码易语言MD5加密源码.rar

    在本压缩包“易语言源码易语言MD5加密源码.rar”中,包含的是易语言实现的MD5加密算法的源代码。 MD5(Message-Digest Algorithm 5)是一种广泛使用的哈希函数,能够将任意长度的信息映射为固定长度的输出,通常是...

    android小程序之MD5加密(源码)

    下面将详细解释MD5加密的基本原理、在Android中的应用以及如何实现一个简单的MD5加密源码。 一、MD5概述 MD5是由美国计算机科学家Ronald Rivest在1991年设计的一种强散列函数,它可以将任意大小的输入(也叫做预映...

    md5加密源码

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

    md5加密源码 md5加密源码

    如果你下载了"md5加密"的源码压缩包,里面可能包含不同编程语言(如C、Java、Python等)实现的MD5加密函数或类。这些源码可以作为学习和理解MD5加密机制的参考资料,但实际应用中应考虑使用更安全的替代方案。 总的...

    MD5加密算法vb源码

    这个压缩包中的"MD5加密算法"很可能包含了实现这些步骤的VB代码示例,你可以通过查看源码来学习如何在实际项目中应用MD5加密。在分析和理解代码时,注意学习如何与.NET Framework的加密服务交互,以及如何处理输入和...

    MD5加密类源码

    MD5(Message-Digest Algorithm 5)是一种广泛使用的哈希函数,主要应用于...通过理解以上知识点,开发者可以创建一个C++ MD5加密类,实现对数据的MD5哈希计算,并在项目中使用这些功能进行数据的验证或密码的存储。

    loadrunner MD5加密源码

    里面有md5加密源码,示例。loadrunner针对进行md5加密的参数做处理。

    MD5加密源码(C)

    同时,也可以通过这个源码测试自己的数据,验证其加密效果。 总之,MD5在信息安全领域扮演着重要的角色,虽然它在现代密码学中已被视为不安全,因为存在碰撞攻击的可能性,但它的基本原理和C语言实现仍然值得学习和...

    pb开发的MD5加密源码

    pb开发的MD5加密源码 导入sru文件 nvo_md5 lv_md5 lv_md5 = create nvo_md5 ls_psw = lv_md5.of_encrypt(ls_psw) destroy lv_md5 输入:456aaa 输出:40e256c04310e3c606433e5ef39fbd3b

Global site tag (gtag.js) - Google Analytics