âîåííàÿ òàéíà ÄÐÎÇÄΠÀÍÄÐÅÉ 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Ã:`- ¯˜û˜Í†. Êàê âèäíî, àëãîðèòì íå î÷åíü-òî ñèëüíî óâåëè÷èâàåò ðàçìåð èíôîðìàöèè, è ïîäîáðàòü êëþ÷ áóäåò äîâîëüíî ïðîñòî. À â àññèìåòðè÷íûõ àëãîðèòìàõ âñå ãîðàçäî áîëåå êðàñèâî. |