public final class Md5
{
/** return BytesMd5 (bytes, 0, Integer.MAX_VALUE) */
public static int[] BytesMd5(byte[] bytes)
{
return BytesMd5(bytes, 0, Integer.MAX_VALUE);
}
/**
* give the bytes and get the md result
* null bytes means from and end1 is 0
* return value is locally allocated array
* return[0] is highest 32 bits, return[3] is lowest 32 bits
* (((long)return[0]) << 32) | (return[1] & 0xFFFFFFFFL) is high 64 bits
* (((long)return[2]) << 32) | (return[3] & 0xFFFFFFFFL) is low 64 bits
* thread-safe without synchronized
*/
public static int[] BytesMd5(byte[] bytes, int from, int end1)
{
// bytes = Util.MaskNull(bytes);
// from = Util.Bound(from, 0, bytes.length);
// end1 = Util.Bound(end1, from, bytes.length);
/** !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
add code for checking the arguments here
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*/
int[] x = new int[20]; // x[16-19] means the md result in little-endian
x[16] = 0x67452301;
x[17] = 0xEFCDAB89;
x[18] = 0x98BADCFE;
x[19] = 0x10325476;
int n;
int d;
for (n = 0, d = from; d < end1 - 3; d += 4)
{
x[n++] = (bytes[d] & 0xFF) | ((bytes[d + 1] & 0xFF) << 8) //
| ((bytes[d + 2] & 0xFF) << 16) | ((bytes[d + 3] & 0xFF) << 24);
if (n == 16)
{
Transform(x);
n = 0;
}
}
if (d == end1)
x[n++] = 0x80;
else if (d == end1 - 1)
x[n++] = (bytes[d] & 0xFF) | 0x8000;
else if (d == end1 - 2)
x[n++] = (bytes[d] & 0xFF) | ((bytes[d + 1] & 0xFF) << 8) | 0x800000;
else /* d == len - 3 */
x[n++] = (bytes[d] & 0xFF) | ((bytes[d + 1] & 0xFF) << 8) //
| ((bytes[d + 2] & 0xFF) << 16) | 0x80000000;
if (n == 15)
x[n++] = 0;
if (n == 16)
{
Transform(x);
n = 0;
}
if (n < 14)
for ( ; n < 14; n++)
x[n] = 0;
x[14] = (end1 - from) << 3;
x[15] = (end1 - from) >> 29;
Transform(x);
x[0] = x[19];
x[1] = x[18];
x[2] = x[17];
x[3] = x[16];
return x;
}
/** return UnicodeMd5 (chars, 0, Integer.MAX_VALUE) */
public static int[] UnicodeMd5(char[] chars)
{
return UnicodeMd5(chars, 0, Integer.MAX_VALUE);
}
/**
* give the unicode chars and get the md result
* null chars means from and end1 is 0
* each unicode char is treated as two bytes in big-endian
* return value is locally allocated array
* return[0] is highest 32 bits, return[3] is lowest 32 bits
* (((long)return[0]) << 32) | (return[1] & 0xFFFFFFFFL) is high 64 bits
* (((long)return[2]) << 32) | (return[3] & 0xFFFFFFFFL) is low 64 bits
* thread-safe without synchronized
*/
public static int[] UnicodeMd5(char[] chars, int from, int end1)
{
// chars = Util.MaskNull(chars);
// from = Util.Bound(from, 0, chars.length);
// end1 = Util.Bound(end1, from, chars.length);
/** !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
add code for checking the arguments here
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*/
int[] x = new int[20]; // x[16-19] means the md result in little-endian
x[16] = 0x67452301;
x[17] = 0xEFCDAB89;
x[18] = 0x98BADCFE;
x[19] = 0x10325476;
int n;
int d;
for (n = 0, d = from; d < end1 - 1; d += 2)
{
x[n++] = (chars[d] >>> 8) | ((chars[d] & 0xFF) << 8) //
| ((chars[d + 1] >>> 8) << 16) | ((chars[d + 1] & 0xFF) << 24);
if (n == 16)
{
Transform(x);
n = 0;
}
}
if (d == end1)
x[n++] = 0x80;
else /* d == end1 - 1 */
x[n++] = (chars[d] >>> 8) | ((chars[d] & 0xFF) << 8) | 0x800000;
if (n == 15)
x[n++] = 0;
if (n == 16)
{
Transform(x);
n = 0;
}
if (n < 14)
for ( ; n < 14; n++)
x[n] = 0;
x[14] = (end1 - from) << 4;
x[15] = (end1 - from) >> 28;
Transform(x);
x[0] = x[19];
x[1] = x[18];
x[2] = x[17];
x[3] = x[16];
return x;
}
/** return UnicodeMd5(s, 0, Integer.MAX_VALUE) */
public static int[] UnicodeMd5(String s)
{
return UnicodeMd5(s, 0, Integer.MAX_VALUE);
}
/**
* give the unicode str and get the md result
* null str means from and end1 is 0
* each unicode char is treated as two bytes in big-endian
* return value is locally allocated array
* return[0] is highest 32 bits, return[3] is lowest 32 bits
* (((long)return[0]) << 32) | (return[1] & 0xFFFFFFFFL) is high 64 bits
* (((long)return[2]) << 32) | (return[3] & 0xFFFFFFFFL) is low 64 bits
* thread-safe without synchronized
*/
public static int[] UnicodeMd5(String str, int from, int end1)
{
// str = Util.MaskNull(str);
// from = Util.Bound(from, 0, str.length());
// end1 = Util.Bound(end1, from, str.length());
/** !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
add code for checking the arguments here
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*/
int[] x = new int[20]; // x[16-19] means the md result in little-endian
x[16] = 0x67452301;
x[17] = 0xEFCDAB89;
x[18] = 0x98BADCFE;
x[19] = 0x10325476;
int n;
int d;
for (n = 0, d = from; d < end1 - 1; d += 2)
{
x[n++] = (str.charAt(d) >>> 8) | ((str.charAt(d) & 0xFF) << 8) //
| ((str.charAt(d + 1) >>> 8) << 16) | ((str.charAt(d + 1) & 0xFF) << 24);
if (n == 16)
{
Transform(x);
n = 0;
}
}
if (d == end1)
x[n++] = 0x80;
else /* d == end1 - 1 */
x[n++] = (str.charAt(d) >>> 8) | ((str.charAt(d) & 0xFF) << 8) | 0x800000;
if (n == 15)
x[n++] = 0;
if (n == 16)
{
Transform(x);
n = 0;
}
if (n < 14)
for ( ; n < 14; n++)
x[n] = 0;
x[14] = (end1 - from) << 4;
x[15] = (end1 - from) >> 28;
Transform(x);
x[0] = x[19];
x[1] = x[18];
x[2] = x[17];
x[3] = x[16];
return x;
}
private static int F(int x, int y, int z)
{
return (x & y) | ((~x) & z);
}
private static int G(int x, int y, int z)
{
return (x & z) | (y & (~z));
}
private static int H(int x, int y, int z)
{
return x ^ y ^ z;
}
private static int I(int x, int y, int z)
{
return y ^ (x | (~z));
}
private static int FF(int a, int b, int c, int d, int x, int s, int ac)
{
a += F(b, c, d) + x + ac;
return ((a << s) | (a >>> (32 - s))) + b;
}
private static int GG(int a, int b, int c, int d, int x, int s, int ac)
{
a += G(b, c, d) + x + ac;
return ((a << s) | (a >>> (32 - s))) + b;
}
private static int HH(int a, int b, int c, int d, int x, int s, int ac)
{
a += H(b, c, d) + x + ac;
return ((a << s) | (a >>> (32 - s))) + b;
}
private static int II(int a, int b, int c, int d, int x, int s, int ac)
{
a += I(b, c, d) + x + ac;
return ((a << s) | (a >>> (32 - s))) + b;
}
private static void Transform(int[] x)
{
int a = x[16], b = x[17], c = x[18], d = x[19];
//
// Round 1
a = FF(a, b, c, d, x[0], 7, 0xD76AA478);
d = FF(d, a, b, c, x[1], 12, 0xE8C7B756);
c = FF(c, d, a, b, x[2], 17, 0x242070DB);
b = FF(b, c, d, a, x[3], 22, 0xC1BDCEEE);
//
a = FF(a, b, c, d, x[4], 7, 0xF57C0FAF);
d = FF(d, a, b, c, x[5], 12, 0x4787C62A);
c = FF(c, d, a, b, x[6], 17, 0xA8304613);
b = FF(b, c, d, a, x[7], 22, 0xFD469501);
//
a = FF(a, b, c, d, x[8], 7, 0x698098D8);
d = FF(d, a, b, c, x[9], 12, 0x8B44F7AF);
c = FF(c, d, a, b, x[10], 17, 0xFFFF5BB1);
b = FF(b, c, d, a, x[11], 22, 0x895CD7BE);
//
a = FF(a, b, c, d, x[12], 7, 0x6B901122);
d = FF(d, a, b, c, x[13], 12, 0xFD987193);
c = FF(c, d, a, b, x[14], 17, 0xA679438E);
b = FF(b, c, d, a, x[15], 22, 0x49B40821);
//
// Round 2
a = GG(a, b, c, d, x[1], 5, 0xF61E2562);
d = GG(d, a, b, c, x[6], 9, 0xC040B340);
c = GG(c, d, a, b, x[11], 14, 0x265E5A51);
b = GG(b, c, d, a, x[0], 20, 0xE9B6C7AA);
//
a = GG(a, b, c, d, x[5], 5, 0xD62F105D);
d = GG(d, a, b, c, x[10], 9, 0x2441453);
c = GG(c, d, a, b, x[15], 14, 0xD8A1E681);
b = GG(b, c, d, a, x[4], 20, 0xE7D3FBC8);
//
a = GG(a, b, c, d, x[9], 5, 0x21E1CDE6);
d = GG(d, a, b, c, x[14], 9, 0xC33707D6);
c = GG(c, d, a, b, x[3], 14, 0xF4D50D87);
b = GG(b, c, d, a, x[8], 20, 0x455A14ED);
//
a = GG(a, b, c, d, x[13], 5, 0xA9E3E905);
d = GG(d, a, b, c, x[2], 9, 0xFCEFA3F8);
c = GG(c, d, a, b, x[7], 14, 0x676F02D9);
b = GG(b, c, d, a, x[12], 20, 0x8D2A4C8A);
//
// Round 3
a = HH(a, b, c, d, x[5], 4, 0xFFFA3942);
d = HH(d, a, b, c, x[8], 11, 0x8771F681);
c = HH(c, d, a, b, x[11], 16, 0x6D9D6122);
b = HH(b, c, d, a, x[14], 23, 0xFDE5380C);
//
a = HH(a, b, c, d, x[1], 4, 0xA4BEEA44);
d = HH(d, a, b, c, x[4], 11, 0x4BDECFA9);
c = HH(c, d, a, b, x[7], 16, 0xF6BB4B60);
b = HH(b, c, d, a, x[10], 23, 0xBEBFBC70);
//
a = HH(a, b, c, d, x[13], 4, 0x289B7EC6);
d = HH(d, a, b, c, x[0], 11, 0xEAA127FA);
c = HH(c, d, a, b, x[3], 16, 0xD4EF3085);
b = HH(b, c, d, a, x[6], 23, 0x4881D05);
//
a = HH(a, b, c, d, x[9], 4, 0xD9D4D039);
d = HH(d, a, b, c, x[12], 11, 0xE6DB99E5);
c = HH(c, d, a, b, x[15], 16, 0x1FA27CF8);
b = HH(b, c, d, a, x[2], 23, 0xC4AC5665);
//
// Round 4
a = II(a, b, c, d, x[0], 6, 0xF4292244);
d = II(d, a, b, c, x[7], 10, 0x432AFF97);
c = II(c, d, a, b, x[14], 15, 0xAB9423A7);
b = II(b, c, d, a, x[5], 21, 0xFC93A039);
//
a = II(a, b, c, d, x[12], 6, 0x655B59C3);
d = II(d, a, b, c, x[3], 10, 0x8F0CCC92);
c = II(c, d, a, b, x[10], 15, 0xFFEFF47D);
b = II(b, c, d, a, x[1], 21, 0x85845DD1);
//
a = II(a, b, c, d, x[8], 6, 0x6FA87E4F);
d = II(d, a, b, c, x[15], 10, 0xFE2CE6E0);
c = II(c, d, a, b, x[6], 15, 0xA3014314);
b = II(b, c, d, a, x[13], 21, 0x4E0811A1);
//
a = II(a, b, c, d, x[4], 6, 0xF7537E82);
d = II(d, a, b, c, x[11], 10, 0xBD3AF235);
c = II(c, d, a, b, x[2], 15, 0x2AD7D2BB);
b = II(b, c, d, a, x[9], 21, 0xEB86D391);
//
//
x[16] += a;
x[17] += b;
x[18] += c;
x[19] += d;
}
}
分享到:
相关推荐
在给定的资源"节省资源的MD5算法.rar_md5"中,重点在于优化MD5计算过程以节省资源。这个优化主要体现在两个方面: 1. **节省内存分配**:在传统的MD5实现中,可能会频繁地创建和销毁临时对象来处理数据。而这个优化...
DLL是一种在Windows操作系统中实现代码共享的方式,它可以被多个应用程序同时调用,从而节省内存资源并提高执行效率。 开发人员通常会将常用或特定功能的代码封装成DLL,这样其他开发者在需要使用这些功能时,只需...
这个DLL封装了MD5加密功能,对于初学者来说,可以节省编写和调试MD5算法的时间,提高开发效率。不过需要注意的是,由于MD5的安全性问题,现在已不再推荐用于密码存储,而是应使用更安全的哈希算法,如SHA-256。
2. **快速**:由于MD5算法本身的高效性,加上软件的良好优化,使得《Md5Checker 中文版》在处理大量文件时依然能保持快速的计算速度。 3. **小巧易用**:软件体积小巧,不占用过多系统资源,且界面简洁直观,操作...
4. **"MD5加密.dll"**:这个DLL(动态链接库)文件可能包含了实现MD5加密算法的函数库,使得应用程序能够调用这些函数进行MD5计算。在Windows系统中,DLL文件允许多个程序共享同一段代码,节省内存资源。 5. **...
1. **MD5结构体和算法流程**:MD5算法由四个内部函数(F, G, H, I)和六个步骤(初始化、处理消息块、压缩、更新摘要、完成和输出摘要)组成。每个步骤都涉及到位操作、循环和异或运算。 2. **DLL(动态链接库)**...
MD5动态链接库(DLL)是一种在Windows操作系统中广泛使用的软件组件,它包含了一组预编译的函数,专门用于实现MD5(Message-Digest Algorithm 5)加密算法。MD5是由美国计算机科学家Ronald Rivest在1991年设计的,...
这些绿色版MD5校验工具的共同特点是无需安装,解压即用,节省系统资源,同时提供快速准确的MD5计算服务。在下载大型软件或重要文件时,使用这些工具可以确保文件在传输过程中未被篡改,保证了数据的完整性和安全性。...
由于MD5算法的特性,相同的输入会产生相同的输出,但反过来,从输出摘要无法推断出原始输入,这使得它在存储密码、文件校验等方面有着广泛应用。 标题"字符转MD5-DLL打包直接调用,方便"指出的是将字符串转化为MD5值...
在编程中,非递归算法通常比递归算法更节省系统资源,但可能需要更多的代码和复杂性管理。 8. **复数快速傅立叶变换算法(FFT for Complex Numbers)**:快速傅立叶变换是计算离散傅立叶变换的高效算法,对于复数...
在这个场景中,标题提到的是一个16位的MD5加密的DLL,这意味着该DLL提供了一个功能,用于计算MD5哈希值,并可能将其简化为16位的形式,这可能是为了适应某些特定的需求,如节省存储空间或简化比较。 DLL(Dynamic ...
MD5dll可能包含了实现MD5算法的函数,供其他程序调用以进行MD5计算。在编程中,开发者可以通过调用这些函数来对文件、字符串等数据进行MD5哈希运算,以验证数据的完整性和一致性。 测试MD5功能通常涉及到以下几个...
传统的MD5计算可能会因文件过大而导致内存溢出或计算时间过长,但这款工具专门优化了这一问题,可以分块处理大文件,避免一次性加载整个文件到内存中,既节省资源又提高了效率。这对于处理GB级别的大文件来说,是一...
在MATLAB中实现MD5算法,可以为数据完整性校验和密码存储等场景提供服务,而占用较少的内存资源。 在MATLAB中,我们可以利用内置的`hash`函数或者自定义函数来实现MD5计算。MATLAB的`hash`函数支持多种哈希算法,...
本文将深入探讨“万能图片MD5批量修改器”这一工具,它结合了图片MD5值修改与高速图片压缩的功能,对于提高工作效率具有显著帮助。 首先,MD5全称为Message-Digest Algorithm 5,是一种广泛使用的散列函数,能够将...
4. 使用STM32的HAL库或LL库来编写MD5相关的代码,以及如何优化性能和节省资源。 5. 可能包括的示例代码,展示如何将MD5集成到实际项目中,如通过串口发送和接收MD5校验的数据。 6. 开发环境的搭建,如使用STM32...
因此,这个脚本可能包含调用bsdiff的命令行操作,以生成或应用补丁,实现快速、节省资源的升级。 "合并"通常指的是将不同的改动集成到一个文件或代码库中。在私有化部署中,可能涉及到多个更新或定制化的合并,例如...
1. **初始化**:MD5算法开始时,使用一组固定的初始值填充四个32位的中间结果寄存器A、B、C和D。 2. **分块处理**:将输入数据分为连续的512位块,每个块经过一系列的处理步骤,包括异或、循环左移和函数应用。 3. *...