Вычисления хэш значения данных


Download 22.66 Kb.
Sana28.02.2023
Hajmi22.66 Kb.
#1236188
TuriЛабораторная работа
Bog'liq
Лаборатория1


Министерство высшего и среднего специального образования Республики Узбекистан
Национальный Университет Узбекистана имени Мирзо Улугбека
Лабораторная работа №1
По предмету: Криптопровайдеры
На тему: Вычисления хэш значения данных
Направление: Информационная безопасность


Проверил: Сайманов И.М.
Выполнил: студент III курса
Захиров Фирдавс

Цель работы: Создание программы вычисления хеш значения данных с помощью криптопровайдера.
Используемые программы: MS Visual Studio, ОС Windows 7 и криптопровайдеры.
Используемые технические средства: Компьютер.
Последовательность выполнение работы:

  1. Создание соединения с криптопровайдером.

  2. Создание хеш объекта.

  3. Получение адрес файла.

  4. Хеширование данных по блокам.

  5. Получение хеш значения.

  6. Освобождение памяти.

  7. Удаление соединения с криптопровайдером.

Результат лаборатории должен оформляться в виде отчета.

Отчет по лаборатории должен состоять из следующих частей:

Содержание:


  1. Теоретическая часть

  2. Последовательность создания программы

  3. Код программы

  4. Вывод

  5. Используемая литература




  1. Теоретическая часть

1) Функция CryptAcquireContext используется для создания дескриптора определенного ключевого контейнера в рамках определенного криптопровайдера. Дескриптор, который возвращает функция, можно применять для вызовов выбранного криптопроваидера.
Функция выполняет две операции. Сначала она пытается найти криптопровайдер с характеристиками, описанными в параметрах dwProvType и pszProvider. Если криптопровайдер найден, то функция пытается найти ключевой контейнер в рамках криптопровайдера в соответстствии с именем, указанным параметром pszContainer.
Эту функцию также используют для создания и уничтожения ключевых контейнеров в зависимости от значения параметра dwFlags.
2)Функция CryptCreateHash используется для инициализации хеширования потока данных. Она создает объект хеш-функции и возвращает приложению его дескриптор , Этот дескриптор используется при вызовах функций CryptHashData и CryptHashSessionKey для хеширования потока данных и сессионных ключей.
3) Функция CryptHashData используется для добавления данных к объекту хеш-функции. Ее и функцию CryptHashSessionКеу можно вызывать многократно при вычислении хеша для данных разбитых на блоки.
Перед вызовом этой функции следует вызвать функцию CryptCreateHash получения дескриптора объекта хеш-функции.
4)Функция CryptGetHashParam возвращает параметры объекта хеш-функции. Через эту функцию можно получить фактическое значение хеша.


2. Последовательность создание программы
Сначала объявили переменные, потом мы подключились через функцию CryptAcquireContext() к криптопровайдеру. Затем создали хеш объект используя CryptCreateHash(), ввели адрес файла и по блочно считали и захешировали данные с помощью CryptHashData(). Далее мы узнали длину хеш значения и выделили память под него. Используя функцию CryptGetHashParam() мы записали хеш значение в выделенную память и вывели его. В конце освободили память.


3.Исходный код
#include
#include
#include
#include
#include
#include
#include
using namespace std;
#define MY_ENCODING_TYPE (PKCS_7_ASN_ENCODING | X509_ASN_ENCODING)
void HandleError(char *s);
FILE *FILE_IN,*FILE_OUT;

int main()


{
HCRYPTPROV hProv; // Handle for the
HCRYPTHASH hHash; // Handle for the

char address[128];


if (CryptAcquireContext(&hProv, NULL, NULL, PROV_RSA_FULL, NULL))
{
printf("CSP context acquired \n");
}
else
{
HandleError("Error during CryptAcquireContext");
}
if (CryptCreateHash(hProv, CALG_SHA1, NULL, NULL, &hHash))
{
printf("Hash object created \n");
}
else
{
HandleError("Error during CryptCreateHash");
}

printf("Enter address file \n");


cin>>address;
BYTE s[20];
FILE_IN=freopen(address,"r",stdin);
int sz;
do
{
sz=fread(s,1,20,FILE_IN);

if (CryptHashData(hHash, s, sz, NULL))


{
printf("The data buffer has been hashed \n");
}
else
{
HandleError("Error during CryptHashData \n");
}
}
while(sz==20);

DWORD pwdDataLen;


if(CryptGetHashParam(hHash,HP_HASHVAL,NULL,&pwdDataLen,NULL))
{
printf("All ok\n");
}
else
{
HandleError("Error");
}
BYTE *pbHash = (BYTE*)malloc(pwdDataLen);
if (!pbHash)HandleError("Out of memory \n");
CryptGetHashParam(hHash,HP_HASHVAL,pbHash,&pwdDataLen,NULL);
for (int i = 0; i < pwdDataLen; i++)
{
printf("%2.2x", pbHash[i]);
}

if (pbHash) free(pbHash);
if (hHash) CryptDestroyHash(hHash);
if (hProv) CryptReleaseContext(hProv, NULL);

}


void HandleError(char *s)
{
printf("An error occurred in running the program.\n");
printf("%s\n", s);
printf("Error number %x\n.", GetLastError());
printf("Program terminating.\n");
exit(1);
}

4. Вывод
Выполнив эту лабораторную работу мы ознакомились с хеш функциями и хеш значениями и узнали для чего они нужны. Хеш функция – это инъективная функция, которая возвращает данные фиксированной длины и также в качестве аргументов задает любое количество битов. Хеш значение – это значение хеш функции. В данной лабораторной работе мы хешировали по-блочно данные с помощью алгоритма хеширования SHA1.


5.Используемая литература
А. Щербаков, А. Домашев. Использование и синтез криптографических интерфейсов

Download 22.66 Kb.

Do'stlaringiz bilan baham:




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling