close

Вход

Забыли?

вход по аккаунту

?

Otchet po zawite 1

код для вставкиСкачать
Московский Государственный Университет Путей Сообщения
(МИИТ)
Отчет по лабораторной работе №1
"Реализация симметричного алгоритма шифрования AES"
по дисциплине "Методы и средства защиты компьютерной информации"
Студенты: Тупикин В.
Васильев Е.
Тетюшин Д.
Группа: УАС-511 Москва 2013 г. Содержание
Постановка задачи3
Теоритическая часть3
Руководство программы5
Текст программы6
1. Постановка задачи.
2. Теоритическая часть.
Стандарт AES (Advanced Encryption Standard) является стандартом шифрования США, принятым в 2000-ом году. Он специфицирует алгоритм Rijndael. Этот алгоритм представляет собой симметричный блочный шифр, который работает с блоками данных длиной 128 бит и использует ключи длиной 128, 192 и 256 бит (версии AES-28; AES-192 и AES-256). Сам алгоритм может работать и с другими длинами блоков данных и ключей, но эта возможность в стандарт не вошла. При использовании 128-битного ключа для взлома шифрования по заявлению правительства США потребуется 149 триллионов лет.
Биты данных нумеруются с нуля, начиная со старших. В AES основным является полиномиальное представлением кодов. Так байт {01100011} следует представлять как: x6+x5 + x + 1.
Алгоритм AES производит операции над двумерными массивами байт, называемыми структурами (state). Структура состоит из 4 рядов по Nb байт. Nb равно длине блока, деленной на 32 (в данном стандарте Nb=4). Это позволяет обозначать структуру как sr,c или s[r,c], где 0≤r<4 и 0≤с<4..
Входной код (in), который является последовательностью 16 байт можно представить как:
s[r,c] =in[r +4c]
При реализации алгоритма AES используются операции сложения байт (по модулю 2 = XOR) и умножения. В алгоритме AES при умножении байтов используется неприводимый многочлен:
m(x) = x8 + x4 + x3 + x + 1[1]
Вычисление произведения М байтов {b1} на {b2} здесь выполняется согласно следующему алгоритму:
M=[{b1}●{b2}] mod m(x).[2]
В этом случае обратная величина байта равна:
{b}-1 ={b} mod m(x)[3]
для умножения полубайтов (коды длиной 4 бита) используется неприводимый полином:
m2(x) = x4 + 1
Вычисление произведения М полубайтов {a} на {b} здесь выполняется следующим образом:
M=[{a}●{b}] mod m2(x).[2a]
M представляет собой полубайт d. Операцию умножения полубайтов {a} на {b} можно записать в матричном виде:
[4]
Как было сказано выше длины ключей Nk (длина, измеренная в 32 битных словах) могут принимать значения 4, 6 или 8 (для AES-128, -192 и -256, соответственно). Число итераций Nr (round), реализуемых в алгоритме AES, составляет соответственно 10, 12 и 14.
3. Руководство пользователя.
При запуске программы пользователь видит окно с панелью управления. Здесь он может выбрать размерность ключа, после чего в поле "Text" пользователь вводит строку, которую надо зашифровать. После нажатия кнопки "Encryption->" сообщение зашифруется, оно будет выведено в строке справа от кнопки. Так же будет выведен используемый ключ в строке "Key".
После нажатия кнопки "Decrypt->" сообщение расшифруется.
При нажатии кнопки FILE (верхняя кнопка) будет открыто меню, в котором следует выбрать файл для шифрования. При нажатии кнопки "Е" файл зашифруется и будет создан дубликат с расширением "*.crypt". При нажатии кнопки FILE(нижняя кнопка) так же будет открыто меню, в котором следует выбрать файл с расширением "*.crypt" для дешифровки.
Далее при нажатии кнопки "D" данный файл дешифруется и будет создан дубликат с расширением "*.decrypt", который будет соответствовать оригинальному.
4. Текст программы.
AesManaged aes = new AesManaged();
//Keys size
if (radioButton1.Checked)
{
keysize = Aes.KeySize.Bits128;
aes.KeySize = 128;
}
else if (radioButton2.Checked)
{
keysize = Aes.KeySize.Bits192;
aes.KeySize = 192;
}
else
{
keysize = Aes.KeySize.Bits256;
aes.KeySize = 256;
}
aes.GenerateKey();
byte[] plainText = new byte[16];
byte[] cipherText = new byte[16];
plainText = Encoding.Unicode.GetBytes(textBox1.Text.PadRight(8, ' '));
Aes a = new Aes(keysize, new byte[16]);
a.Cipher(plainText, cipherText);
if (radioButton1.Checked)
keysize = Aes.KeySize.Bits128;
else if (radioButton2.Checked)
keysize = Aes.KeySize.Bits192;
else
keysize = Aes.KeySize.Bits256;
byte[] cipherText = new byte[16];
byte[] decipheredText = new byte[16];
cipherText = Encoding.Unicode.GetBytes(textBox2.Text);
Aes a = new Aes(keysize, new byte[16]);
a.InvCipher(cipherText, decipheredText);
textBox3.Text = Encoding.Unicode.GetString(decipheredText); ;
static void CryptFile(string fileIn, string fileOut, SymmetricAlgorithm algo, byte[] rgbKey, byte[] rgbIV)
{
if (string.IsNullOrEmpty(fileIn))
throw new FileNotFoundException(string.Format("Неверный путь к файлу: {0}.", fileIn));
if (!File.Exists(fileIn))
throw new FileNotFoundException(string.Format("Файл '{0}' не найден.", fileIn));
byte[] buff = null;
const string CRYPT_EXT = ".crypt";
using (var sa = algo)
// Создаем поток для записи зашифрованных данных
using (var fsw = File.Open(fileOut + CRYPT_EXT, FileMode.Create, FileAccess.Write))
// Создаем крипто-поток для записи
using (var cs = new CryptoStream(fsw,
sa.CreateEncryptor(rgbKey, rgbIV), CryptoStreamMode.Write)
)
{
// Читаем исходный файл
using (var fs = File.Open(fileIn, FileMode.Open, FileAccess.Read))
{
buff = new byte[fs.Length + sizeof(long)];
fs.Read(buff, sizeof(long), buff.Length - sizeof(long));
/* Записываем в первые 8 байт длину исходного файла
* нужно это для того чтобы, после дешифровки не было
* лишних данных
*/
int i = 0;
foreach (byte @byte in BitConverter.GetBytes(fs.Length))
buff[i++] = @byte;
}
cs.Write(buff, 0, buff.Length);
cs.Flush();
}
Array.Clear(rgbKey, 0, rgbKey.Length);
Array.Clear(rgbIV, 0, rgbIV.Length);
}
static void DecryptFile(string fileIn, string fileOut, SymmetricAlgorithm algo, byte[] rgbKey, byte[] rgbIV)
{
if (string.IsNullOrEmpty(fileIn))
throw new FileNotFoundException(string.Format("Неверный путь к файлу: {0}.", fileIn));
if (!File.Exists(fileIn))
throw new FileNotFoundException(string.Format("Файл '{0}' не найден.", fileIn));
byte[] buff = null;
const string DECRYPT_EXT = ".decrypt";
using (var sa = algo)
// Создаем поток для чтения шифрованных данных
using (var fsr = File.Open(fileIn, FileMode.Open, FileAccess.Read))
// Создаем крипто-поток для чтения
using (var cs = new CryptoStream(fsr,
sa.CreateDecryptor(rgbKey, rgbIV), CryptoStreamMode.Read)
)
{
// Дешифровываем исходный поток данных
buff = new byte[fsr.Length];
cs.Read(buff, 0, buff.Length);
// Пишем дешифрованные данные
using (var fsw = File.Open(fileOut + DECRYPT_EXT, FileMode.Create, FileAccess.Write))
{
// Читаем записанную длину исходного файла
int len = (int)BitConverter.ToInt64(buff, 0);
// Пишем только ту часть дешифрованных данных,
// которая представляет исходный файл
fsw.Write(buff, sizeof(long), len);
fsw.Flush();
}
}
Array.Clear(rgbKey, 0, rgbKey.Length);
Array.Clear(rgbIV, 0, rgbIV.Length);
2
Документ
Категория
Рефераты
Просмотров
6
Размер файла
148 Кб
Теги
otchet, zawite
1/--страниц
Пожаловаться на содержимое документа