前几天,在看OpenVXI3.4的时候,偶然发现了几个奇怪的文件,那就是OpenVXI-3.4\src\cache下面的,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提交。其实\src\cache下面的的源代码,就是从那里面分离出来的。
    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 ("\n");
        }
        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\n", 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 ("\n");
          }
       }
以上函数都可以在http://www.ietf.org/rfc/rfc1321.txt里面的mddriver.cpp里面找到。修改了一下,就可以生成exe了,可以得到任意字符串和文件的md5加密结果了。

MD5加密技术的更多相关文章

  1. java中使用MD5加密技术

    在项目中经常会对一些信息进行加密,现在常用的信息加密技术有:MD5.RSA.DES等,今天主要说一下,md5加密,以及如何在java代码根据自己的业务需求使用md5. MD5简介: MD5即Messa ...

  2. MD5加密+加盐

    了解: MD5加密,是属于不可逆的.我们知道正常使用MD5加密技术,同一字符,加密后的16进制数是不变的,自从出现彩虹表,对于公司内部员工来说,可以反查数据,获取不可能的权限,所以出现了salt算法. ...

  3. Java加密技术(一)——BASE64与单向加密算法MD5&SHA&MAC

    Java加密技术(一)——BASE64与单向加密算法MD5&SHA&MAC 博客分类: Java/Security Javabase64macmd5sha     加密解密,曾经是我一 ...

  4. JAVA加密技术-----MD5 与SHA 加密

    关于JAVA的加密技术有很多很多,这里只介绍加密技术的两种 MD5与 SHA. MD5与SHA是单向加密算法,也就是说加密后不能解密. MD5 ---信息摘要算法,广泛用于加密与解密技术,常用于文件校 ...

  5. MD5和sha1加密算法--散列加密技术 MD5:128bit的大整数

    在很多电子商务和社区应用中,我们都要存放很多的客户的资料,其中包括了很多的隐私信息和客户不愿被别人看到的信息,当然好有客户执行各种操作的密码,此时就需要对客户的信息进行加密再存储,目前有两种比较好的加 ...

  6. 记录新项目中遇到的技术及自己忘记的技术点【DES加密解密,MD5加密,字符串压缩、解压,字符串截取等操作】

    一.DES加密.解密 #region DES加密解密 /// <summary> /// 进行DES加密 /// </summary> /// <param name=& ...

  7. 关于CryptoJS中md5加密以及aes加密的随笔

    最近项目中用到了各种加密,其中就包括从没有接触过得aes加密,因此从网上各种查,官方的一种说法: 高级加密标准(英语:Advanced Encryption Standard,缩写:AES),在密码学 ...

  8. PHP加密技术

    一.MD5加密 直接干,这里以一个登录页面为例: <?php require_once 'config/database.config.php'; $act=$_REQUEST['act']; ...

  9. MD5加密的Java实现

    在各种应用系统中,如果需要设置账户,那么就会涉及到储存用户账户信息的问题,为了保证所储存账户信息的安全,通常会采用MD5加密的方式来,进行储存.首先,简单得介绍一下,什么是MD5加密. MD5的全称是 ...

随机推荐

  1. 非阻塞IO函数

    关于效率的优化:

  2. STL之效率比較

    1.vector 变长一维数组,连续存放的内存块,有保留内存.堆中分配内存: 支持[]操作,高效率的随机訪问: 在最后添加元素时,一般不须要分配内存空间,速度快:在中间或開始操作元素时要进行内存拷贝效 ...

  3. hdu 4997 Biconnected

    这题主要是计算连通子图的个数(c)和不连通子图的个数(dc)还有连通度为1的子图的个数(c1)和连通度为2以上的子图的个数(c2)之间的转化关系 主要思路大概例如以下: 用状态压缩的方法算出状态为x的 ...

  4. 《coredump问题原理探究》Linux x86版7.8节vector相关的iterator对象

    在前面看过了一个vectorcoredump的样例,接触了vector的iterator,能够知道vector的iterator仅仅有一个成员_M_current指向vector某一个元素. 先看一个 ...

  5. 卷积操作中的矩阵乘法(gemm)—— 为什么矩阵乘法是深度学习的核心所在

    1. 全连接 k 个输入: n 个神经元: 每个神经元都会学到一组权值向量,以和输入进行内积运算: n 个输出: 2. 卷积 卷积操作对于高维(多个平面)的输入,单个卷积核的深度应和输入的深度(dep ...

  6. Oracle RMAN备份中catalog和nocatalog区别

    nocatalog方式:用control file作为catalog,每一次备份都要往控制文件里面写好多备份信息,控制文件里面会有越来越多的备份信息,即RMAN的备份信息写在本地控制文件里面. cat ...

  7. 杂项-DB:DW/DWH(数据仓库)

    ylbtech-杂项-DB:DW/DWH(数据仓库) 数据仓库,英文名称为Data Warehouse,可简写为DW或DWH.数据仓库,是为企业所有级别的决策制定过程,提供所有类型数据支持的战略集合. ...

  8. ubuntu下谷歌浏览器字体模糊解决方案

    一般来说,这种问题应该是缺少字体造成的,因此重新安装字体就可以解决问题. 1.双系统下,查找Windows C盘下:Windows/font/???? ???可在3中查找相应字体 2.分别双击安装那两 ...

  9. Spark SQL 编程API入门系列之SparkSQL的依赖

    不多说,直接上干货! 不带Hive支持 <dependency> <groupId>org.apache.spark</groupId> <artifactI ...

  10. HD-ACM算法专攻系列(15)——Quoit Design

    问题描述: 源码: 经典问题——最近邻问题,标准解法 #include"iostream" #include"algorithm" #include" ...