На сайті 11893 реферати!

Усе доступно безкоштовно, тому ми не платимо винагороди за додавання.
Авторські права на реферати належать їх авторам.

Криптографічний алгоритм 3DES

Реферати > Комп'ютерні науки > Криптографічний алгоритм 3DES

Апаратна реалізація алгоритмів можлива за допомогою спеціалізованих мікросхем (виробляються кристали для алгоритмів DH, RSA, DES, Skipjack, Дердстандарт 28147-89) або з використанням компонентів широкого призначення (через дешевизну й високу швидкість перспективні цифрові сигнальні процесори - ЦСП, Digital Signal Processor, DSP).

Для більшої надійності шифрування одночасно працюють два криптопроцесора, і блок даних в 64 бітів вважається правильно зашифрованим, тільки якщо збігається інформація на виході обох блюмінгів. Швидкість шифрування - 250 КБ/c.

До алгоритмів шифрування пред'являються певні вимоги:

високий рівень захисту даних проти дешифрування й можливої модифікації;

захищеність інформації повинна ґрунтуватися тільки на знанні ключа й не залежати від того, відомий алгоритм чи ні (правило Кіркхоффа);

мала зміна вихідного тексту або ключа повинна призводити до значної зміни шифрованого тексту (ефект "обвалу");

область значень ключа повинна виключати можливість дешифрування даних шляхом перебору значень ключа;

економічність реалізації алгоритму при достатній швидкості;

вартість дешифрування даних без знання ключа повинна перевищувати вартість даних.

За допомогою криптографічних методів можливим є:

шифрування інформації;

реалізація електронного підпису;

розподіл ключів шифрування;

захист від випадкової або навмисної зміни інформації.

Симетричні блокові шифри представлені в .NET класами DESCryptoServiceProvider, TripleDESCryptoServiceProvider, RijndaelManaged. Всі ці класи є нащадками абстрактного класу SymmetricAlgorithm, що описує все сімейство блокових алгоритмів із симетричними ключами. Клас описує властивості, що дозволяють маніпулювати основними параметрами алгоритму: розміром блоку, режимом роботи, ініціалізаціонним вектором, ключем й іншими. І методи CreateEncryptor й CreateDecryptor, що повертають контексти (інтерфейс ICryptoTransform) для криптографічних трансформацій даних. Також є методи GenerateKey й GenerateIV для генерації ключів й ініціалізаційних векторів. Конкретні реалізації успадковуються від цього класу.

Симетричний шифр 3DES

Шифрування - це оборотне перетворення даних з метою їхнього приховання від сторонніх. Методів шифрування було придумано безліч - від шифрів простої заміни (найбільш відомий приклад - "Танцюючі чоловічки" Конан Дойля) до принципових, що розкривають не шифри - Вернама (двійкове додавання вихідного тексту з однократно використовуваною випадковою послідовністю). Майже всі методи шифрування використовують ключ шифрування - секретну кодову послідовність, використовувану в процесі перетворення інформації.

Шифрування виконується наступним кодом:

private SymmetricAlgorithm alg;

alg=(SymmetricAlgorithm)RijndaelManaged.Create(); //приклад створення класу RijndaelManaged

PasswordDeriveBytes pdb=new PasswordDeriveBytes(Password.Text,null); //клас, що дозволяє генерувати ключі на базі паролів

pdb.HashName="SHA512"; //будемо використати SHA512

int keylen=(int)KeySize.SelectedItem; //одержуємо розмір ключа з ComboBox'а

alg.KeySize=keylen; //установлюємо розмір ключа

alg.Key=pdb.GetBytes(keylen>>3); //одержуємо ключ із пароля

alg.Mode=CipherMode.CBC; //використаємо режим CBC

alg.IV=new Byte[alg.BlockSize>>3]; //і порожній ініціалізаційний вектор

ICryptoTransform tr=alg.CreateEncryptor(); //створюємо encryptor

FileStream instream=new

FileStream(inFile.Text,FileMode.Open,FileAccess.Read,FileShare.Read);

FileStream outstream=new

FileStream(outFile.Text,FileMode.Create,FileAccess.Write,FileShare.None);

int buflen=((2<<16)/alg.BlockSize)*alg.BlockSize;

byte []inbuf=new byte[buflen];

byte []outbuf=new byte[buflen];

int len;

while((len=instream.Read(inbuf,0,buflen))==buflen)

{

int enclen=tr.TransformBlock(inbuf,0,buflen,outbuf,0); //властиво шифруємо

outstream.Write(outbuf,0,enclen);

}

instream.Close();

outbuf=tr.TransformFinalBlock(inbuf,0,len);//шифруємо фінальний блок

outstream.Write(outbuf,0,outbuf.Length);

outstream.Close();

alg.Clear(); //здійснюємо зачищення

Як можна бачити, нічого складного в процесі шифрування/дешифрування немає. Використання базового класу SymmetricAlgorithm дозволяє звести все до конкретного алгоритму, до одного рядка - створенню екземпляра класу потрібного алгоритму.

Варто звернути увагу на необхідність явного завдання ініціалізаційного вектора, оскільки, на відміну від CryptoAPI, він не ініціалізується нулем за замовчуванням, а вибирається випадково.

Розмір розшифрованих даних для нефінального блоку може бути меншим розміру шифротекста. Поряд із самостійним читанням файлу й шифруванням його по блоках, можливий ще варіант із використанням стрима CryptoStream. При цьому ви створюєте CryptoStream, передаючи йому на вході стрим для запису й інтерфейс трансформації, а потім просто пишете в цей стрим свої дані.

Більшість сучасних стійких симетричних алгоритмів використовують ключ довжиною 64-256 біт (8-32 байта). Оскільки текст, зашифрований подвійним DES виявляється вразливим при криптографічній атаці - зустріч на середині (meet in the middle), те текст шифрується 3 рази DES. У такий спосіб довжина ключа зростає до 168-битий (56x3).

Симетричний шифр 3DES - це один з деяких симетричних шифрів, наданих стандартними криптопровайдерами CryptoAPI. Оскільки DES й 3DES - це практично той самий алгоритм (3DES - це DES, застосовуваний 3 рази підряд), те ми обмежимося прикладом використання алгоритму 3DES.

Однак помітимо, що для використання алгоритму 3DES потрібно Enhanced провайдер, а для DES цілком достатньо Base. Втім, DES уже не є стійким по сучасних мірках алгоритмом, тому використовувати його варто лише там, де надійність шифрування не дуже критична.

Алгоритм 3DES використовує різні ключі DES для кожної зі своїх операцій. Тому розмір його ключа дорівнює потрійному розміру ключа DES, тобто 192 (64*3) біти. Реально розмір ключа 3DES - 168 (56*3) біт, тому що в DES один байт ключа є контрольним для основних семи. Шифрування й дешифрування виконуються за допомогою функцій:

BOOL WINAPI CryptEncrypt(HCRYPTKEY hKey,HCRYPTHASH hHash,BOOL Final,DWORD dwFlags,BYTE* pbData,DWORD* pdwDataLen,DWORD dwBufLen);

BOOL WINAPI CryptDecrypt(HCRYPTKEY hKey,HCRYPTHASH hHash,BOOL Final,DWORD dwFlags,BYTE* pbData,DWORD* pdwDataLen).

Параметр hHash дозволяє паралельно із шифруванням/дешифруванням проводити хеширування даних для наступного електронного підпису або його перевірки. Прапор Final визначає, чи є шифрований блок даних останнім. Він необхідний, оскільки дані можна шифрувати по частинам, але для останнього блоку завжди виконується певна деініціалізація алгоритму (звільняються внутрішні структури), і багато алгоритмів роблять додавання (і перевірку коректності при дешифруванні) заповнювача (padding) після основних даних. Параметри pbData й pdwDataLen задають адреса буфера й розмір шифрованих даних. Для блоку даних (Final=FALSE) розмір даних повинен бути завжди кратний розміру шифрованого алгоритмом блоку (для 3DES й DES цей розмір дорівнює 64 бітам). Для останнього блоку допускається порушення цієї умови.

Помітимо, що зашифровані дані містяться в тому самому буфері поверх вихідних.

Останній параметр функції CryptEncrypt - dwBufLen може здатися дивним. Навіщо нам розмір буфера, якщо ми й так знаємо розмір вхідних даних? Однак насправді він необхідний. Багато алгоритмів додають заповнювач в останній блок після основних даних. У цьому випадку розмір зашифрованих даних може виявитися більшим, ніж розмір вихідних даних. І результат може просто не вміститися в буфер! Тому варто заздалегідь вказати розмір буфера, що перевищує максимальний розмір відкритих даних, що поміщають у його. Для DES й 3DES максимально можливий довісок становить 64 біта, тобто 8 байт.

Перейти на сторінку номер: 1  2  3  4  5  6 Версія для друкуВерсія для друку   Завантажити рефератЗавантажити реферат