Програмний код для алгоритму ЕЦП ЕЦП DSS/DSА - Розробка електронного цифрового підпису
#include "stdafx. h"
Extern "C"
{
#include "miracl. h"
}
#include <ctime>
#include <cstring>
#include <iostream>
Class DSA
{
Public:
Big p, q, g; // открытые параметры алгоритма
Csprng rng; // криптографический стойкий генератор ПСЧ
Void sign(void *msg, int len, big x, big r, big s); // подпись
Bool check(void *msg, int len, big y, big r, big s); // проверка
Void genKeys(big x, big y); // генерация ключевой пары
Void genOpenParams(char *seed, int len); // генерация открытых
Параметров
DSA(char *seed, int len);
~DSA();
};
// здесь во всю используется бблиотека miracl, big -- число большой
Разрядности
Inline void sha_string(char* msg, int len, char* tmp) // хеширование в
Строку
{
Sha sha; // sha1 хеш
Shs_init(&;sha); // инициализация
For (int i = 0; i < len; i++)
Shs_process(&;sha, msg[i]); // хешируем сообщение
Shs_hash(&;sha, tmp); // записываем результат в выходной буфер
}
Inline void sha_string(char* msg, int len, big t) // хеширование в big число
{
Char tmp[20];
Sha_string(msg, len, tmp); // хешируем в строку
Bytes_to_big(20, tmp, t); // преобразуем строку в число
}
Inline void inc(char *seed, int len) // увеличиваем seed на 1, используется
При генерации открытых параметров
{
Seed[len - 1]++; // инкрементируем младший байт
For (int i = len - 2; i >= 0; i--) // идем начиная с предпоследнего
{
If (seed[i + 1] == 0) // если байт 0 -- считаем что произошло
Переполнение
Seed[i]++; // и увеличиваем старший байт на один
Else
Break; // при первом отсутствии переполнения выходим из цикла
}
}
DSA::DSA(char *seed, int len)
{
Strong_init(&;rng, len, seed, time(NULL)); // инициализация генератора
ПСЧ
}
DSA::~DSA()
{
Mirkill(p); // освобождаем память
Mirkill(q);
Mirkill(g);
}
Void DSA::sign(void *msg, int len, big x, big r, big s)
{
Big k = mirvar(0); // раундовый ключ
Big t = mirvar(0); // временная переменная
Strong_bigrand(&;rng, q, k); // заполняем k случайным числом меньшим q
Powmod(g, k, p, r); // вычисляем r по модулю p
Divide(r, q, q); // теперь берем по модулю q
Sha_string((char*)msg, len, t); // хешируем сообщение
Multiply(x, r, s); // расчет s
Add(s, t, s);
Divide(s, q, q);
Xgcd(k, q, k, k, k); // поиск обратного элемента
Multiply(s, k, s);
Divide(s, q, q);
Mirkill(k); // подчищаем
Mirkill(t);
}
Bool DSA::check(void *msg, int len, big y, big r, big s)
{
Big w = mirvar(0), u1 = mirvar(0), u2 = mirvar(0), v = mirvar(0);
Copy(s, w);
Xgcd(w, q, w, w, w); // w=1/s
Sha_string((char*)msg, len, u1); // хешируем
Multiply(u1, w, u1); // домножаем
Multiply(r, w, u2);
Powmod2(g, u1, y, u2, p, v); // двойное возведение в степень,
V=g^u1*y^u2 mod p
Divide(v, q, q); // приводим по модулю q
Bool res = !compare(v, r); // compare вернет 0 при совпадении
Переменных
Mirkill(w); mirkill(u1); mirkill(u2); mirkill(v);
Return res;
}
Void DSA::genKeys(big x, big y)
{
Strong_bigrand(&;rng, q, x); // случайных закрытый ключ
Powmod(g, x, p, y); // открытый
}
Void DSA::genOpenParams(char *seed, int len) // стр 11 fips 186-1
{
P = mirvar(0);
Q = mirvar(0);
G = mirvar(0);
Do
{
// step 2
Char u[20];
Sha_string(seed, len, u); //певый операнд в u
Inc(seed, len); // seed = seed + 1
Char t[20];
Sha_string(seed, len, t); // второй операнд
For (int i = 0; i < 20; i++) // xor
U[i] ^= t[i];
//step 3
U[0] |= 1;
U[len - 1] |= 1 << 7;
Bytes_to_big(20, u, q); // переводим массив байт в число
} while (!isprime(q)); // step 4
Big X = mirvar(0);
Big t = mirvar(1);
Sftbit(t, 1023, t); // t=2^(L-1)
Do
{
Inc(seed, len); // вместе с первым inc в следующем цикле образует
Offset=2
Char V[1024 / 8];
Char *ptr = V; // указатель на Vk
For (int k = 0; k < 1024 / 160; k++) // step 7
{
Inc(seed, len); // seed += 1
Sha_string(seed, len, ptr); // Vk=SHA1(seed+offset+k)
Ptr += 20; // по сути K++, переход к следующей части буфера
}
Bytes_to_big(sizeof(V), V, X); // step 8
Add(X, t, X); // в t 2^(L-1)
//step 9
Sftbit(q, 1, q); // q=2q, побитовый сдвиг
Copy(X, t); // t=X
Divide(t, q, q); // t=X mod 2q, в документации это c
Sftbit(q, -1, q); // q=2q/2=q
Decr(t, 1, t); // c-1
Subtract(X, t, p); // p=X-(c-1)
Convert(1, t); // востанавливаем 2^(L-1) в t
Sftbit(t, 1023, t);
If (compare(p, t) == -1) // step 10
Goto loopend;
If (isprime(p))
Break; // если p простое -- выходим из цикла
Loopend:
Inc(seed, len); // по сути offset+=1
} while (true);
Copy(p, X); // X=p
Decr(X, 1, X); // X=p-1
Copy(q, t); // t=q
Xgcd(t, p, t, t, t); //t=1/q
Multiply(X, t, X); // X=(p-1)/q
Divide(X, p, p); // X=(p-1)/q mod p, в документации на 7 стр, степень при
H
Do
{
Bigrand(q, t);// по сути t=h
Powmod(t, X, p, g); // генерация g=h^((p-1)/q) mod p
} while (size(g) == 1); // пока g=1
Mirkill(X);
Mirkill(t);
}
Template<typename Signature>
Void test(char *msg, char *alg) // тест подписи
{
Char seed[20] = { 1, 2, 3, 4, 5, 6, 7 }; // зерно
Signature sign(seed, sizeof(seed));
Sign. genOpenParams(seed, sizeof(seed)); // генерация открытых
Параметров
Big x = mirvar(0), y = mirvar(0); // ключи
Sign. genKeys(x, y); // их генерация
Std::cout << "Testing " << alg << ": " << std::endl;
Big r = mirvar(0), s = mirvar(0); // подпись
Sign. sign(msg, strlen(msg), x, r, s); // подписываем
Std::cout << "Sing: ";
Char num[1000];
Cotstr(r, num); // функция, конвертирующая big в строку, часть miracl
Std::cout << num << std::endl;
Cotstr(s, num);
Std::cout << num << std::endl;
If (sign. check(msg, strlen(msg), y, r, s)) // проверяем подпись
Std::cout << "Sign match" << std::endl;
Else
Std::cout << "Sign mismatch" << std::endl;
Msg[0] ^= 1; // меняем сообщение
Std::cout << "Changing msg... msg: " << msg << ": ";
If (sign. check(msg, strlen(msg), y, r, s)) // проверяем отклонение подписи
Std::cout << "Sign match" << std::endl;
Else
Std::cout << "Sign mismatch" << std::endl;
Msg[0] ^= 1; // востанавлдиваем сообщение
Incr(r, 1, r); // и портим подпись
Std::cout << "Restoring msg and changing r: ";
If (sign. check(msg, strlen(msg), y, r, s)) // проверяем отклонение подписи
Std::cout << "Sign match" << std::endl;
Else
Std::cout << "Sign mismatch" << std::endl;
}
Int _tmain(int argc, _TCHAR* argv[])
{
Mirsys(64 * 3, 0)->IOBASE = 16; // инициализируем miracl, ввод-вывод в
16й системе
Char msg[1024]; // сообщение
Std::cout << "Enter msg:> ";
Std::cin. getline(msg, sizeof(msg));
Test<DSA>(msg, "DSA"); // тестируем DSA
System("pause");
Return 0;
}
Похожие статьи
-
Програмний код для алгоритму ЕЦП по Ель Гамалю #include "stdafx. h" #include "ElGamal. h" #include <ctime> #include <iostream> Inline void...
-
ВИСНОВКИ - Розробка електронного цифрового підпису
Схема цифрового підпису Ель Гамаля має ряд переваг у порівнянні зі схемою цифрового підпису RSА: Ѕ при заданому рівні стійкості алгоритму цифрового...
-
Стандарт ЕЦП DSS/DSА - Розробка електронного цифрового підпису
У 1991 р NIST (National Institute of Standards and Technology) запропонував для обговорення проект стандарту ЕЦП DSS (Digital Signature Standard),...
-
ПЕРЕЛІК ВИКОРИСТАНИХ ДЖЕРЕЛ - Розробка електронного цифрового підпису
1. Баричев С. Г Основи сучасної криптографії // Гончаров В. В., Сєров Р. Е. - Москва, Гаряча лінія - Телеком, 2001 2. Бєляєв А. В. Методи і засоби...
-
Криптологія, Системи електронного цифрового підпису (ЕЦП) - Розробка електронного цифрового підпису
Криптологія - наука, що займається методами шифрування і дешифрування. Криптологія складається з двох частин - криптографії та криптоаналізу....
-
Цифровий підпис на основі алгоритму Ель Гамаля (EGSA) Хешування відбувається за схемою, зображеної на рис. 2.1 Рисунок 2.1 - Схема функції хешування...
-
ВСТУП - Розробка електронного цифрового підпису
Метою аутентифікації електронних документів є їх захист від можливих видів зловмисних дій, які можуть завдати істотної шкоди банківським і комерційним...
-
Хеш-функція - Розробка електронного цифрового підпису
Функція хешування - це відображення h з безлічі всіх послідовностей символів з алфавіту А в, де m - деяке фіксоване натуральне число. Таким чином, кожна...
-
Файл тесту Тест є послідовністю питань, на які випробовуваний повинен відповісти шляхом вибору правильної відповіді з декількох запропонованих варіантів....
-
Блок - схема алгоритму, Опис алгоритму - Розробка гри в С# "Корови та бики"
Рисунок 2.1 - Блок - схема алгоритму роботи програми Рисунок 2.1 (продовження) Опис алгоритму 3.1. Робота програми розпочинається з виділення пам'яті під...
-
Корпуса интегральных микросхем должны удовлетворять ряду требований, обеспечивающих их надежную эксплуатацию. Корпус должен обладать достаточной...
-
SSL сертификат представляет собой простой текстовый файл, который может быть редактирован и создан кем угодно. Чтобы убедиться в том, что сертификат...
-
Цикли вкладені - Формування навичок програмування з використанням алгоритмічної мови С++
Часто буває так, що при повтореннях змінюється не одна величина, а дві (чи навіть більше). І при кожному значенні однієї величини інша величина...
-
Для того, чтобы строить диаграммы в соответствии с рисунком 2.7, необходимо реализовать алгоритм соединения двух объектов линией. Для отображения линии...
-
В цьому розділі я описую яку послідовність необхідно витримати при створенні інтерфейсу головного вікна програми для того, щоб створити форму та...
-
ОСНОВИ ТЕСТУ, Історична довідка - Розробка програми для проходження різноманітних тестів
Історична довідка Передісторія тестування йде в глибину століть, вона пов'язана з випробуванням різних здібностей, знань, умінь і навиків. Вже в середині...
-
Функціональна і логічна структура - Розробка програми для проходження різноманітних тестів
При запуску, програма чекає наступних дій користувача. Оскільки наша тестова програма майже досконала то вона має на меті розробку будь - якого тесту при...
-
Работа алгоритма LBFS начинается с заданной вершины графа, которая в общем случае выбирается случайно. Получаемый порядок вершин также может быть основан...
-
VC++ - мова і середовище програмування, що відноситься до класу RAD - (Rapid Application Development _ "Засіб швидкої розробки додатків") засобів CASE -...
-
Объектом исследования является микросхема 4-х процессорной "системы на кристалле" на базе ядер 32-разрядных процессов цифровой обработки сигналов с...
-
Поворот точки относительно центра на заданный угол: X = o. X + (p. X-o. X) * cos(angle) - (p. Y-o. Y) * sin(angle) Y = o. Y + (p. X-o. X) * sin(angle) +...
-
Описание используемых методов и алгоритмов - Выбор оптимального маршрута для строительства дороги
В данном пункте нужно проанализировать используемый алгоритм поиска кратчайшего пути. Алгоритм Дейкстры Находит кратчайший путь от одной из вершин графа...
-
Стек технологий При выборе стека технологий основное внимание уделялось следующим факторам, в порядке убывания значимости: § Кроссплатформенность; §...
-
Для оценки возможности выполнения проекта имеющимся в распоряжении разработчика штатным составом исполнителей, нужно рассчитать их среднее количество,...
-
В ходе выполнения дипломного проекта был разработан алгоритм генерации искусственных биометрических образов, позволяющий создавать правдоподобные...
-
Постановление Правительства Российской Федерации №1119 "Об утверждении требований к защите персональных данных при их обработке в информационных системах...
-
Федеральный Закон РФ № 149-ФЗ "Об информации, информационных технологиях и о защите информации", принятый Государственной Думой 8 июля 2006 года и...
-
Для того, чтобы использовать симметричные алгоритмы шифрования, необходимо безопасно обменяться ключами. Протокол Диффи - Хеллмана позволяет двум и более...
-
Введение В настоящем дипломном проекте исследуются вопросы, связанные с генерацией искусственных биометрических образов. Рассматриваются различные...
-
Reset(имя файловой переменной); При этом указатель устанавливается на начало файла и вся информация сохраняется. Чтение из файла выполняется процедурой:...
-
Можливості мобільних додатків давно вийшли за рамки індустрії розваг, і їх використання дозволяє придбати додаткові преференції у сфері бізнес інтересів....
-
Порівнянні і протиставлення мобільних пристроїв і їх додатків з їх настільними і серверними аналогами ми відвели в цьому розділі досить багато місця і...
-
Работа программы представлена на рисунке 2.3 Рис. 2.3 Кодирование и тестирование программы Программа кодировалась на языке Си++, используя библотеку Qt5x...
-
Шифрование и расшифрование, Исходный код - Алгоритм кодировки RSA
Предположим, Боб хочет послать Алисе сообщение. Сообщениями являются целые числа в интервале от до, т. е. Шифрование : - Взять Открытый Ключ Алисы -...
-
Розгалужені алгоритми бувають двох типів: Повні (If...Else) і неповні (If). Неповне розгалуження. If (x > 100) Сout << x << endl; Прикладом...
-
В данной главе приводится описание различных криптографических алгоритмов для безопасной передачи данных в приложении. RSA Для того, чтобы избежать...
-
Програмна реалізація алгоритмів лінійної структури Алгоритм (латинізов. Algorithmi за араб. ім'ям узб. математека аль-Хороезмі) -- набір інструкцій, які...
-
Электронная цифровая подпись (ЭЦП) - одна из криптографических систем зашиты контроля и подлинности информации. Значение ЭЦП усилилось при передаче...
-
До цього моменту було розглянуто одновимірні масиви, якими не завжди можна обмежитися. Припустимо, необхідно обробити деякі дані з таблиці. У таблиці є...
-
Одновимірний масив - це масив, з одним параметром, що характеризує кількість елементів одновимірного масиву. Фактично одновимірний масив - це масив, у...
Програмний код для алгоритму ЕЦП ЕЦП DSS/DSА - Розробка електронного цифрового підпису