zoukankan      html  css  js  c++  java
  • MD5加密技术

    前几天,在看OpenVXI3.4的时候,偶然发现了几个奇怪的文件,那就是OpenVXI-3.4srccache下面的,base64.c,base64.h,md5.c,md5.h。既然有人把源代码给出来了,不妨花点时间看一下。感觉挺有意思,和大家分享一下。先来看看md5
        MD5简介
        MD5的全称是Message-Digest Algorithm 5(信息-摘要算法),在90年代初由MIT Laboratory for Computer Science和RSA Data Security Inc的Ronald L. Rivest开发出来,经MD2、MD3和MD4发展而来。它的作用是让大容量信息在用数字签名软件签署私人密匙前被"压缩"成一种保密的格式(就是把一个任意长度的字节串变换成一定长的大整数)。MD5算法的描述和C语言源代码在Internet RFCs 1321中有详细的描述(http://www.ietf.org/rfc/rfc1321.txt),这是一份最权威的文档,由Ronald L. Rivest在1992年8月向IEFT提交。其实srccache下面的的源代码,就是从那里面分离出来的。
        md5是单向加密的,也就是说加密后产生的字符串不可能,反过来被解密掉。比如你的密码设为:www.xml.org.cn ,md5加密以后就变为了,
    MD5 ("www.xml.org.cn") = 8133445b961d56d76356d356687394e6,然后把加密后的字符串"8133445b961d56d76356d356687394e6",放到数据库中,下次登录的时候,系统不是解密8133445b961d56d76356d356687394e6,然后与你输入的密码比较,而是把你的密码进行md5加密,然后把加密后的字符串与数据库中的8133445b961d56d76356d356687394e6比较,如果用户把密码丢了,就连系统管理员也不知道你输入的密码是什么。
        算法应用
      MD5的典型应用是对一段信息(Message)产生信息摘要(Message-Digest),以防止被篡改。比如,有很多软件在下载的时候都有一个文件名相同,文件扩展名为.md5的文件,在这个文件中只有一行文本,这一行文本就是文件的数字签名。MD5将整个文件当作一个大文本信息,通过其不可逆的字符串变换算法,产生了这个唯一的MD5信息摘要。如果在以后传播这个文件的过程中,无论文件的内容发生了任何形式的改变(包括人为修改或者下载过程中线路不稳定引起的传输错误等),只要你对这个文件重新计算MD5时就会发现信息摘要不相同,由此可以确定你得到的只是一个不正确的文件。如果再有一个第三方的认证机构,用MD5还可以防止文件作者的"抵赖",这就是所谓的数字签名应用。
        源代码
        我们现在看看md5.cpp的源代码。打开以后你会发现里面有8个函数:
           void Decode (UINT4 *output,const unsigned char *input,unsigned int len);
           void Encode (unsigned char *output,const UINT4 *input,unsigned int len);
           void MD5_memcpy (POINTER output,const POINTER input,unsigned int len);
           void MD5_memset (POINTER output,int value,unsigned int len);
           void MD5Final (unsigned char digest[16],MD5_CTX *context);
           void MD5Init (MD5_CTX *context);
           void MD5Transform (UINT4 state[4],const unsigned char block[64]);
           void MD5Update (MD5_CTX *context,const unsigned char *input,unsigned int inputLen);  
    其中MD5_memcpy 和MD5_memset和C语言中的memcpy memset一样,只不过它为了提高速度,在内部又实现了一次。可以通过更改宏定义来选择使用系统的memcpy memset,还是用md5中实现的函数。其实Decode  Encode MD5Transform 在外部也用不到。用到的只有MD5Init MD5Update MD5Final 三个函数。比如要加密字符串,下面为实现函数:
            void MDString (char* string)
            {
              MD5_CTX context;
              unsigned char digest[16];
              unsigned int len = strlen (string);
              MD5Init (&context);
              MD5Update (&context, (const unsigned char*)string, len);
              MD5Final (digest, &context);
              printf ("Execute Result: MD%d ("%s") = ", MD, string);
              MDPrint (digest);
              printf (" ");
            }
            void MDPrint (unsigned char digest[16])
            {
              unsigned int i;
              for (i = 0; i < 16; i++)
              printf ("%02x", digest[i]);
            }
      加密文件:
             void MDFile (char* filename)
            {
              FILE *file;
              MD_CTX context;
              int len;
              unsigned char buffer[1024], digest[16];
              if ((file = fopen (filename, "rb")) == NULL)
                 printf ("Execute Result: %s can't be opened ", filename);
              else {
              MDInit (&context);
              while (len = fread (buffer, 1, 1024, file))
                MDUpdate (&context, buffer, len);
              MD5Final (digest, &context);
              fclose (file);
              printf ("Execute Result:MD%d (%s) = ", MD, filename);
              MDPrint (digest);
              printf (" ");
              }
           }
    以上函数都可以在http://www.ietf.org/rfc/rfc1321.txt里面的mddriver.cpp里面找到。修改了一下,就可以生成exe了,可以得到任意字符串和文件的md5加密结果了。

  • 相关阅读:
    Combine 框架,从0到1 —— 4.在 Combine 中使用计时器
    Combine 框架,从0到1 —— 4.在 Combine 中使用通知
    Combine 框架,从0到1 —— 3.使用 Subscriber 控制发布速度
    Combine 框架,从0到1 —— 2.通过 ConnectablePublisher 控制何时发布
    使用 Swift Package Manager 集成依赖库
    iOS 高效灵活地配置可复用视图组件的主题
    构建个人博客网站(基于Python Flask)
    Swift dynamic关键字
    Swift @objcMembers
    仅用递归函数操作逆序一个栈(Swift 4)
  • 原文地址:https://www.cnblogs.com/zhxn/p/6912940.html
Copyright © 2011-2022 走看看