`
Huaqingfly
  • 浏览: 57038 次
社区版块
存档分类
最新评论

MD5摘要算法源码

阅读更多

public class MD5 {
    private 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
        };
    private static final int S11 = 7;
    private static final int S12 = 12;
    private static final int S13 = 17;
    private static final int S14 = 22;
    private static final int S21 = 5;
    private static final int S22 = 9;
    private static final int S23 = 14;
    private static final int S24 = 20;
    private static final int S31 = 4;
    private static final int S32 = 11;
    private static final int S33 = 16;
    private static final int S34 = 23;
    private static final int S41 = 6;
    private static final int S42 = 10;
    private static final int S43 = 15;
    private 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
    private String digestHexStr;
    private byte[] digest = new byte[16];

    public MD5() {
        md5Init();

        return;
    }

    public String getMD5ofString(byte[] inbuf, int buflen) {
        getMD5ofByte(inbuf, buflen);
        digestHexStr = "";

        for (int i = 0; i < 16; i++) {
            digestHexStr += byteHEX(digest[i]);
        }

        return digestHexStr;
    }

    public byte[] getMD5ofByte(byte[] inbuf, int buflen) {
        md5Init();
        md5Update(inbuf, buflen);
        md5Final();

        return digest;
    }

    private void md5Init() {
        count[0] = 0L;
        count[1] = 0L;
        state[0] = 0x67452301L;
        state[1] = 0xefcdab89L;
        state[2] = 0x98badcfeL;
        state[3] = 0x10325476L;

        return;
    }

    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));
    }

    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;
    }

    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);
    }

    private void md5Final() {
        byte[] bits = new byte[8];


分享到:
评论

相关推荐

    MD5摘要算法源码(java版)

    ### MD5摘要算法详解:Java实现 #### 一、引言 MD5(Message-Digest Algorithm 5)是一种广泛使用的密码散列函数,能够将任意长度的信息转化为一个固定长度(通常为128位)的散列值或摘要。这个摘要通常被用来验证...

    MD5摘要计算算法(C++版)源代码

    C++语言实现的MD5加密算法,附有详细的注释说明。

    MD5 加密算法 C++实现源码

    在`Md5.cpp`文件中,我们可以看到C++实现MD5的具体代码。通常,会有一个类(如`MD5`)封装了上述过程,提供一个接口供外部调用,如`hash1`函数,这个函数接受一个字符串作为参数,返回该字符串的MD5摘要。 `MD5.H`...

    MD5加密算法源码.rar

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

    MD5报文摘要算法代码

    MD5的主要用途是验证数据的完整性,比如在文件传输、软件下载或数据库存储时,通过比较源和目标的MD5值来确认数据是否一致。 在C++中实现MD5算法,通常涉及以下几个关键步骤: 1. **初始化**: 开始计算MD5时,会...

    md5摘要算法的C++实现源码

    MD5(Message-Digest Algorithm 5)是一种广泛使用的哈希函数,它能够将任意长度的输入数据转换成固定长度的128位(16字节)摘要。这个摘要具有不可逆性,即无法从摘要恢复原始数据,因此常用于验证文件完整性、密码...

    md5算法实现源代码

    在描述中提到的"md5算法实现源代码"通常包含了MD5计算过程的完整C语言或Python等编程语言的实现。这样的源代码可能包含以下几个部分: 1. **数据结构定义**:定义用于存储中间状态和最终结果的128位变量,如`uint32...

    MD5算法源码;加密算法

    1. **MD5类**:封装了MD5算法的实现,包括数据预处理、块处理和摘要计算的函数。 2. **主函数**:接收用户输入的字符串,调用MD5类的方法计算其MD5摘要,并打印结果。 3. **测试用例**:可能有一些预定义的字符串...

    MD5 报文摘要算法 源码

    MD5算法的设计目的是确保即使是最小的输入变化也会导致显著不同的输出摘要,从而提供数据完整性的验证。 MD5算法的主要特性包括: 1. **高效性**:MD5可以在32位计算机上快速运行,不需要大型的置换列表,因此它在...

    MD5校验算法源码 .c .h及一个使用例子

    MD5(Message-Digest Algorithm 5)...总的来说,这个压缩包提供了MD5校验算法的源代码和一个实际应用案例,对于理解和使用MD5进行数据校验非常有帮助。但同时也要注意MD5的安全性问题,避免在高安全要求的场景下使用。

    md5加密算法源代码和调用例子

    MD5的源代码通常由多个函数组成,包括初始化、处理数据块、最终化和结果转换为字符串等功能。核心算法包括四个主要的处理函数:F, G, H, I,以及一系列的位操作,如左移、异或等。在C语言中,这些函数可能被定义为:...

    MD5官方算法源代码

    在"MD5官方算法源代码.txt"文件中,你可以找到MD5算法的具体C语言或其他编程语言实现,这将帮助你理解MD5的内部工作机制。而"www.pudn.com.txt"可能是提供该资源的网站信息,可能包含下载链接或版权信息。 尽管MD5...

    MD5算法源码 下载

    1. `md5.cpp`: 这是实现MD5算法的C++源代码文件。它可能包含了MD5的内部函数,如初始化状态向量、处理消息块以及生成最终的哈希值等步骤。 2. `test.cpp`: 这是测试MD5功能的代码,用于验证`md5.cpp`中的实现是否...

    md5算法源码

    由于MD5算法存在已知的碰撞攻击方法,即可以构造两个不同的输入产生相同的MD5摘要,这使得MD5不适合用于需要高度安全性的场景,如数字签名或密码存储。在这些情况下,更安全的哈希函数,如SHA-256或SHA-3,通常会被...

    MD5加密算法C++源代码

    在压缩包中的"MD5加密算法VC++"文件可能是一个实现了MD5算法的C++源代码项目,适用于Visual C++开发环境。该项目可能包含了MD5类的定义、实现和测试用例。你可以通过编译和运行这个项目来验证其正确性,也可以通过...

    MD5自动校验算法程序源代码

    MD5自动校验算法程序源代码是实现这一功能的软件代码,它通过计算文件的MD5值并与预知的正确值进行比较,来验证文件是否完整无误。这种程序对于下载大文件、软件分发和系统镜像验证等场景非常实用。 MD5算法的基本...

    经典的md5算法源码

    标题:"经典的md5算法源码" 描述:"md5算法源码,具体的算法描述在此不详述,请参考相关资料。" 标签:"md5" 基于提供的标题、描述和部分代码内容,我们可以深入探讨MD5(Message-Digest Algorithm 5)算法的核心...

    MD5加密算法的源代码

    为了使用这些源代码,你需要将它们包含到你的C++项目中,然后调用上述函数对数据进行MD5加密。需要注意的是,MD5算法虽然快速且广泛使用,但已知存在安全性问题,容易受到碰撞攻击。因此,在需要更高安全性的场景下...

    md5加密算法源码

    1. **初始化变量**:MD5算法开始时会设置四个32位的变量A、B、C和D,它们是处理过程中的工作区。这些变量的初始值是预定义的常量。 2. **处理数据块**:将输入数据分为多个512位的块进行处理。每个数据块被拆分成16...

    md5 信息摘要算法源码

    C语言实现的MD5信息摘要算法源码,通常包括以下几个关键部分: 1. **初始化函数**:MD5算法开始时,会初始化四个32位的变量,A、B、C和D,以及一个64字节的缓冲区。这些变量的初始值是预定义的常量,用于后续的计算...

Global site tag (gtag.js) - Google Analytics