close

Вход

Забыли?

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

?

ЛР5 Шнорр Алексеевич

код для вставкиСкачать
 МИНИСТЕРСТВО ОБРАЗОВАНИЯ РЕСПУБЛИКИ БЕЛАРУСЬ Учреждение образование "Белорусский государственный технологический университет" Кафедра информационных систем и технологий Лабораторная работа №5
"ЭЦП на основе схемы Шнорра и однонаправленных хэш-функций" Выполнила: студентка 5 курса 9 группы факультета ИДиП Алексеевич А.Б., Проверил: Шиман Д.В. Минск 2013
Оглавление
Введение3
1.Теоретическое введение5
2.Постановка и решение задачи7
Вывод12
Введение
Шифрование - обратимое преобразование информации в целях сокрытия от неавторизованных лиц, с предоставлением, в это же время, авторизованным пользователям доступа к ней. С помощью шифрования обеспечиваются три состояния безопасности информации:
* Конфиденциальность. Шифрование используется для сокрытия информации от неавторизованных пользователей при передаче или при хранении.
* Целостность. Шифрование используется для предотвращения изменения информации при передаче или хранении.
* Идентифицируемость. Шифрование используется для аутентификации источника информации и предотвращения отказа отправителя информации от того факта, что данные были отправлены именно им.
Шифрование применяется для хранения важной информации в ненадёжных источниках и передачи её по незащищенным каналам связи. Такая передача данных представляет из себя два взаимно обратных процесса:
* Перед отправлением данных по линии связи или перед помещением на хранение они подвергаются зашифрованию.
* Для восстановления исходных данных из зашифрованных к ним применяется процедура расшифрования.
Шифрование состоит из двух составляющих: зашифрование и расшифрование.
Пусть существуют два множества, представляющее данные - и , и каждая из двух функций (шифрующая и расшифровывающая) является отображением одного из этих множеств в другое.
* Шифрующая функция: * Расшифровывающая функция: Элементы этих множеств - и являются аргументами соответствующих функций. Так же, в эти функции уже включено понятие ключа. То есть тот необходимый ключ для шифрования или расшифрования является частью функции. Это позволяет рассматривать процессы шифрования абстрактно, вне зависимости от структуры используемых ключей. Хотя, в общем случае, для каждой из этих функций аргументами являются данные и вводимый ключ.
Если для шифрования и расшифрования используется один и тот же ключ , то такой алгоритм относится к симметричным. Если же из ключа шифрования алгоритмически сложно получить ключ расшифрования, то алгоритм относят к асимметричным, то есть к алгоритмам с открытым ключом.
Для применения в целях шифрования эти функции, в первую очередь, должны быть взаимно обратными. Важной характеристикой шифрующей функции является ее криптостойкость. Косвенной оценкой криптостойкости является оценка взаимной информации между открытым текстом и шифротекстом, которая должна стремиться к нулю.
Криптографическая стойкость - способность криптографического шифра противостоять криптоанализу. Любая система шифрования, кроме абсолютно криптостойких, может быть взломана простым перебором всех возможных в данном случае ключей. Но перебирать придется до тех пор, пока не отыщется тот единственный ключ, который и поможет расшифровать шифротекст.
Методы шифрования:
* Симметричное шифрование. В симметричных криптосистемах для шифрования и расшифрования используется один и тот же ключ. Отсюда название - симметричные. Алгоритм и ключ выбирается заранее и известен обеим сторонам. Сохранение ключа в секретности является важной задачей для установления и поддержки защищенного канала связи. В связи этим, возникает проблема начальной передачи ключа (синхронизации ключей). Кроме того существуют методы криптоатак, позволяющие так или иначе дешифровать информацию не имея ключа или же с помощью его перехвата на этапе согласования. В целом эти моменты являются проблемой криптостойкости конкретного алгоритма шифрования и являются аргументом при выборе конкретного алгоритма.
* Асимметричное шифрование (с открытым ключом). В системах с открытым ключом используются два ключа - открытый и закрытый, связанные определенным математическим образом друг с другом. Открытый ключ передаётся по открытому (то есть незащищённому, доступному для наблюдения) каналу и используется для шифрования сообщения и для проверки ЭЦП. Для расшифровки сообщения и для генерации ЭЦП используется секретный ключ.
1. Теоретическое введение
Электронная подпись (ЭП), Электронная цифровая подпись (ЭЦП) - информация в электронной форме, присоединенная к другой информации в электронной форме (электронный документ) или иным образом связанная с такой информацией. Используется для определения лица, подписавшего информацию (электронный документ).
Существует несколько схем построения цифровой подписи:
* На основе алгоритмов симметричного шифрования. Данная схема предусматривает наличие в системе третьего лица - арбитра, пользующегося доверием обеих сторон. Авторизацией документа является сам факт зашифрования его секретным ключом и передача его арбитру. * На основе алгоритмов асимметричного шифрования. На данный момент такие схемы ЭП наиболее распространены и находят широкое применение.
Поскольку подписываемые документы - переменного (и как правило достаточно большого) объёма, в схемах ЭП зачастую подпись ставится не на сам документ, а на его хеш. Для вычисления хэша используются криптографические хеш-функции, что гарантирует выявление изменений документа при проверке подписи. Хеш-функции не являются частью алгоритма ЭП, поэтому в схеме может быть использована любая надёжная хеш-функция.
Схема Шнорра - протокол идентификации, который является альтернативой протоколам Фиата-Шамира и Гиллу-Кискатра. Надежность алгоритма основывается на сложности вычисления дискретного логарифма.
Описание схемы:
* Выбирается простое p и простое q, такое, что (, );
* Выбирается элемент β, такой, что ;
* Параметры (p,q,β) свободно публикуются;
* Пусть каждая доказывающая сторона A выбирает секрет a (закрытый ключ), такой, что и вычисляет , где v-открытый ключ;
* A выбирает случайное r (), вычисляет (1);
* Пусть имеется однонаправленная хеш-функция H(M). Сторона А объединяет M с x и хеширует результат ;
* Далее A вычисляет (2). Значения e и y являются цифровой подписью и отсылаются B;
* B вычисляет (3). Затем z и полученное сообщение M' пропускаются через хеш-функцию: . Если , то подпись считается верной.
2. Постановка и решение задачи
В данной лабораторной работе требуется разработать программу для подписи текстового документа с помощью алгоритма ЭЦП на основе схемы Шнорра и однонаправленных хэш-функций, а также позволяющая проверить эту подпись.
Для выполнения работы использовался язык программирования С#. Пример работы программы представлен на рисунке 1-2:
Рисунок 1. Главное окно программы
Рисунок 2. Электронная цифровая подпись
Для начала необходимо сгенерировать ключи. Нажимая на кнопку "Генерация ключей", генерируем тайный ключ для создания цифровой подписи и публичный ключ для проверки цифровой подписи на подлинность, т. к. мы используем ЭЦП на основе схемы Шнорра. После нажатия на кнопку "Подписать" создается цифровая подпись выбранного документа. Как она формируется: с помощью формулы 1 находим значение x и добавляем его в конец сообщения. С помощью алгоритма MD5 находим хеш-значение это блока. Далее по формуле 2 вычисляем значение y и добавляем его в конец хеш-значения. В итоге сформированный поток и есть цифровая подпись. Для того, чтобы проверить, принадлежит ли документ отправителю, нужно нажать на кнопку "Проверить". Как происходит проверка: по формуле 3 вычисляем значение z и добавляем его в конец исходного сообщения. Далее хешируем полученный блок и сравниваем его с хеш-значением, найденном при создании цифровой подписи. Если они одинаковые, то подпись считается верной.
private void btnGenerateKey_Click(object sender, EventArgs e)
{
var keyDictionary = AlgorithmSchnorr.GetKeys();
var saveFileDialog = new SaveFileDialog
{
Filter = @"XML Files|*.xml",
FilterIndex = 2,
RestoreDirectory = true,
Title = @"Private Key"
};
if (saveFileDialog.ShowDialog() == DialogResult.OK)
{
label1.Text="Приватный ключ сгенерирован";
}
saveFileDialog.Title = "Public Key";
if (saveFileDialog.ShowDialog() == DialogResult.OK)
{
label1.Text="Публичный ключ сгенерирован";
}
}
private void btnCreateEds_Click(object sender, EventArgs e)
{
try
{
var openFileDialog1 = new OpenFileDialog
{
Filter = "txt files (*.txt)|*.txt|All files (*.*)|*.*",
FilterIndex = 2,
RestoreDirectory = true,
Title = "File"
};
StringBuilder stringBuilder = new StringBuilder();
string tmpFilePath = "";
if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
tmpFilePath = openFileDialog1.FileName;
try
{
using (var sr = new StreamReader(openFileDialog1.FileName))
{
string line;
while ((line = sr.ReadLine()) != null)
{
stringBuilder.Append(line);
}
sr.Close();
}
}
catch (Exception ex)
{
MessageBox.Show("Error: Could not read file from disk. Original error: " + ex.Message);
}
}
string hashMd5 = "";
string cryptohash = "";
openFileDialog1.Title = "Private Key";
if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
var keys = new Dictionary<string, int>();
XDocument xDocument = XDocument.Load(openFileDialog1.FileName);
var tt = xDocument.Element("head").Element("element").Elements();
foreach (var xElement in tt)
{
keys.Add(xElement.Name.LocalName, Convert.ToInt32(xElement.Value));
}
int p = keys["p"], q = keys["q"], b = keys["b"], a = keys["a"];
Random rand = new Random();
ulong r = (ulong)rand.Next(1, (int)q - 1);
BigInteger x = BigInteger.ModPow(b, r, p);
stringBuilder.Append(x);
hashMd5 = AlgorithmMd5.Encryption(stringBuilder.ToString());
BigInteger E = new BigInteger(Encoding.ASCII.GetBytes(hashMd5));
BigInteger y = (a * E + r) % q;
cryptohash += E + y.ToString().PadLeft(8, '0');
}
using (StreamWriter fs = new StreamWriter(tmpFilePath, true))
{
fs.Write(cryptohash);
fs.Close();
}
label2.Text="Файл подписан!";
}
catch (Exception ex)
{
}
}
private void btnCheckEDS_Click(object sender, EventArgs e)
{
try
{
var openFileDialog1 = new OpenFileDialog
{
Filter = @"txt files (*.txt)|*.txt|All files (*.*)|*.*",
FilterIndex = 2,
RestoreDirectory = true,
Title = "File"
};
StringBuilder stringBuilder = new StringBuilder();
string tmpFilePath = "";
if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
tmpFilePath = openFileDialog1.FileName;
try
{
using (var sr = new StreamReader(openFileDialog1.FileName))
{
string line;
while ((line = sr.ReadLine()) != null)
{
stringBuilder.Append(line);
}
sr.Close();
}
}
catch (Exception ex)
{
MessageBox.Show("Error: Could not read file from disk. Original error: " + ex.Message);
}
}
string Hash = stringBuilder.ToString().Substring(stringBuilder.Length - 85);
BigInteger E = BigInteger.Parse(Hash.Substring(0, 77));
int y = Convert.ToInt32(Hash.Substring(78));
label5.Text=Hash;
stringBuilder.Remove(stringBuilder.Length - 85, 85);
string newHash = "";
BigInteger E1 = 0;
StringBuilder str = new StringBuilder();
str.Append(stringBuilder);
if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
var keys = new Dictionary<string, int>();
XDocument xDocument = XDocument.Load(openFileDialog1.FileName);
var tt = xDocument.Element("head").Element("element").Elements();
foreach (var xElement in tt)
{
keys.Add(xElement.Name.LocalName, Convert.ToInt32(xElement.Value));
}
int p = keys["p"], q = keys["q"], b = keys["b"], v = keys["v"];
BigInteger z = (BigInteger.ModPow(b, y, p) * BigInteger.ModPow(v, E, p)) % p;
stringBuilder.Append(z);
newHash = AlgorithmMd5.Encryption(stringBuilder.ToString());
E1 = new BigInteger(Encoding.ASCII.GetBytes(newHash));
}
//using (StreamWriter fs = new StreamWriter(tmpFilePath, false))
//{
// fs.Write(str + Hash);
// fs.Close();
//}
if (E == E1)
{
label3.Text="TRUE";
}
else
{
label3.Text="FALSE";
}
//MessageBox.Show(stringBuilder.ToString());
}
catch
{
label3.Text="FALSE";
}
}
Вывод
В результате выполнения данной лабораторной работы была разработана программа, позволяющая "подписать" текстовый документ с помощью алгоритма ЭЦП на основе схемы Шнорра и однонаправленных хеш-функций, а также проверить эту подпись.
Документ
Категория
Рефераты
Просмотров
207
Размер файла
75 Кб
Теги
алексеева, лр5, шнорр
1/--страниц
Пожаловаться на содержимое документа