当前位置:  编程技术>c/c++/嵌入式

c++实现MD5算法实现代码

    来源: 互联网  发布时间:2014-10-22

    本文导语:  测试结果和百度百科测试例子一致。 实现过程中需要注意事项:最后把四个变量A B C D 链接成结果时 ,注意变量高低位的先后顺序,具体参考 LinkResult()方法。 md5.h 代码如下:#ifndef _MD5_H_#define _MD5_H_ #include #include using namespace...

测试结果和百度百科测试例子一致。

实现过程中需要注意事项:最后把四个变量A B C D 链接成结果时 ,注意变量高低位的先后顺序,具体参考 LinkResult()方法。

md5.h

代码如下:

#ifndef _MD5_H_
#define _MD5_H_

#include
#include
using namespace std;

class MD5
{
    public:
        typedef unsigned char uchar8; //make sure it is 8bit
        typedef char char8; //make sure it is 8bit
        MD5();

        void init();

        void UpdateMd5(const uchar8 input[], const int length);     
        void UpdateMd5(const char8 input[], const int length);    

        void Finalize();

        void ComputMd5(const uchar8 input[], const int length);
        void ComputMd5(const char8 input[], const int length);

        string GetMd5();

        void printMd5();

       
    private:
        typedef unsigned int uint32;       //make sure it is 32 bit;
        typedef unsigned long long uint64; //make sure it is 64 bit;
        uint32 A, B, C, D;
        const static int blockLen_ = 64;    // 512/8                                 
        //the remain after last updata (because md5 may be computed segment by segment)
        uchar8 remain_[blockLen_];                   
        int remainNum_ ;         // the number of remain_,  < 64
        uint64 totalInputBits_;
        uchar8 md5Result_[16];   //bit style md5 result,totally 128 bit
        char md5Result_hex_[33]; //hexadecimal style result; md5Result_hex_[32]=''
        bool isDone_;            // indicate the comput is finished;

        inline uint32 RotateLeft(const uint32 x, int n);
        inline uint32 F(const uint32 x, const uint32 y, const uint32 z);
        inline uint32 G(const uint32 x, const uint32 y, const uint32 z);
        inline uint32 H(const uint32 x, const uint32 y, const uint32 z);
        inline uint32 I(const uint32 x, const uint32 y, const uint32 z);
        inline void FF(uint32 &a, const uint32 b, const uint32 c, const uint32 d,
                       const uint32 Mj, const int s, const uint32 ti);
        inline void GG(uint32 &a, const uint32 b, const uint32 c, const uint32 d,
                       const uint32 Mj, const int s, const uint32 ti);
        inline void HH(uint32 &a, const uint32 b, const uint32 c, const uint32 d,
                       const uint32 Mj, const int s, const uint32 ti);
        inline void II(uint32 &a, const uint32 b, const uint32 c, const uint32 d,
                       const uint32 Mj, const int s, const uint32 ti);
                      

        void UcharToUint(uint32 output[], const uchar8 input[], const unsigned int transLength);

        void FourRound(const uchar8 block[]);   

        void LinkResult();

};

/* user guide
   you can comput the md5 by using the funtion ComputMd5
   eg:
       MD5 m;
       MD5::char8 str[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
       m.ComputMd5(str,sizeof(str) - 1);  
       m.printMd5();

    if you want to comput segment by segment,you can do as follow, and init() is suggested
    the begging,and Finalize() must call in the end:

        MD5 M;
        m.init();
        MD5::uchar8 str1[] = "ABCDEFGHIJKLMN";
        MD5::uchar8 str2[] = "OPQRSTUVWXYZabcdefghijk";
        MD5::uchar8 str3[] = "lmnopqrstuvwxyz";
        m.UpdateMd5(str1,sizeof(str1) - 1);
        m.UpdateMd5(str2,sizeof(str2) - 1);
        m.UpdateMd5(str3,sizeof(str3) - 1);
        m.Finalize();
        m.printMd5();

    if you want to comput the md5 of a file, you can use the interface of this program.
*/

#endif

md5.cpp

代码如下:

#include"md5.h"

#include
using namespace std;

const int S[4][4] = {7, 12, 17, 22,
                     5, 9, 14, 20,
                     4, 11, 16, 23,
                     6, 10, 15, 21};
void MD5::init()
{
    A = 0x67452301;
    B = 0xefcdab89;
    C = 0x98badcfe;
    D = 0x10325476;
    remainNum_ = 0;
    remain_[0] = '';
    md5Result_hex_[0] = '';
    md5Result_[0] = '';
    totalInputBits_ = 0;
    isDone_ = false;
}

MD5::MD5()
{
    init();
}

inline MD5::uint32 MD5::RotateLeft(const uint32 x, int n)
{
    return (x > (32-n));       
    // if x is signed, use: (x > (32-n))
}
inline MD5::uint32 MD5::F(const uint32 x, const uint32 y, const uint32 z)
{
    return (x & y) | ((~x) & z);
}
inline MD5::uint32 MD5::G(const uint32 x, const uint32 y, const uint32 z)
{
    return (x & z) | (y & (~z));
}
inline MD5::uint32 MD5::H(const uint32 x, const uint32 y, const uint32 z)
{
    return x ^ y ^ z;
}
inline MD5::uint32 MD5::I(const uint32 x, const uint32 y, const uint32 z)
{
    return y ^ (x | (~z));
}

inline void MD5::FF(uint32 &a, const uint32 b, const uint32 c, const uint32 d,
                    const uint32 Mj, const int s, const uint32 ti)
{
    a = b + RotateLeft(a + F(b, c, d) + Mj + ti, s);
}     
inline void MD5::GG(uint32 &a, const uint32 b, const uint32 c, const uint32 d,
                    const uint32 Mj, const int s, const uint32 ti)
{
    a = b + RotateLeft(a + G(b, c, d) + Mj + ti, s);
}                  
inline void MD5::HH(uint32 &a, const uint32 b, const uint32 c, const uint32 d,
                    const uint32 Mj, const int s, const uint32 ti)
{
    a = b + RotateLeft(a + H(b, c, d) + Mj + ti, s);
}                   
inline void MD5::II(uint32 &a, const uint32 b, const uint32 c, const uint32 d,
                    const uint32 Mj, const int s, const uint32 ti)
{
    a = b + RotateLeft(a + I(b, c, d) + Mj + ti, s);
}         

// link A B C D to result(bit style result and hexadecimal style result)
void MD5::LinkResult()
{
    //bit style result
    for(int i = 0; i < 4; i++)  //link A: low to high
    {
        md5Result_[i] = (A >> 8*i) & 0xff;
    }
    for(int i = 4; i> 8*(i - 4)) & 0xff;
    }
    for(int i = 8; i> 8*(i - 8)) & 0xff;
    }
    for(int i = 12; i> 8*(i - 12)) & 0xff;
    }

    //change to hexadecimal style result
    // note: it is not the same as simply link hex(A) hex(B) hex(C) hex(D)
    for(int i = 0; i < 16; i++)
        sprintf(& md5Result_hex_[i*2], "%02x", md5Result_[i]);
    md5Result_hex_[32] = '';

}

//print the md5 by hex
void MD5::printMd5()
{
    if(!isDone_)
    {
        cout


    
 
 

您可能感兴趣的文章:

  • Base64编码原理详解及c++编码解码实现
  • 我实现了个J2EE技术的服务器,支持TCP、UDP和数据库,由于性能的原因,需要改为C或C++实现,我是C、C++新手,我该如何入手呢?看什么样的
  • c++实现MD5算法代码示例
  • java 与 C++ 实现后绑定的方法
  • c++通用模板类(template class)定义实现详细介绍
  • Qt实现的C++框架 qtioccontainer
  • 用C或C++实现主存的分配与回收
  • IP地址数字互转 iis7站长之家
  • 文本压缩算法C++实现 Golden Huffman
  • C++标准库实现 libc++
  • C++的XMLRPC实现 XMLRPC++
  • Java/JavaScript API 的 C++ 实现 libj
  • c++ 连接两个字符串实现代码 实现类似strcat功能
  • c++在unix中如何实现CString的方法?或者说有没有替换CString的类?
  • 请问:java中如何实现C++中的sizeof()方法?
  • 用C或C++编程,模拟可变分区存储管理且首次适应的算法实现存储器的分配与回收
  • vim中如何实现c++代码编写的自动格式化和语法高亮的功能?
  • C++实现CreatThread函数主线程与工作线程交互的方法
  • 请教为什么在C++编译通过并实现的程序,在linux下就会出错
  • linux下c++怎样实现回调(CALLBACK)函数?
  • 在linux下如何用c++实现建立一个文件夹
  • boost unordered_map和std::list相结合的实现LRU算法
  • 那位高人有任务分配问题的禁忌搜索算法、模拟退火算法的算法实现程序啊
  • 使用java jdk中的LinkedHashMap实现简单的LRU算法
  • 【算法】扑克发牌算法实现
  • c语言实现MD5算法完整代码示例
  • C++实现查找中位数的O(N)算法和Kmin算法
  • MD5算法的C语言实现
  • 有没谁对pagerank算法实现有了解?
  • 有没有函数实现压缩算法?
  • 最短路径算法实现 k-shortest-paths
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 通过javascript实现DIV居中,兼容各浏览器版本
  • socket实现多文件并发传输,求助多线程实现问题?
  • Python GUI编程:tkinter实现一个窗口并居中代码
  • interface 到底有什么用???实现接口,怎么实现??
  • 通过javascript库JQuery实现页面跳转功能代码
  • 怎么用Jsp实现在页面实现树型结构?
  • sharepoint 2010 使用STSNavigate函数实现文件下载举例
  • windows 下的PortTunnel 在linux下怎么实现?或者相应的已经实现的软件?端口映射
  • php实现socket实现客户端和服务端数据通信源代码
  • 网站重定向用C语言实现iptables,ACL实现
  • flash AS3反射实现(describeType和getDefinitionByName)
  • 在linux下如何编程实现nslookup命令实现的IP地址和域名互相转换的功能?
  • c#通过委托delegate与Dictionary实现action选择器代码举例
  • 求在freebsd+Squid下实现pc上网的透明代理的实现方法!给出具体配置方法的高分谢!
  • iphone cocos2d 精灵的动画效果(图片,纹理,帧)CCAnimation实现
  • linux下如实现与window下的驱动器实现文件共享??
  • c语言判断某一年是否为闰年的各种实现程序代码
  • qt如何实现:操作键盘实现数据的滚动?
  • html<pre>标签自动换行实现方法
  • 我想用APPLET实现读取客户端的图片文件,该如何实现?
  • java tomcat实现Session对象的持久化原理及配置方法介绍
  • PING是用TCP,还是用UDP来实现的?或是采用其它协议实现的?




  • 特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3