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的運算過程。
一、密鑰處理過程:通常進行加解密過程都要初始化密鑰處理。咱們能夠跟進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
二、對數據處理的過程,跟進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();
}
}


K一、K二、K3決定了算法的安全性,若三個密鑰互不相同,本質上就至關於用一個長爲168位的密鑰進行加密。多年來,它在對付強力***時是比較安全的。若數據對安全性要求不那麼高,K1能夠等於K3。在這種狀況下,密鑰的有效長度爲112位。
 
 
 
aes
AES——對稱密碼新標準
對稱密碼體制的發展趨勢將以分組密碼爲重點。分組密碼算法一般由 密鑰擴展算法和加密(解密)算法兩部分組成。密鑰擴展算法將b字節用戶主密鑰擴展成r個子密鑰。加密算法由一個密碼學上的弱函數f與r個子密鑰迭代r次組成。混亂和密鑰擴散是分組密碼算法設計的基本原則。抵禦已知明文的差分和線性***,可變長密鑰和分組是該體制的設計要點。  

AES是美國國家標準技術研究所NIST旨在取代 DES的21世紀的加密標準。   

AES的基本要求是,採用對稱分組密碼體制,密鑰長度的最少支持爲12八、19二、256,分組長度128位,算法應易於各類硬件和軟件實現。1998年NIST開始AES第一輪分析、測試和徵集,共產生了15個候選算法。1999年3月完成了第二輪AES2的分析、測試。預計在2000年8月AES的最終結果將公佈。   
   
在應用方面,儘管DES在安全上是脆弱的,但因爲快速DES芯片的大量生產,使得DES仍能暫時繼續使用,爲提升安全強度,一般使用獨立密鑰的三級DES。可是DES早晚要被AES代替。流密碼體制較之分組密碼在理論上成熟且安全,但未被列入下一代加密標準。     
 
對稱加密算法
對稱加密算法 對稱加密算法是應用較早的加密算法,技術成熟。在對稱加密算法中,數據發信方將明文(原始數據)和加密密鑰一塊兒通過特殊加密算法處理後,使其變成複雜的加密密文發送出去。收信方收到密文後,若想解讀原文,則須要使用加密用過的密鑰及相同算法的逆算法對密文進行解密,才能使其恢復成可讀明文。在對稱加密算法中,使用的密鑰只有一個,發收信雙方都使用這個密鑰對數據進行加密和解密,這就要求解密方事先必須知道加密密鑰。對稱加密算法的特色是算法公開、計算量小、加密速度快、加密效率高。不足之處是,交易雙方都使用一樣鑰匙,安全性得不到保證。此外,每對用戶每次使用對稱加密算法時,都須要使用其餘人不知道的唯一鑰匙,這會使得發收信雙方所擁有的鑰匙數量成幾何級數增加,密鑰管理成爲用戶的負擔。對稱加密算法在分佈式網絡系統上使用較爲困難,主要是由於密鑰管理困難,使用成本較高。在計算機專網系統中普遍使用的對稱加密算法有DES和IDEA等。美國國家標準局倡導的AES即將做爲新標準取代DES。
相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息