深圳学历教育www.szstudy.com.cn深圳成人高考 数据加密技术的研究综述
3 DES加密标准
本部分主要介绍DES的定义、起源,并介绍DES算法的框架以及DES实际的案例,然后讨论一下DES算法的安全性和DES的应用误区;最后介绍一下DES的拓展算法,例如3DES、AES算法。
3.1 DES介绍和DES算法框架
它出自 IBM 的研究工作,并在 1997 年被美国政府正式采纳。它很可能是使用最广泛的密钥系统,特别是在保护金融数据的安全中,最初开发的 DES 是嵌入硬 件中的。通常,自动取款机(Automated Teller Machine,ATM)都使用 DES。
DES 使用一个 56 位的密钥以及附加的 8 位奇偶校验位,产生最大 64 位的分组大小。这是一个迭代的分组密码,使用称为 Feistel 的技术,其中将加密的文本块分成两半。使用子密钥对其中一半应用循环功能,然后将输出与另一半进行“异或”运算;接着交换这两半,这一过程会继续下去,但最后一个循环不交换。DES 使用 16 个循环。
DES 的主要形式被称为蛮力的或彻底密钥搜索,即重复尝试各种密钥直到有一个符合为止。如果 DES 使用 56 位的密钥,则可能的密钥数量是 2 的 56 次方个。随着计算机系统能力的不断发展,DES 的安全性比它刚出现时会弱得多,然而从非关键性质的实际出发,仍可以认为它是足够的。不过 ,DES 现在仅用于旧系统的鉴定,而更多地选择新的加密标准 — 高级加密标准(Advanced Encryption Standard,AES)。
DES 的常见变体是三重 DES,使用 168 位的密钥对资料进行三次加密的一种机制;它通常(但非始终)提供极其强大的安全性。如果三个 56 位的子元素都相同,则三重 DES 向后兼容 DES。
3.2 DES实例分析
密文到明文的解密过程可采用与加密完全相同的算法。不过解密要用加密的逆变换,就是把上面的最后换位表和初始换位表完全倒过来变换。这里不再赘述。 下面这个例子中演示了如何使用c#中的加密包进行DES算法加密,大家可以借助这个例子一窥DES加密的用法。 des_demo.cs代码如下: using System;
using System.Security.Cryptography;
9
深圳学历教育www.szstudy.com.cn深圳成人高考 数据加密技术的研究综述
using System.IO; using System.Text;
public class EncryptStringDES {
public static void Main(String[] args) { if (args.Length < 1) {
Console.WriteLine(\ encrypt>\ return; }
// 使用UTF8函数加密输入参数
UTF8Encoding utf8Encoding = new UTF8Encoding();
byte[] inputByteArray = utf8Encoding.GetBytes(args [0].ToCharArray());
// 方式一:调用默认的DES实现方法DES_CSP. DES des = DES.Create();
// 方式二:直接使用DES_CSP()实现DES的实体
转贴于 中国//DES_CSP DES = new DES_CSP();
// 初始化DES加密的密钥和一个随机的、8比特的初始化向量(IV) Byte[] key = {0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef};
Byte[] IV = {0x12, 0x34, 0x56, 0x78, 0x90, 0xab, 0xcd, 0xef}; des.Key = key; des.IV = IV; // 建立加密流
SymmetricStreamEncryptor sse = des.CreateEncryptor(); // 使用CryptoMemoryStream方法获取加密过程的输出 CryptoMemoryStream cms = new CryptoMemoryStream(); // 将SymmetricStreamEncryptor流中的加密数据输出到 CryptoMemoryStream中 sse.SetSink(cms);
10
深圳学历教育www.szstudy.com.cn深圳成人高考 数据加密技术的研究综述
// 加密完毕,将结果输出到控制台 sse.Write(inputByteArray); sse.CloseStream(); // 获取加密数据
byte[] encryptedData = cms.Data; // 输出加密后结果
Console.WriteLine(\加密结果:\
for (int i = 0; i < encryptedData.Length; i++) { Console.Write(\ }
Console.WriteLine();
//上面演示了如何进行加密,下面演示如何进行解密
SymmetricStreamDecryptor ssd = des.CreateDecryptor(); cms = new CryptoMemoryStream(); ssd.SetSink(cms);
ssd.Write(encryptedData); ssd.CloseStream();
byte[] decryptedData = cms.Data;
char[] decryptedCharArray = utf8Encoding.GetChars(decryptedData); Console.WriteLine(\解密后数据:\ Console.Write(decryptedCharArray); Console.WriteLine(); } } 编译:
D:\\csharp>csc des_demo.cs
Microsoft (R) C# Compiler Version 7.00.8905 [NGWS runtime 2000.14.1812.10]
Copyright (C) Microsoft Corp 2000. All rights reserved. 运行实例:
D:\\csharp>des_demo.exe 使用C#编写DES加密程序的framework 加密结果:
11
深圳学历教育www.szstudy.com.cn深圳成人高考 数据加密技术的研究综述
3D 22 64 C6 57 D1 C4 C3 CF 77 CE 2F D0 E1 78 2A 4D ED 7A A8 83 F9 0E 14 E1 BA 38
7B 06 41 8D B5 E9 3F 00 0D C3 28 D1 F9 6D 17 4B 6E A7 41 68 40
解密后数据:
使用C#编写DES加密程序的framework
DES算法具有极高的安全性,到目前为止,除了用穷举搜索法对DES算法进行攻击外,还没有发现更有效的办法。通过穷尽搜索空间,可获得总共256(大约7.2×1016)个可能的密钥。如果每秒能检测一百万个的话,需要2000年完成检测。可见,这是很难实现的。当然,随着 科学 技术的 发展 ,当出现超高速 计算 机后,可以考虑把DES密钥的长度再增长一些,以此来达到更高的保密程度。随着信息化和数字化社会的发展,随着计算机和Inte rnet的普及,密码学必将在国家安全、 经济 交流、 网络 安全及人民生活等方面发挥更大作用[3]。
3.3 DES的安全性和应用误区
DES算法具有极高安全性,到目前为止,除了用穷举搜索法对DES算法进行攻击外,还没有发现更有效的办法。而56位长的密钥的穷举空间为256,这意味着如果一台计算机的速度是每一秒种检测一百万个密钥,则它搜索完全部密钥就需要将近2285年的时间,可见,这是难以实现的,当然,随着科学技术的发展,当出现超高速计算机后,我们可考虑把DES密钥的长度再增长一些,以此来达到更高的保密程度。
DES算法中只用到64位密钥中的其中56位,而第8、16、24、......64位8个位并未参与DES运算,这一点,向我们提出了一个应用上的要求,即DES的安全性是基于除了8,16,24,......64位外的其余56位的组合变化256才得以保证的。因此,在实际应用中,我们应避开使用第8,16,24,......64位作为有效数据位,而使用其它的56位作为有效数据位,才能保证DES算法安全可靠地发挥作用。如果不了解这一点,把密钥Key的8,16,24,..... .64位作为有效数据使用,将不能保证DES加密数据的安全性,对运用DES来达到保密作用的系统产生数据被破译的危险,这正是DES算法在应用上的误区,留下了被人攻击、被人破译的极大隐患。
3.4 DES的拓展
3.4.1 3DES
12