MD5硬件加密

MD5硬件加密 
  
    【关键字】MD5 密码学 C51单片机 

    【摘要】加密技术与我们的日常生活息息相关,在信息社会更是凸现重要。本文将主要就MD5算法及密码学和其硬件实现做一些相关探讨。MD5的全称是message-digest algorithm 5(信息-摘要算法)。由于其使用不需要支付任何版权费用,安全性好,所以MD5成为了当今非常流行的优秀的典型Hash加密技术。但是仅从软件上实现,很容易被解密者在加密过程中干扰破解。本项目利用Philip89C51系列单片机基于keil C编程系统通过硬件实现md5加密过程。成品为一硬件集成封闭加密模块,可加于输入端与主机端间,不会被人为干扰,无法暴破截取密文。还可随时刷写芯片加入MD5变形算法,增强安全性。任一密文散列所得MD5密码仅16位(128位十六进制数),加密过程占用系统资源少,速度奇快,整套系统成本较低,可靠性较强,可广泛适用于加密相关工作领域。 

    【正文】 

    MD5及密码学简介   

    密码学(Cryptology)源于希腊文“krypto’s”和“logos”两词,意即“隐藏信息”。时间追溯至大约四千年前,人们就开始使用密码。1949年,Shannon提出第一篇讨论密码系统通讯理论的论文。1975年,Diffie密码学和Hellman提出公开密匙密码系统,近代密码学公由此蓬勃发展。 

    在信息时代,信息可以帮助团体或个人,使他们受益,同样,信息也可以用来 对他们构成威胁,造成破坏。在竞争激烈的大公司中,工业间谍经常会获取对方的情报。因此,在客观上就需要一种强有力的安全措施来保护机密数据不被窃取或篡改。数据加密与解密从宏观上讲是非常简单的,很容易理解。 

    发展到今天,随着数学和计算机科学的发展,密码学理论也不断发展提高,加密算法层出不穷。传统算法中最  简单的莫过于“置换表”算法。这种算法也能 达到加密的需要。每一个数据段(总是一个字节)对应着“置换表”中的一个偏移 量(偏移量无非是移位和替换两种),偏移量所对应的值就输出成为加密后的文件。加密程序和解密程序都需要一个这样的“置换表”。事实上,80x86 cpu 系列就有一个指令‘xlat’在硬件级来完成这样的 工作。这种加密算法比较简单,加密解密速度都很快,但是一旦这个“置换表”被对方获得,那这个加密方案就完全被识破了。更进一步讲,这种加密算法对于黑客破译来讲是相当直接的(尤其是有了电子计算机以后),只要找到一个“置换表”就可以了。举个简单的例子: 

    a b c d e f g h i j k l m n o p q r s t u v w x y z   

    D E F G H I J K L M N O P Q R S T U V W X Y Z A B C 

    这样一个置换表可得:How are you  

                      krz duh brx 

    这个置换表是非常容易破解的。我们想到改进,加一些规则进去,譬如把密码的空格去掉,译成源码后再根据单词断句。更好对这种“置换表”方式的一个改进就是使用2 个或者更多的“置换表”,这些表都是基于数据流中字节的位置的,或者基于数据流本身。这时,破译变的更加困难,因为黑客必须正确的做几次变换。通过使用更多的“置换表”,并且按伪随机的方式使用每个表,这种改进的加密方法已经变的很难破译。比如,我们可以对所有的偶数位置的数据使用a 表,对所有的奇数位置使用b 表,即使黑客获得了明文和密文,他想破译这个加密方案也是非常困难的,除非黑客确切的知道用了两张表。但是结合反汇编分析,他也很可能窃取到这两张表。二战中德国号称强大的哑谜机使用随机置换表,但还是被破解。 

    还有一种更好的加密算法,只有计算机可以做,就是字/ 字节循环移位和xor等操作。如果我们把一个字或字节在一个数据流内做循环移位,使用多个或变化的方向(左移或右移),就可以迅速的产生一个加密的数据流。这种方法是很好的,破译它就更加困难!而且,更进一步的是,如果再使用xor 操作,按位做异或操作,就就使破译密码更加困难了。如果再使用伪随机的方法,这涉及到要产生一系列的数字,我们可以使用fibbonaci 数列。对数列所产生的数做模运算(例如mod 3 ),得到一个结果,然后循环移位这个结果的次数,将使破译次密码变的几乎不可能!但是,使用fibbonaci 数列这种伪随机的方式所产生的密码对我们的解密程序来讲是非常容易的。 

    对于一个好的加密算法的重要特点之一是具有这种能力:加密过程中用到的公匙或者算法可以公开,但是产生的密码不可逆。所谓不可逆,不一定是说数学上绝对不可逆。从数学理论上讲,几乎没有真正不可逆的算法存在。例如,对于一个输入‘a ’执行一个操作得到结果‘b ’,那么我们可以基于‘b ’,做一个相对应的操作,导出输入‘a ’。在一些情况下,对于每一种操作,我们可以得到一个确定的值,或者该操作没有定义(比如,除数为0 )。对于一个没有定义的操作来讲,基于加密算法,可以成功地防止把一个公钥变换成为私钥。因此,要想破译非对称加密算法,找到那个唯一的密钥,唯一的方法只能是反复的试验,而这需要大量的处理时间。即使使用现在的高速电子计算机,好的算法被迫破解也许要上百年的时间。利用公匙私匙方面代表性的算法就是著名的RSA以及PGP算法。RSA算法使用了两个非常大的素数来产生公钥和私钥。即使从一个公钥中通过因数分解可以得到私钥,但这个运算所包含的计算量是非常巨大的,以至于在现实上是不可行的。它的算法运算量也是很大的,主要应用于银行等高端领域,在此我们不再赘述。 

    MD5也是一种不可逆的算法,因为如果你对生成的密文求逆,对应着无穷个逆。md5的全称是message-digest algorithm 5(信息-摘要算法),在90年代初由MIT laboratory for computer science和rsa data security inc的Ronald l.Rivest开发出来,经md2、md3和md4发展而来。不管是md2、md4还是md5,它们都需要获得一个随机长度的信息并产生一个128位的信息摘要。虽然这些算法的结构或多或少有些相似,但md2的设计与md4和md5完全不同,那是因为md2是为8位机器做过设计优化的,而md4和md5却是面向32位的电脑。但是用8位单片机就可迅速正确地算出结果。rivest在1989年开发出md2算法。为了加强算法的安全性,rivest在1990年又开发出md4算法。md4算法同样需要填补信息以确保信息的字节长度加上448后能被512整除(信息字节长度mod 512 = 448)。然后,信息被处理成512位damgmerkle迭代结构的区块,而且每个区块要通过三个不同步骤的处理。den boer和bosselaers以及其他人很快的发现了攻击md4版本中第一步和第三步的漏洞。毫无疑问,md4就此被淘汰掉了。尽管md4算法在安全上有个这么大的漏洞,但它对在其后才被开发出来的好几种信息安全加密算法的出现却有着不可忽视的引导作用。除了md5以外,其中比较有名的还有sha-1、ripe-md以及haval等。一年以后,即1991年,rivest开发出技术上更为趋近成熟的md5算法。它在md4的基础上增加了"安全-带子"(safety-belts)的概念。虽然md5比md4稍微慢一些,但却更为安全。这个算法很明显的由四个和md4设计有少许不同的步骤组成。在md5算法中,信息摘要的大小和填充的必要条件与md4完全相同。van oorschot和wiener曾经考虑过一个在散列中暴力搜寻冲突的函数(brute-force hash function),而且他们猜测一个被设计专门用来搜索md5冲突的机器(这台机器在1994年的制造成本大约是一百万美元)可以平均每24天就找到一个冲突(我的小注:所谓冲突,就是指散列区域上hash函数不是一一对应的映射)。但单从1991年到2001年这10年间,竟没有出现替代md5算法的md6或被叫做其他什么名字的新算法这一点,我们就可以看出这个瑕疵并没有太多的影响md5的安全性。上面所有这些都不足以成为md5的在实际应用中的问题。并且,由于md5算法的使用不需要支付任何版权费用的,所以在通常情况下,md5怎么都应该算得上是非常安全的了。 

    不可逆在实际应用中产生什么作用呢。这里我举一个例子:我们到银行取钱输入密码时,一般是源码被存近了银行的主机,如果银行的内部人员或黑客侵入到数据库,很轻易地就窃取了你的源码。如果输入源码后,立即用MD5加密,把所得密文储存进系统。而以后用户每次仍是自己输源码,但我们只需比对MD5密文即可。系统在并不知道用户密码的明码的情况下就可以确定用户登录系统的合法性。由于MD5不可逆,所以MD5密文无论被谁知道都无法窃得源码。现在大多数网站的数据库系统储存密码时都是使用MD5算法加密。我们的硬件模块就可以实现这一过程。 

    MD5的另一典型应用是对一段Message(字节串)产生fingerprint(指纹),以防止被“篡改”。举个例子,你将一段话写在一个叫readme.txt文件中,并对这个readme.txt产生一个MD5的值并记录在案,然后你可以传播这个文件给别人,别人如果修改了文件中的任何内容,你对这个文件重新计算MD5时就会发现。如果再有一个第三方的认证机构,用MD5还可以防止文件作者的“抵赖”,这就是所谓的数字签名应用。 

    如果想破解MD5,理论上的方法是跑字典。因为MD5是一一对应的(当然是与一般长度的文本一一对应,我们显然可以看出MD5仅有2128种编码它对应的文本是有限的,但是也是数量巨大的,长度范围广的),我们穷举生成一个字典,先用MD5程序计算出这些字典项的MD5值,然后再用目标的MD5值在这个字典中检索。但是稍微有点排列组合知识的人就知道,即使只用数字,大写字母,仅36字的密文就有P(36,36),利用stirling近似公式可知,这是一个很大的数。就是O(n)的时间复杂度,计算机从空间上就很难解决。 

    MD5算法流程: 

    第一步:增加填充  

    增加padding使得数据长度(bit为单位)模512为448。如果数据长度正好是模512为448,增加512个填充bit,也就是说填充的个数为1-512。第一个bit为1,其余全部为0。  

    第二步:补足长度  

    将数据长度转换为64bit的数值,如果长度超过64bit所能表示的数据长度的范围,值保留最后64bit,增加到前面填充的数据后面,使得最后的数据为512bit的整数倍。也就是32bit的16倍的整数倍。在RFC1321中,32bit称为一个word。  

    第三步:初始化变量:  

    用到4个变量,分别为A、B、C、D,均为32bit长。初始化为:  

    A: 01 23 45 67  

    B: 89 ab cd ef  

    C: fe dc ba 98  

    D: 76 54 32 10  

    第四步:数据处理:  

    首先定义4个辅助函数: 
  
    F(X,Y,Z) = XY v not(X) Z  

    G(X,Y,Z) = XZ v Y not(Z)  

    H(X,Y,Z) = X xor Y xor Z  

    I(X,Y,Z) = Y xor (X v not(Z))     引起更快的雪崩效应 

    其中:XY表示按位与,X v Y表示按位或,not(X)表示按位取反。xor表示按位异或。函数中的X、Y、Z均为32bit。 定义一个需要用到的数组:T(i),i取值1-64,T(i)等于abs(sin(i))的4294967296倍的整数部分,i为弧度。假设前三步处理后的数据长度为32*16*Nbit  

    第五步:输出:  

    最后得到的ABCD为输出结果,共128bit。A为低位,D为高位。 
    我们分析一下该算法的复杂度: 

    时间复杂度:位运算,复制运算,四则运算都是速度很快的元运算。MD5_updata函数是主要运算函数,复杂度为O(n)被调用三次。所以算法整体复杂度仍为O(n)。 

    空间复杂度为O(n+80)。 

    所以程序运行时间较少。 

    我们可以在MD5算法中加入一点变形。例如:在初始时先加入置换表,变动四个辅助函数的位运算对称性等。 

    硬件实现 

    8051 系列微处理器基于简化的嵌入式控制系统结构被广泛应用于从军事到自动控制再到PC 机上的键盘上的各种应用系统上仅次于Motorola 68HC11 在 8 位微控制器市场上的销量,也是目前国内单片机市场上的主流芯片。很多制造商都可提供8051 系列单片机像Intel Philips Siemens 等这些制造商给51 系列单片机加入了大量的性能和外部功能像I2C 总线接口模拟量到数字量的转换看门狗PWM 输出等不少芯片的工作频率达到40M 工作电压下降到1.5V。其运算能力已足够本项目使用,硬件体系成熟,所以我并没有选用更为高级但成本较高的ARM和DSP。 

    8051系列MCU(微处理器)支持ANSI C。在众多的C51编译开发系统中,德国的KEIL公司无疑是首屈一指的。而Philip及其在中国的代理商国内最大的单片机厂商周立功公司信誉良好,产品性价比高,相关开发资源多。所以我最终选用了Philip89C51RD2Hxx芯片以及keil C编程系统。其code区为64KFlash,可反复擦写,便于修改,内部RAM较大为256B,所以程序运行速度较快。我在项目过程中使用周立功TKS仿真器进行硬件仿真,所有Keil C程序都通过硬件仿真测试。 

    使用C进行单片机开发是当今的一大趋势。因为C作为高级语言,易学易用,书写灵活,模块化结构化编程,数据结构和算法实现方便,可参考的源程序多,便于维护开发。而且C编译后生成的机器码执行效率仅比汇编低不到10%。除了在工业控制等实时领域外,包括硬件接口在内的开发,C语言都是首选。国外的Atmel、Philip等公司都非常提倡使用C51。 

    模块中自嵌一个2*6键盘,使用行列扫描模式,全部键盘扫描程序有自己用C编写,包含去重键,防抖延时等功能,符合人们的使用习惯。键盘初步只设有10个数字键及退格,回车案件,利用行列扫描模式,可按需要随时扩充。配有两个LED数码显示管,可显示键盘输入和最终结果,也可随时关闭。 

    本模块只要利用串口通信可以加载到输入端和上位机端,主机端到主机端,主机端到客户机端的原文加密,而8051系列单片机和PC或其它单片机的串口通信程序有非常多现成的开放源码,可随时加入使用,易于扩展至加密相关领域。MD5硬件加密 
 
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值