大米软件

大米专注电子商务解决方案,及其大型网站构架

 

DES 是一种单一密钥加解密算法

      DES 是一种单一密钥加解密算法。通信主体之间只有一个密钥,该密钥不对第三方公开。

      数据加密算法(Data Encryption Algorithm,DEA)的数据加密标准(Data Encryption Standard,DES)是规范的描述,它出自 IBM 的研究工作,并在 1997 年被美国政府正式采纳。它很可能是使用最广泛的秘钥系统,特别是在保护金融数据的安全中,最初开发的 DES 是嵌入硬 件中的。通常,自动取款机(Automated Teller Machine,ATM)都使用 DES。
      IBM 曾对 DES 拥有几年的专利权,但是在 1983 年已到期,并且处于公有范围中,允许在特定条件下可以免除专利使用费而使用。

      DES 该算法利用一个56+8奇偶校验位(第8, 16, 24, 32, 40, 48, 56, 64位)=64位的密钥对以64位为单位的块数据进行加解密。这是一个迭代的分组密码,使用称为 Feistel 的技术,其中将加密的文本块分成两半。使用子密钥对其中一半应用循环功能,然后将输出与另一半进行“异或”运算;接着交换这两半,这一过程会继续下去,但最后一个循环不交换。DES 使用 16 个循环。

DES算法的入口参数有三个:
 Key, Data, Mode
Key 为64bit密钥, Data为64bit数据,Mode为加密还是解密。
DES算法的过程:
1. 对输入的密钥进行变换 
      有密钥K(64位) = 133457799BBCDFF1,
      即K(64位) = 00010011 00110100 01010111 01111001 10011011 10111100 11011111 11110001
      其中红色标注为奇偶校验位,使得每个8位密钥都有奇数个1。所以密钥事实上是56位。对这56位密钥进行如下表的换位。
      57, 49, 41, 33, 25, 17,   9,  1, 58, 50, 42, 34, 26, 18, 10,  2, 59, 51, 43, 35, 27, 19, 11,  3, 60, 52, 44, 36,
      63, 55, 47, 39, 31, 23, 15,  7, 62, 54, 46, 38, 30, 22, 14,  6, 61, 53, 45, 37, 29, 21, 13,  5, 28, 20, 12,   4,
      表示意思是第57位移到第1位,第49位移到第2位,...... 以此类推。变换后得到56bit数据,将它分成两部分,C[0][28], D[0][28]。
      得到K+(56位) = 1111000 0110011 0010101 0101111 0101010 1011001 1001111 0001111
      进而,
      C0(28位) = 1111000 0110011 0010101 0101111 
      D0(28位) = 0101010 1011001 1001111 0001111 

2. 计算16个子密钥,计算方法C[i][28] D[i][28]为对前一个C[i-1][28], D[i-1][28]做循环左移操作。16次的左移位数如下表:
1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16   (第i次)
1,  1,  2,  2,  2,  2,  2,  2,  1,   2,  2,   2,   2,   2,   2,  1    (左移位数)
表示C1和D1分别为C0和D0左移1位。… C3和D3分别为C2和D2左移2位 …

从而得到C1D1 ~ C16D16:
C1 = 1110000110011001010101011111
D1 = 1010101011001100111100011110

C2 = 1100001100110010101010111111
D2 = 0101010110011001111000111101

C3 = 0000110011001010101011111111
D3 = 0101011001100111100011110101

C4 = 0011001100101010101111111100
D4 = 0101100110011110001111010101


C15 = 1111100001100110010101010111
D15 = 1010101010110011001111000111

C16 = 1111000011001100101010101111
D16 = 0101010101100110011110001111 

3. 串联计算出来的C[i][28] D[i][28] 得到56位,然后对它进行如下变换得到48位子密钥K[i][48]
14, 17, 11, 24,  1,   5,  3, 28, 15,   6, 21, 10, 23, 19, 12,   4, 26,    8, 16,   7, 27, 20, 13,   2,
41, 52, 31, 37, 47, 55, 30, 40, 51, 45, 33, 48, 44, 49, 39, 56, 34, 53, 46, 42, 50, 36, 29, 32,

表示意思是第14位移到第1位,第17位移到第2位,以此类推。在此过程中,发现第9,18,22,25, 35,38,43,54位丢弃。
最终得到所有16个子钥,每个48位:
K1 = 000110 110000 001011 101111 111111 000111 000001 110010
K2 = 011110 011010 111011 011001 110110 111100 100111 100101
K3 = 010101 011111 110010 001010 010000 101100 111110 011001
K4 = 011100 101010 110111 010110 110110 110011 010100 011101
K5 = 011111 001110 110000 000111 111010 110101 001110 101000
K6 = 011000 111010 010100 111110 010100 000111 101100 101111
K7 = 111011 001000 010010 110111 111101 100001 100010 111100
K8 = 111101 111000 101000 111010 110000 010011 101111 111011
K9 = 111000 001101 101111 101011 111011 011110 011110 000001
K10 = 101100 011111 001101 000111 101110 100100 011001 001111
K11 = 001000 010101 111111 010011 110111 101101 001110 000110
K12 = 011101 010111 000111 110101 100101 000110 011111 101001
K13 = 100101 111100 010111 010001 111110 101011 101001 000001
K14 = 010111 110100 001110 110111 111100 101110 011100 111010
K15 = 101111 111001 000110 001101 001111 010011 111100 001010
K16 = 110010 110011 110110 001011 000011 100001 011111 110101

4. 对64bit的明文输入进行拆分
      有明文M(64位) = 0123456789ABCDEF,
      即M(64位) = 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111
      分成两半:
      L(32位) = 0000 0001 0010 0011 0100 0101 0110 0111
      R(32位) = 1000 1001 1010 1011 1100 1101 1110 1111
    
5. 加密过程
从L0和R0开始,循环16次,得出L1R1到L16R16,依据递推公式:
Ln = R(n-1)
Rn = L(n-1) + f (R(n-1),Kn)
其中除了Kn为48位,其他变量及函数均为32位。
其中+号表示异或XOR运算,函数f 从一个32位的数据块R(n-1)和一个48位子钥Kn得到一个新的32位数据块。(算法从略)   
算法可以参考:
1. http://blog.csdn.net/fenghao_5555/archive/2007/04/28/1589464.aspx
2. http://blog.csdn.net/gudulyn/archive/2006/04/15/664698.aspx

到此为止,我们得到了16对32位的数据块,即
L1R1, L2R2, L3R3, …, L16R16
最后一对L16R16就是我们需要的。

继续对R16L16(64位)运用一次重排列:
40 8 48 16 56 24 64 32
39 7 47 15 55 23 63 31
 38 6 46 14 54 22 62 30
 37 5 45 13 53 21 61 29
 36 4 44 12 52 20 60 28
 35 3 43 11 51 19 59 27
 34 2 42 10 50 18 58 26
 33 1 41 9 49 17 57 25 
表示意思就是变换时,第40位移到第1位,第8位移到第2位,...... 依此类推。得到64位数据

即在
L16(32位) = 0100 0011 0100 0010 0011 0010 0011 0100
R16(32位) = 0000 1010 0100 1100 1101 1001 1001 0101
R16L16(64位) = 00001010 01001100 11011001 10010101 01000011 01000010 00110010 00110100
时,对R16L16运用IP-1,得
IP-1(64位) = 10000101 11101000 00010011 01010100 00001111 00001010 10110100 00000101 = 85E813540F0AB405
从而,经过以上步骤,最终从明文 M = 0123456789ABCDEF
得到密文
C = IP-1 = 85E813540F0AB405
以上为加密过程,要解密,依次反向计算即可。
   

      攻击 DES 的主要形式被称为蛮力的或彻底密钥搜索,即重复尝试各种密钥直到有一个符合为止。如果 DES 使用 56 位的密钥,则可能的密钥数量是 2 的 56 次方个。随着计算机系统能力的不断发展,DES 的安全性比它刚出现时会弱得多,然而从非关键性质的实际出发,仍可以认为它是足够的。不过 ,DES 现在仅用于旧系统的鉴定,而更多地选择新的加密标准 — 高级加密标准(Advanced Encryption Standard,AES)。
DES 的常见变体是三重 DES,使用 168 位的密钥对资料进行三次加密的一种机制;它通常(但非始终)提供极其强大的安全性。如果三个 56 位的子元素都相同,则三重 DES 向后兼容 DES。

三重DES ,高级加密标准(Advanced Encryption Standard,AES)

因为确定一种新的加密法是否真的安全是极为困难的,而且DES的唯一密码学缺点,就是密钥长度相对比较短,所以人们并没有放弃使用DES,而是想出了一个解决其长度问题的方法,即采用三重DES。这种方法用两个密钥对明文进行三次加密,假设两个密钥是K1和K2,其算法的步骤如图5.9所示:

1. 用密钥K1进行DEA加密。
2. 用K2对步骤1的结果进行DES解密。
3. 用步骤2的结果使用密钥K1进行DES加密。
 
这种方法的缺点,是要花费原来三倍时间,从另一方面来看,三重DES的112位密钥长度是很“强壮”的加密方式了。
在 1993 年,政府意识到 DES 安全性将会受到危害。即使我们假定 NSA 在 DES 中构建了一个后门以允许政府可以对 DES 消息进行常规解密(如公钥发现者 Diffie 和 Hellman 在 1975 年给 NSA 的信中声称的那样),DES 是日趋过时的加密算法。这并不是那么有效的方法。它在硬件上表现并不如人意(如“智能卡”已开始显示其缺点)。但直到 1997 年,美国国家科学技术研究所 (NIST) 才开始打着 AES 项目的旗帜征集其接任者。

1997 年 4 月的一个 AES 研讨会宣布了以下 AES 成就的最初目标:
1.可供政府和商业使用的功能强大的加密算法
2.支持标准密码本方式
注:DES 算法将消息块置换成密码块。如果每一块都单独加密,那么加密方式叫做电子代码书 (Electronic Code Book) (ECB) 方式。DES 加密有另外两种方式,分别叫链块编码 (Chain Block Coding) (CBC) 和密码反馈 (Cipher Feedback) (CFB),它们使每个密码块都依赖于初始 XOR 操作中所有以前的消息块。由于政府/银行业都使用这三种方式,所以需要 AES 如何处理信息方面的兼容性。
3.要明显比 DES 3 有效
4.密钥大小可变,这样就可在必要时增加安全性
5.以公正和公开的方式进行选择
  可以公开定义
  可以公开评估

AES 的草案中最低可接受要求和评估标准是:
A.1 AES 应该可以公开定义。
A.2 AES 应该是对称的块密码。
A.3 AES 应该设计成密钥长度可以根据需要增加。
A.4 AES 应该可以在硬件和软件中实现。
A.5 AES 应该
    a) 可免费获得,或 b) 遵守与美国国家标准学会 (ANSI) 专利政策一致的规定获得。
    注:这意味着将把受专利权保护的算法(受 ANSI 政策影响的算法)也考虑在内。已经放弃了这种想法,因此确保了不受保护(即,无专利)的算法成为唯一的选择。

A.6 将根据以下要素评价符合上述要求的算法:
 1. 安全性(密码分析所需的努力)
 2. 计算效率
 3. 内存需求
 4. 硬件和软件可适用性
 5. 简易性
 6. 灵活性
 7. 许可证需求(见上面的 A5)

2000 年 10 月,NIST 选择 Rijndael(发音为 "Rhine dale")作为 AES 算法。它目前还不会代替 DES 3 成为政府日常加密的方法,因为它还须通过测试过程,“使用者”将在该测试过程后发表他们的看法。但相信它可以顺利过关。
Rijndael 是带有可变块长和可变密钥长度的迭代块密码。块长和密钥长度可以分别指定成 128、192 或 256 位。
Rijndael 中的某些操作是在字节级上定义的,字节表示有限字段 GF(28) 中的元素,一个字节中有 8 位。其它操作都根据 4 字节字定义。
加法照例对应于字节级的简单逐位 EXOR。
在多项式表示中,GF(28) 的乘法对应于多项式乘法模除阶数为 8 的不可约分二进制多项式。(如果一个多项式除了 1 和它本身之外没有其它约数,则称它为不可约分的。)对于 Rijndael,这个多项式叫做 m(x),其中:m(x) = (x8 + x4 + x3 + x + 1) 或者十六进制表示为 '11B'。其结果是一个阶数低于 8 的二进制多项式。不像加法,它没有字节级的简单操作。

posted on 2007-04-30 12:06  大米  阅读(5427)  评论(1编辑  收藏  举报

导航