Èçäàòåëüñêèé äîì ÎÎÎ "Ãåéì Ëýíä"ÑÏÅÖÂÛÏÓÑÊ ÆÓÐÍÀËÀ ÕÀÊÅÐ #72, ÍÎßÁÐÜ 2006 ã.

âîåííàÿ òàéíà

ÄÐÎÇÄÎÂ ÀÍÄÐÅÉ AKA SULVERUS

Ñïåöâûïóñê: Õàêåð, íîìåð #072, ñòð. 072-034-3


[ðàáîòà ñ ñèììåòðè÷íûìè àëãîðèòìàìè.]

Òóò âñå ïðåäåëüíî ïðîñòî, ïîñêîëüêó äàííûå øèôðóþòñÿ è ðàñøèôðîâûâàþòñÿ îäíèì è òåì æå êëþ÷îì. Äëÿ ðàáîòû ñ àëãîðèòìîì Triple DES íàì ïîíàäîáèòñÿ TripleDES Crypto Service Provider - åãî êðèïòîïðîâàéäåð ïî óìîë÷àíèþ. Ñîçäàåì êîíñîëüíîå ïðèëîæåíèå, ðåãèñòðèðóåì ïðîñòðàíñòâî èìåí System.Security.Cryptography è ñîçäàåì êëàññ TripleDES äëÿ ðàáîòû ñ àëãîðèòìîì.  íàøåì êëàññå áóäåò äâå ëîãè÷åñêèå ôóíêöèè public bool Encrypt() è public bool Decrypt() äëÿ ñîîòâåòñòâóþùèõ ïðåîáðàçîâàíèé èíôîðìàöèè. Íàïîìíþ, ÷òî â ñèììåòðè÷íûõ àëãîðèòìàõ èñïîëüçóåòñÿ òîëüêî ñåêðåòíûé êëþ÷, êîòîðûé èñïîëüçóåòñÿ äëÿ ïðåîáðàçîâàíèé äàííûõ â îáå ñòîðîíû. Âõîäíûìè äàííûìè â ôóíêöèÿõ áóäóò: íåçàøèôðîâàííûé òåêñò, êëþ÷ ïðåîáðàçîâàíèé è èìÿ ôàéëà, â êîòîðûé áóäåò çàïèñàí øèôðîòåêñò (è, íàîáîðîò, â ôóíêöèè ðàñøèôðîâêè). Ðàññìîòðèì êîä:

Êðèïòîïðîâàéäåðû TripleDES

public class TripleDES

{

public static bool Encrypt(string OpenText, string SafeKey, string EncrText)

{

try

{

DESCryptoServiceProvider TDes = new DESCryptoServiceProvider(); //ñîçäàåì //ïðîâàéäåð

TDes.Key = ASCIIEncoding.ASCII.GetBytes(SafeKey);

TDes.GenerateIV(); //ãåíåðèðóåì âåêòîð èíèöèàëèçàöèè

ICryptoTransform encryption = TDes.CreateEncryptor(); //ñîçäàåì øèôðîâàëüùèê

FileStream Fin = new FileStream(OpenText, FileMode.Open, FileAccess.Read);

//ñîçäàåì ôàéëîâûå ïîòîêè

FileStream Fout = new FileStream(EncrText, FileMode.Create, FileAccess.Write);

CryptoStream crypt = new CryptoStream(Fout, encryption, CryptoStreamMode.Write);

byte[] outtext = new byte[Fin.Length - 1];

Fin.Read(outtext, 0, outtext.Length);

crypt.Write(outtext, 0, outtext.Length); //øèôðóåì

crypt.Close(); //çàêðûâàåì

Fin.Close();

Fout.Close();

Console.WriteLine("Done");

return true;

}

//äàëåå îáðàáîòêà îøèáîê

}

public static bool Decrypt(string SafeText, string SafeKey, string OpenText)

{

try

{

TripleDESCryptoServiceProvider TDesDec = new TripleDESCryptoServiceProvider();

//Ñîçäàåì ïðîâàéäåð

TDesDec.Key = ASCIIEncoding.ASCII.GetBytes(SafeKey);

TDesDec.GenerateIV(); //ãåíåðèðóåì âåêòîð èíèöèàëèçàöèè

FileStream SText = new FileStream(SafeText, FileMode.Open, FileAccess.Read);

ICryptoTransform decrypt = TDesDec.CreateDecryptor();

CryptoStream DecryptionStream = new CryptoStream(SText, decrypt, CryptoStreamMode.Read); //ñîçäàåì øèôðîâàëüùèê

StreamWriter OpenT = new StreamWriter(OpenText);

OpenT.Write(new StreamReader(DecryptionStream).ReadToEnd()); //ðàñøèôðîâûâàåì

OpenT.Flush(); //çàêðûâàåì

OpenT.Close();

Console.WriteLine("Done");

return true;

}

//äàëåå îáðàáîòêà îøèáîê

}

}

 ôóíêöèè TripleDES.Encrypt() ñîçäàåòñÿ êðèïòîïðîâàéäåð äëÿ àëãîðèòìà TripleDES, äàëåå ñîçäàåòñÿ êëþ÷ è âåêòîð èíèöèàëèçàöèè àëãîðèòìà, ïîòîì ïðè ïîìîùè îáúåêòà ICryptoTransform ñîçäàåòñÿ øèôðîâàëüùèê, ïîñëå ýòîãî ïðîãðàììà ÷èòàåò ôàéë ñ òåêñòîì, êîòîðûé íàäî çàøèôðîâàòü. Ïîñëå ïðåîáðàçîâàíèÿ áàéòîâ ïðîãðàììà çàïèñûâàåò ðåçóëüòàò â ôàéë. Ðàñøèôðîâêà ñîîáùåíèÿ ïðîèñõîäèò ïðàêòè÷åñêè òàêèì æå îáðàçîì, òîëüêî ïðîãðàììà îòêðûâàåò ôàéë ñ ùèôðîòåêñòîì. Çàìå÷ó, ÷òî äëÿ èñïîëüçîâàíèÿ äðóãîãî ñèììåòðè÷íîãî àëãîðèòìà øèôðîâàíèÿ íóæíî ïîìåíÿòü ïåðâóþ ñòðîêó â êîäå - òó, ãäå ñîçäàåòñÿ êðèïòîïðîâàéäåð. Ïîñëå âñåõ ïðåîáðàçîâàíèé íàø ïîäîïûòíûé êðîëèê (ñòðîêà «Xakep - Super Hypper Rulez!») áóäåò âûãëÿäåòü ñëåäóþùèì îáðàçîì: ÍÒd¨ùc` ”rÓ�qi €UdŒWÃ:`- ¯˜û˜Í†. Êàê âèäíî, àëãîðèòì íå î÷åíü-òî ñèëüíî óâåëè÷èâàåò ðàçìåð èíôîðìàöèè, è ïîäîáðàòü êëþ÷ áóäåò äîâîëüíî ïðîñòî. À â àññèìåòðè÷íûõ àëãîðèòìàõ âñå ãîðàçäî áîëåå êðàñèâî.

Íàçàä íà ñòð. 072-034-2  Ñîäåðæàíèå  Âïåðåä íà ñòð. 072-034-4