数据加密
/ns/cn/zs/data/20020808015032.htm
					
数据加密 
本文出自:http://www.china-pub.com 作者: 杨可棋  
考虑到用户可能试图旁路系统的情况,如物理地取走数据库,在通讯线路上窃听。对这样的威胁最有效的解决方法 
就是数据加密,即以加密格式存储和传输敏感数据。 
  数据加密的术语有:明文,即原始的或未加密的数据。通过加密算法对其进行加密,加密算法的输入信息为明文和 
密钥;密文,明文加密后的格式,是加密算法的输出信息。加密算法是公开的,而密钥则是不公开的。密文,不应为无 
密钥的用户理解,用于数据的存储以及传输。 
  例:明文为字符串: 
  AS KINGFISHERS CATCH FIRE 
  (为简便起见,假定所处理的数据字符仅为大写字母和空格符)。假定密钥为字符串: 
  ELIOT 
  加密算法为: 
  1) 将明文划分成多个密钥字符串长度大小的块(空格符以"+"表示) 
  AS+KI NGFIS HERS+ CATCH +FIRE 
  2) 用00~26范围的整数取代明文的每个字符,空格符=00,A=01,...,Z=26: 
  0119001109 1407060919 0805181900 0301200308 0006091805 
  3) 与步骤2一样对密钥的每个字符进行取代: 
  0512091520 
  4) 对明文的每个块,将其每个字符用对应的整数编码与密钥中相应位置的字符的整数编码的和模27后的值取代: 
  5) 将步骤4的结果中的整数编码再用其等价字符替换: 
  FDIZB SSOXL MQ+GT HMBRA ERRFY 
  如果给出密钥,该例的解密过程很简单。问题是对于一个恶意攻击者来说,在不知道密钥的情况下,利用相匹配的 
明文和密文获得密钥究竟有多困难?对于上面的简单例子,答案是相当容易的,不是一般的容易,但是,复杂的加密模 
式同样很容易设计出。理想的情况是采用的加密模式使得攻击者为了破解所付出的代价应远远超过其所获得的利益。实 
际上,该目的适用于所有的安全性措施。这种加密模式的可接受的最终目标是:即使是该模式的发明者也无法通过相匹 
配的明文和密文获得密钥,从而也无法破解密文。 
  1. 数据加密标准 
  传统加密方法有两种,替换和置换。上面的例子采用的就是替换的方法:使用密钥将明文中的每一个字符转换为密 
文中的一个字符。而置换仅将明文的字符按不同的顺序重新排列。单独使用这两种方法的任意一种都是不够安全的,但 
是将这两种方法结合起来就能提供相当高的安全程度。数据加密标准(Data Encryption Standard,简称DES)就采用了 
这种结合算法,它由IBM制定,并在1977年成为美国官方加密标准。 
  DES的工作原理为:将明文分割成许多64位大小的块,每个块用64位密钥进行加密,实际上,密钥由56位数据位和8 
位奇偶校验位组成,因此只有256个可能的密码而不是264个。每块先用初始置换方法进行加密,再连续进行16次复杂的 
替换,最后再对其施用初始置换的逆。第i步的替换并不是直接利用原始的密钥K,而是由K与i计算出的密钥Ki。 
  DES具有这样的特性,其解密算法与加密算法相同,除了密钥Ki的施加顺序相反以外。 
  2. 公开密钥加密 
  多年来,许多人都认为DES并不是真的很安全。事实上,即使不采用智能的方法,随着快速、高度并行的处理器的出 
现,强制破解DES也是可能的。"公开密钥"加密方法使得DES以及类似的传统加密技术过时了。公开密钥加密方法中,加密 
算法和加密密钥都是公开的,任何人都可将明文转换成密文。但是相应的解密密钥是保密的(公开密钥方法包括两个密钥, 
分别用于加密和解密),而且无法从加密密钥推导出,因此,即使是加密者若未被授权也无法执行相应的解密。 
  公开密钥加密思想最初是由Diffie和Hellman提出的,最著名的是Rivest、Shamir以及Adleman提出的,现在通常称为 
RSA(以三个发明者的首位字母命名)的方法,该方法基于下面的两个事实: 
  1) 已有确定一个数是不是质数的快速算法; 
  2) 尚未找到确定一个合数的质因子的快速算法。 
  RSA方法的工作原理如下: 
  1) 任意选取两个不同的大质数p和q,计算乘积r=p*q; 
  2) 任意选取一个大整数e,e与(p-1)*(q-1)互质,整数e用做加密密钥。注意:e的选取是很容易的,例如,所有大 
于p和q的质数都可用。 
  3) 确定解密密钥d: 
   d * e = 1 modulo(p - 1)*(q - 1) 
  根据e、p和q可以容易地计算出d。 
  4) 公开整数r和e,但是不公开d; 
  5) 将明文P (假设P是一个小于r的整数)加密为密文C,计算方法为: 
   C = Pe modulo r 
  6) 将密文C解密为明文P,计算方法为: 
   P = Cd modulo r 
  然而只根据r和e(不是p和q)要计算出d是不可能的。因此,任何人都可对明文进行加密,但只有授权用户(知道d) 
才可对密文解密。 
   
  下面举一简单的例子对上述过程进行说明,显然我们只能选取很小的数字。 
  例:选取p=3, q=5,则r=15,(p-1)*(q-1)=8。选取e=11(大于p和q的质数),通过d * 11 = 1 modulo 8, 
计算出d =3。 
  假定明文为整数13。则密文C为 
  C = Pe modulo r 
   = 1311 modulo 15 
   = 1,792,160,394,037 modulo 15 
   = 7 
  复原明文P为: 
  P = Cd modulo r 
   = 73 modulo 15 
   = 343 modulo 15 
   = 13 
  因为e和d互逆,公开密钥加密方法也允许采用这样的方式对加密信息进行"签名",以便接收方能确定签名不是伪造的。 
假设A和B希望通过公开密钥加密方法进行数据传输,A和B分别公开加密算法和相应的密钥,但不公开解密算法和相应的密钥。 
A和B的加密算法分别是ECA和ECB,解密算法分别是DCA和DCB,ECA和DCA互逆,ECB和DCB互逆。 
若A要向B发送明文P,不是简单地发送ECB(P),而是先对P施以其解密算法DCA,再用加密算法ECB对结果加密后发送出去。 
密文C为: 
  C = ECB(DCA(P)) 
  B收到C后,先后施以其解密算法DCB和加密算法ECA,得到明文P: 
  ECA(DCB(C)) 
  = ECA(DCB(ECB(DCA(P)))) 
  = ECA(DCA(P)) /*DCB和ECB相互抵消*/ 
  = P /*DCB和ECB相互抵消*/ 
  这样B就确定报文确实是从A发出的,因为只有当加密过程利用了DCA算法,用ECA才能获得P,只有A才知道DCA算法,没 
有人,即使是B也不能伪造A的签名。