| Назва: | Криптографічний алгоритм 3DES |
| Тип: | Реферати |
| Мова: | Українська |
| Розмiр: | 67,09 KB |
| Скачувань: | 41 |
Симетричні блокові шифри представлені в .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).
Симетричний шифр 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).