МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ
НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ „ЛЬВІВСЬКА ПОЛІТЕХНІКА”
Лабораторна робота №2
Проектування засобів захисту інформації в комп’ютерних мережах
«Формування цифрового підпису згідно стандарту DSS»
Львів – 2015
Мета роботи: реалізувати програму формування цифрового підпису вхідного повідомлення згідно стандарту DSS.
Теоретичні відомості
Стандарт цифрового підпису DSS
Національний інститут стандартів і технологій США (NIST) розробив федеральний стандарт цифрового підпису DSS (Digital Signature Standard). Для утворення цифрового підпису використовується алгоритм DSA (Digital Signature Algorithm). В якості хеш–алгоритму стандарт передбачає використання алгоритму SHA–1 (Secure Hash Algorithm). Запропонований алгоритм DSA, має, як і RSA, теоретико-числовий характер і використовує криптографічну ситему Ель-Гамаля та К. Шнорра. Його надійність базується на практичній нерозв' язаності визначеного часткового випадку задачі обчислення дискретного логарифму. Сучасні методи розв’язку цієї задачі мають приблизно таку саму ефективність, що і методи вирішення задачі факторизації. В зв’язку з цим пропонується використовувати ключі довжиною від 512 до 1024 біт з тими характеристиками, що і в системі RSA. Довжина підпису в системі DSA меньша, ніж в RSA, і складає 320 розрядів.
Відмінності підходів стандарту DSS та алгоритму RSA
DSS використовує алгоритм, який розроблявся для використання тільки в якості цифрового підпису. На відміну від RSA даний алгоритм не можна використати для шифрування або обміну ключами. Тим не менше, це технологія з відкритим ключом.
Розглянемо відмінності підходів утворення цифрових підписів в стандарті DSS та в алгоритмі RSA.
Рис.1. Формування та перевірка підпису за допомогою алгоритму RSA.
Рис.2. Формування та перевірка підпису за допомогою стандарту DSS.
У випадку застосування алгоритму RSA підписане повідомлення подається на вхід сильної хеш – функції, яка утворює хеш – код фіксованої довжини. Для формування підпису хеш-код шифрується за допомогою закритого ключа відправника. Потім повідомлення і підпис пересилаються отримувачу. Отримувач обчислює хеш – код повідомлення і перевіряє підпис, використовуючи відкритий ключ відправника. Якщо обчислений хеш – код дорівнює дешифрованому підпису, то це означає, що підпис коректний.
У випадку застосування стандарту DSS також використовується сильна хеш-функція.
Хеш – код є входом функції підпису разом з випадковим числом , згенерованим для цього конкретного підпису. Функція підпису також залежить від закритого ключа відправника і множини параметрів, відомих всім учасникам. Можна сказати, що ця множина складається з глобального відкритого ключа . Результатом є підпис, який складається з двох компонент і .
Для перевірки підпису отримувач також обчислює хеш-код отриманого повідомлення.
Цей хеш-код разом з підписом є вхідними данимим для функції верифікації. Функція верифікації залежить від глобального відкритого ключа та від відкритого ключа відправника .
Виходом функції верифікації є значення, яке дорівнює компоненті , якщо підпис коректний. Функція підпису така, що тільки відправник, який знає закритий ключ може створити коректний підпис.
Виконання роботи
Для реалізації заданого алгоритму було обрано мову програмування C# і середовище Visual Studio 2008 Express Edition. Текст програми для реалізації наведено нижче.
Вміст файлу Program.cs:
namespace DigitalSignature
{
static class SimpleNumber
{
public static ulong QuickPow(ulong x, ulong y)
{
ulong result = 1;
while ((y > 0) && (x > 0))
{
if ((y & 1) == 1)
result *= x;
x *= x;
y >>= 1;
}
return result;
}
public static ulong longSqrt(ulong x)
{
ulong approx = x / 2,
result = 0;
while (true)
{
result = (approx + (x / approx)) / 2;
if ((((result * result) <= (x + 1000)) &&
((result * result) >= (x - 1000))) ||
(result == approx))
break;
approx = result;
}
return result;
}
public static ulong findSimpleNumber()
{
const ulong L = 755;
ulong first, last, result = 0, k, period, sqrtL;
bool isSimple;
first = QuickPow(2, L - 1);
last = QuickPow(2, L);
period = last - first;
result = first;
sqrtL = longSqrt(last);
while (period != 0)
{
isSimple = true;
for (k = 2; k < sqrtL; k++)
{
if ((result % k) == 0)
{
isSimple = false;
break;
}
}
if (isSimple)
return result;
--period;
++result;
}
return 0;
}
public static ulong findSimpleDivider(ulong p)
{
ulong newP = p - 1,
result, k, sqrtL, bound;
bool isSimple;
result = newP - QuickPow(2, 160);
sqrtL = longSqrt(result);
bound = QuickPow(2, 159);
while (result > bound)
{
isSimple = true;
if ((newP % result) > 0)
{
for (k = 2; k < sqrtL; k++)
{
if ((result % k) == 0)
{
isSimple = false;
break;
}
}
if (isSimple)
return result;
}
--result;
}
return 0;
}
public static ulong findG(ulong p,ulong q)
{
ulong g, h, pow = (p - 1) / q;
h = 1 + longSqrt(p - 1);
g = QuickPow(h, pow) % q;
return g;
}
public static ulong createSecretKey(ulong q)
{
uint temp = 0;
ulong x = 0;
Random rnd = new Random();
temp = (uint)rnd.Next(99999);
return x = q - temp;
}
public static ulong createPublicKey(ulong g, ulong p, ulong x)
{
ulong pow, y;
pow = SimpleNumber.QuickPow(g, x);
return y = pow % p;
}
}
static class DigitSignature
{
public static ulong createK(ulong q)
{
uint temp = 0;
ulong k = 0;
Random rnd = new Random();
temp = (uint)rnd.Next(99999);
return k = q - temp;
}
public static ulong createR(ulong g, ulong p, ulong q, ulong k)
{
ulong pow, r;
pow = SimpleNumber.QuickPow(q, k);
return r = (pow % p) % q;
}
public static ulong createS(ulong k, ulong x, ulong r, ulong q, string line)
{
uint[] sha1 = new uint[5];
ulong e, s;
SHA1 sha = new SHA1();
sha.GetHash(line);
sha1 = sha.resHash;
e = sha1[0] + sha1[1] + sha1[2] + sha1[3] + sha1[4];
s = (k*(e + x * r)) % q;
return s;
}
Результат роботи програми:
Висновок: На лабораторній роботі я реалізував програму формування цифрового підпису вхідного повідомлення згідно стандарту DSS.