Search:

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

Симетричний шифр 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 бітам). Для останнього блоку допускається порушення цієї умови.

Перейти на сторінку номер:
 1  2  3  4  5  6  7  8 


Подібні реферати:

Що можна робити в Інтернет. Головні напрямки роботи в Інтернет

ПЛАН 1. Спектр послуг Інтернет. 2. ТСР/IP протокол. 3. Головні напрямки використання Інтернет. 4. Адресація в Інтернет. 1. Спектр послуг Інтернет. Зараз спостерігається швидке розширення спектру послуг Інтернет. З'являються ішвидко поширюються нові види сервісу: - електронні газети, електронні "розмовляючі" мультимедіальні журнали; - тижневі радіопередачі, які транслюються по Інтернет (ITR); - відеоконференції; - технічна підтримка компаніями своїх продуктів; - електронні закупки; тощо. Сьогодні ...

Інтерфейс IDE (Integrated Drive Electronics)

Вступ У сучасних комп'ютерах пристрої для запису даних і програм на магнітні диски (їх часто називають твердими дисками чи "вінчестерами") є основним засобом довгострокового збереження інформації, тому базові принципи роботи дискових пристроїв корисно знати кожному. Це допоможе більш раціонально організувати використання диска, продовжити термін його служби, а також позбутися від зайвих проблем при установці в комп'ютер додаткового диска чи заміні старого. У сучасних персональних комп'ютерах найбільш ...

Особливості алгоритмів роботи вірусів

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