des算法

                                  des算法
DES/3DES/AES


 
 
      数据加密算法DES 数据加密算法(Data Encryption Algorithm,DEA)的数据加密标准(Data Encryption Standard,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。 IBM 曾对 DES 拥有几年的专利权,但是在 1983 年已到期,并且处于公有范围中,允许在特定条件下可以免除专利使用费而使用。 由于DES是加(解)密64位明(密)文,即为8个字节(8*8=64),可以据此初步判断这是分组加密,加密的过程中会有16次循环与密钥置换过程,据此可以判断有可能是用到DES密码算法,更精确的判断还得必须懂得一点DES的加密过程。 Crackme实例分析 本期Crackme用到MD5及DES两种加密算法,难度适中。这次我们重点来看一下DES的加密过程及注册算法过程。用调试器载入程序,下GegDlgItemTextA断点,可以定位到下面代码,我们先来看一下整个crackme的注册过程: 由于代码分析太长,故收录到光盘中,请大家对照着分析(请见光盘“code1.doc”) 从上面分析可以看出,注册过程是类似:f(机器码,注册码)式的两元运算。机器码是经过md5算法得到的中间16位值,注册码是经过DES解密过程取得16位注册码,然后两者比较,如相等,则注册成功。机器码的运算过程可以参照上一期的MD5算法来理解。下面重点来说一下注册码DES的运算过程。 1、密钥处理过程:一般进行加解密过程都要初始化密钥处理。我们可以跟进004023FA CALL Crackme1.00401A40这个call,可以看到如下代码: …(省略)... 00401A4D LEA ECX,DWORD PTR DS:[ECX] 00401A50 /MOV EDX,EAX 00401A52 |SHR EDX,3 00401A55 |MOV DL,BYTE PTR DS:[EDX+ESI] 00401A58 |MOV CL,AL 00401A5A |AND CL,7 00401A5D |SAR DL,CL 00401A5F |AND DL,1 00401A62 |MOV BYTE PTR DS:[EAX+417DA0],DL 00401A68 |INC EAX 00401A69 |CMP EAX,40 这里比较是否小于64 00401A6C \JL SHORT Crackme1.00401A50 以上过程就是去掉密钥各第八位奇偶位。 …(省略)... 00401AB0 |MOV DL,BYTE PTR DS:[ECX+417D9F] 00401AB6 |MOV BYTE PTR DS:[EAX+417BA3],DL 00401ABC |ADD EAX,4 00401ABF |CMP EAX,38 这里进行密钥变换 …(省略)... 00401BFF ||MOVSX ECX,BYTE PTR DS:[EAX+412215] 00401C06 ||MOV CL,BYTE PTR DS:[ECX+417D9F] 00401C0C ||MOV BYTE PTR DS:[EAX+417BA5],CL 00401C12 ||ADD EAX,6 00401C15 ||CMP EAX,30 这里产生48位的子密钥 00401C18 |\JL SHORT Crackme1.00401BA0 00401C1A |MOV EAX,DWORD PTR SS:[ESP+14] 00401C1E |MOV EDI,EAX 00401C20 |MOV ECX,0C 00401C25 |MOV ESI,Crackme1.00417BA0 00401C2A |REP MOVS DWORD PTR ES:[EDI],DWORD PTR D> 00401C2C |MOV EDI,DWORD PTR SS:[ESP+10] 00401C30 |ADD EAX,30 下一组子密钥 00401C33 |INC EDI 00401C34 |CMP EAX,Crackme1.00417B90 这里进行16次的生成子密钥过程 00401C39 |MOV DWORD PTR SS:[ESP+10],EDI …(省略)... 可以看到8位密钥为:1,9,8,0,9,1,7,0 2、对数据处理的过程,跟进004024C7 CALL Crackme1.00402050,到如下代码: 00402072 |MOV BYTE PTR DS:[EAX+417E30],DL 00402078 |INC EAX 00402079 |CMP EAX,40 这里取得64位数据 0040207C \JL SHORT Crackme1.00402060 …(省略)... 004020C6 |MOV BYTE PTR DS:[EAX+417BA3],DL 004020CC |ADD EAX,4 004020CF |CMP EAX,40 进行第一次变换 004020D2 \JL SHORT Crackme1.00402080 004020D4 MOV AL,BYTE PTR SS:[ESP+20] 004020D8 TEST AL,AL 004020DA MOV ECX,10 …(省略)... 00402191 MOV EBP,DWORD PTR DS:[415094] ; Crackme1.00417E30 00402197 SUB EAX,EBP 这里对变换后的数据分为两部分 00402199 MOV DWORD PTR SS:[ESP+10],EAX 0040219D MOV DWORD PTR SS:[ESP+20],Crackme1.00417B60 004021A5 /MOV EAX,DWORD PTR SS:[ESP+20] 004021A9 |MOV ECX,8 004021AE |MOV ESI,EBP 004021B0 |MOV EDI,Crackme1.00417E10 004021B5 |PUSH EAX 这里用上面生成的子密钥来解密数据 004021B6 |MOV EBX,EBP …(省略)... 004021FF |SUB EAX,30 下一个子密钥 00402202 |CMP EAX,Crackme1.00417890 这里将循环16次,典型的DES加解密过程 00402207 |MOV ECX,8 0040220C |MOV ESI,Crackme1.00417E10 00402211 |REP MOVS DWORD PTR ES:[EDI],DWORD PTR DS:[ESI> …(省略)... 0040225A |MOV BYTE PTR DS:[EAX+417BA2],DL 00402260 |MOV DL,BYTE PTR DS:[ECX+417E2F] 00402266 |MOV BYTE PTR DS:[EAX+417BA3],DL 0040226C |ADD EAX,4 0040226F |CMP EAX,40 这里是未置换 00402272 \JL SHORT Crackme1.00402220 00402274 MOV EBP,DWORD PTR SS:[ESP+18] 00402278 MOV ECX,10 0040227D MOV ESI,Crackme1.00417BA0 …(省略)... 有兴趣的读者可以参考DES算法来理解上面的过程。 Crackme总结 要找到注册码,应该:对机器码生成的md5值,取前面16位,再用DES加密这16位字符,加密后的十六进制值即为注册码。如:机器码2747318257,变换后的md5值为7828e8ca43f7d8329ead4c1f aa39c1ec,取前16位7828e8ca43f7d832十六进制值(37 38 32 38 65 38 63 61 34 33 66 37 64 38 33 32)用DES加密后数据为5041a5d06937f8f73f87e68a0e7d2810,此即为真正的注册码。   3DES
3DES是DES加密算法的一种模式,它使用3条64位的密钥对数据进行三次加密。数据加密标准(DES)是美国的一种由来已久的加密标准,它使用对称密钥加密法,并于1981年被ANSI组织规范为ANSI X.3.92。DES使用56位密钥和密码块的方法,而在密码块的方法中,文本被分成64位大小的文本块然后再进行加密。比起最初的DES,3DES更为安全。 
3DES(即Triple DES)是DES向AES过渡的加密算法(1999年,NIST将3-DES指定为过渡的加密标准),是DES的一个更安全的变形。它以DES为基本模块,通过组合分组方法设计出分组加密算法,其具体实现如下:设Ek()和Dk()代表DES算法的加密和解密过程,K代表DES算法使用的密钥,P代表明文,C代表密表,这样, 
3DES加密过程为:C=Ek3(Dk2(Ek1(P))) 
3DES解密过程为:P=Dk1((EK2(Dk3(C))) 
具体的加/解密过程如图所示。
using System; 
using System.Text; 
using System.IO; 
using System.Security.Cryptography; 
class Class1 

static void Main() 

Console.WriteLine("Encrypt String..."); 
txtKey = "tkGGRmBErvc="; 
btnKeyGen(); 
Console.WriteLine("Encrypt Key :",txtKey); 
txtIV = "Kl7ZgtM1dvQ="; 
btnIVGen(); 
Console.WriteLine("Encrypt IV :",txtIV); 
Console.WriteLine(); 
string txtEncrypted = EncryptString("1111"); 
Console.WriteLine("Encrypt String : ",txtEncrypted); 
string txtOriginal = DecryptString(txtEncrypted); 
Console.WriteLine("Decrypt String : ",txtOriginal); 

private static SymmetricAlgorithm mCSP; 
private static string txtKey; 
private static string txtIV; 
private static void btnKeyGen() 

mCSP = SetEnc(); 
byte[] byt2 = Convert.FromBase64String(txtKey); 
mCSP.Key = byt2; 

private static void btnIVGen() 

byte[] byt2 = Convert.FromBase64String(txtIV); 
mCSP.IV = byt2; 

private static string EncryptString(string Value) 

ICryptoTransform ct; 
MemoryStream ms; 
CryptoStream cs; 
byte[] byt; 
ct = mCSP.CreateEncryptor(mCSP.Key, mCSP.IV); 
byt = Encoding.UTF8.GetBytes(Value); 
ms = new MemoryStream(); 
cs = new CryptoStream(ms, ct, CryptoStreamMode.Write); 
cs.Write(byt, 0, byt.Length); 
cs.FlushFinalBlock(); 
cs.Close(); 
return Convert.ToBase64String(ms.ToArray()); 

private static string DecryptString(string Value) 

ICryptoTransform ct; 
MemoryStream ms; 
CryptoStream cs; 
byte[] byt; 
ct = mCSP.CreateDecryptor(mCSP.Key, mCSP.IV); 
byt = Convert.FromBase64String(Value); 
ms = new MemoryStream(); 
cs = new CryptoStream(ms, ct, CryptoStreamMode.Write); 
cs.Write(byt, 0, byt.Length); 
cs.FlushFinalBlock(); 
cs.Close(); 
return Encoding.UTF8.GetString(ms.ToArray()); 

private static SymmetricAlgorithm SetEnc() 

return new DESCryptoServiceProvider(); 




K1、K2、K3决定了算法的安全性,若三个密钥互不相同,本质上就相当于用一个长为168位的密钥进行加密。多年来,它在对付强力攻击时是比较安全的。若数据对安全性要求不那么高,K1可以等于K3。在这种情况下,密钥的有效长度为112位。
      aes
AES——对称密码新标准 
对称密码体制的发展趋势将以分组密码为重点。分组密码算法通常由密钥扩展算法和加密(解密)算法两部分组成。密钥扩展算法将b字节用户主密钥扩展成r个子密钥。加密算法由一个密码学上的弱函数f与r个子密钥迭代r次组成。混乱和密钥扩散是分组密码算法设计的基本原则。抵御已知明文的差分和线性攻击,可变长密钥和分组是该体制的设计要点。  

AES是美国国家标准技术研究所NIST旨在取代DES的21世纪的加密标准。   

AES的基本要求是,采用对称分组密码体制,密钥长度的最少支持为128、192、256,分组长度128位,算法应易于各种硬件和软件实现。1998年NIST开始AES第一轮分析、测试和征集,共产生了15个候选算法。1999年3月完成了第二轮AES2的分析、测试。预计在2000年8月AES的最终结果将公布。    
   
在应用方面,尽管DES在安全上是脆弱的,但由于快速DES芯片的大量生产,使得DES仍能暂时继续使用,为提高安全强度,通常使用独立密钥的三级DES。但是DES迟早要被AES代替。流密码体制较之分组密码在理论上成熟且安全,但未被列入下一代加密标准。     
  对称加密算法
对称加密算法 对称加密算法是应用较早的加密算法,技术成熟。在对称加密算法中,数据发信方将明文(原始数据)和加密密钥一起经过特殊加密算法处理后,使其变成复杂的加密密文发送出去。收信方收到密文后,若想解读原文,则需要使用加密用过的密钥及相同算法的逆算法对密文进行解密,才能使其恢复成可读明文。在对称加密算法中,使用的密钥只有一个,发收信双方都使用这个密钥对数据进行加密和解密,这就要求解密方事先必须知道加密密钥。对称加密算法的特点是算法公开、计算量小、加密速度快、加密效率高。不足之处是,交易双方都使用同样钥匙,安全性得不到保证。此外,每对用户每次使用对称加密算法时,都需要使用其他人不知道的惟一钥匙,这会使得发收信双方所拥有的钥匙数量成几何级数增长,密钥管理成为用户的负担。对称加密算法在分布式网络系统上使用较为困难,主要是因为密钥管理困难,使用成本较高。在计算机专网系统中广泛使用的对称加密算法有DES和IDEA等。美国国家标准局倡导的AES即将作为新标准取代DES。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值