Скачиваний:
4
Добавлен:
22.03.2025
Размер:
402.97 Кб
Скачать

Министерство науки и высшего образования Российской Федерации Федеральное государственное автономное образовательное учреждение высшего образования

ТОМСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ СИСТЕМ УПРАВЛЕНИЯ И РАДИОЭЛЕКТРОНИКИ (ТУСУР)

Кафедра комплексной информационной безопасности электронно-вычислительных систем (КИБЭВС)

ШИФРОВАНИЕ ДАННЫХ С ПОМОЩЬЮ ETOKEN

Отчет по лабораторной работе №6

по дисциплине «Программно-аппаратные средства защиты информации»

Студент гр. 731-2

__________

Руководитель

Преподаватель каф. КИБЭВС

__________

Введение

Цель работы: ознакомиться с типами шифрования и механизмами, обеспечивающими генерацию ключей eToken, научиться осуществлять шифрование и расшифровывание данных с помощью eToken.

1 Ход работы

Первоочередно были созданы два файла согласно методическим указаниям: один менее 128 байт, другой более, что представлено на рисунке 1.1.

Рисунок 1.1 – Создание файлов с данными

Далее был добавлен метод, который генерировал сессионный ключ, что представлено на рисунке 1.2.

Рисунок 1.2 – Функция генерации сессионного ключа

Далее была описана часть функции main в которой происходит открытие сессии, логи, чтение файла и создание сессионного ключа, что представлено на рисунке 1.3.

Рисунок 1.3 – Первая часть функции main

Далее была описана часть функции main в которой происходит приведение длины данных к необходимой длине и их шифрование, что представлено на рисунке 1.4.

Рисунок 1.4 – Вторая часть функции main с шифрованием

Далее была описана часть функции main в которой происходит вызов функции расшифрования, вывод расшифрованных данных и выход из сессии, что представлено на рисунке 1.5.

Рисунок 1.5 – Третья часть функции main с расшифрованием

Далее были была проверена работоспособность программы на ранее созданных файлах, что представлено на рисунках 1.6 – 1.7.

Рисунок 1.6 – Проверка на файле размером более 128 байт

Рисунок 1.7 – Проверка на файле размером менее 128 байт

Заключение

В ходе выполнения лабораторной работы было произведено ознакомление с типами шифрования и механизмами, обеспечивающими генерацию ключей eToken, и получены навыки осуществлять шифрование и расшифровывание данных с помощью eToken.

Приложение 1

#include "stdlib.h"

#include "stdio.h"

#include "include\eTPkcs11.h"

#include <windows.h>

#include <iostream>

#include "fstream"

using namespace std;

void init();

void leave(const char*);

CK_FUNCTION_LIST_PTR pFunctionList=NULL;

CK_C_GetFunctionList pGFL = 0;

bool

wasInit = false;

void init()

{

HINSTANCE hLib = LoadLibraryA("etpkcs11.DLL");

if (hLib == NULL)

{

leave ("Cannot load DLL.");

}

(FARPROC&)pGFL= GetProcAddress(hLib, "C_GetFunctionList");

if (pGFL == NULL)

{

leave ("Cannot find GetFunctionList().");

}

if (CKR_OK != pGFL(&pFunctionList))

{

leave ("Can't get function list. \n");

}

if (CKR_OK != pFunctionList->C_Initialize (0))

{

leave ("C_Initialize failed...\n");

}

wasInit = true;

}

static void leave(const char * message)

{

if (message) printf("%s ", message);

if(wasInit)

{

if (CKR_OK != pFunctionList->C_Finalize(0))

{

printf ("C_Finalize failed...\n");

}

wasInit = false;

}

exit(message ? -1 : 0 );

}

static CK_ULONG GetFirstSlotId( )

{

CK_ULONG slotID = -1;

CK_ULONG ulCount = 0;

CK_SLOT_ID_PTR pSlotIDs = NULL_PTR;

CK_ULONG i;

if (pFunctionList->C_GetSlotList(TRUE,NULL_PTR,&ulCount) ==

CKR_OK)

{

if (ulCount > 0)

{

pSlotIDs = new CK_SLOT_ID[ulCount];

if ((pFunctionList->C_GetSlotList(TRUE,pSlotIDs,&ulCount))

== CKR_OK)

{

for (i=0;i < ulCount;i++)

{

CK_SLOT_INFO info;

if ((pFunctionList->C_GetSlotInfo(pSlotIDs[i],&info)) == CKR_OK)

{

if (info.flags & (CKF_HW_SLOT ||CKF_TOKEN_PRESENT))

{

slotID = pSlotIDs[i];

break;

}

}

}

}

}

}

if (pSlotIDs)

{

delete[] pSlotIDs;

pSlotIDs = NULL_PTR;

}

return slotID;

}

static bool ReadDataFromFile(const char* fileName, CK_BYTE_PTR* data, DWORD* dataSize)

{

bool ret = false;

HANDLE file = CreateFileA(fileName, GENERIC_READ, 0, NULL,

OPEN_EXISTING, 0, NULL);

if (file != INVALID_HANDLE_VALUE)

{

DWORD size = GetFileSize(file, NULL);

if (size != INVALID_FILE_SIZE)

{

*data = new BYTE[size];

if (ReadFile(file, *data, size, dataSize, NULL)) {

ret = true;

}

}

CloseHandle(file);

}

return true;

}

static bool SaveDataToFile(const char* fileName, CK_BYTE_PTR* data, DWORD* dataSize)

{

bool ret = true;

HANDLE file = CreateFileA(fileName, GENERIC_WRITE, 0, NULL,

CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);

if (file != INVALID_HANDLE_VALUE)

{

DWORD tmp=0;

if (WriteFile(file, *data, *dataSize, &tmp, NULL))

{

ret = false;

}

CloseHandle(file);

}

return ret;

}

CK_OBJECT_CLASS cko_SecretKey = CKO_SECRET_KEY;

CK_KEY_TYPE ckk_DES3 = CKK_DES3;

CK_BYTE ck_False = FALSE;

CK_MECHANISM ckm_DES3_KEY_GEN = {CKM_DES3_KEY_GEN, NULL, 0};

CK_MECHANISM ckm_DES3 = {CKM_DES3_CBC, NULL, 0};

#define sizeofarray(a) (sizeof(a)/sizeof(a[0]))

CK_OBJECT_HANDLE CreateSessionKey(CK_SESSION_HANDLE hSession)

{

CK_ATTRIBUTE SessionKeyTemplate[] =

{

{ CKA_CLASS, &cko_SecretKey, sizeof(cko_SecretKey)},

{ CKA_KEY_TYPE, &ckk_DES3, sizeof(ckk_DES3)},

{ CKA_TOKEN, &ck_False, sizeof(ck_False)}

};

CK_OBJECT_HANDLE hSessionKey = NULL;

int rv = pFunctionList->C_GenerateKey(

hSession,

&ckm_DES3_KEY_GEN,

SessionKeyTemplate,

sizeofarray(SessionKeyTemplate),&hSessionKey);

if (rv!=CKR_OK) leave("Ошибка генерации секртеного ключа");

return hSessionKey;

}

int main()

{

init();

//char path[100];

//char path[100] = "D:\\2.txt";

char path[100] = "D:\\1.txt";

char pass[20];

printf("Path to file: ");

//gets(path);

printf("\nPIN-code: ");

gets(pass);

CK_ULONG slotID = GetFirstSlotId();

if (slotID == -1)

{

leave("Token unconnected");

}

CK_SESSION_HANDLE hSession;

CK_OBJECT_HANDLE hKey;

CK_BYTE_PTR file = NULL;

DWORD fileSize;

if (pFunctionList->C_OpenSession( slotID, CKF_SERIAL_SESSION | CKF_RW_SESSION, NULL, NULL, &hSession) != CKR_OK)

{

leave("Cant run the session");

}

if (pFunctionList->C_Login(hSession, CKU_USER, (LPBYTE)pass, strlen(pass)) != CKR_OK)

{

leave("Error login");

}

if (!ReadDataFromFile(path, &file, &fileSize))

{

leave("Error reading file");

}

hKey = CreateSessionKey(hSession);

printf("Session key: %d \n", hKey);

const size_t blockSize = 128;

DWORD encrSize = (fileSize % 128 != 0) ? ((fileSize / 128) + 1) * 128 : fileSize;

DWORD numberofBlocks = encrSize / blockSize;

CK_BYTE_PTR pEncryptedData = new byte[encrSize]();

CK_BYTE_PTR pDecrData = new byte[encrSize]();

CK_ULONG EncrLen = encrSize, DecrLen = encrSize;

CK_BYTE_PTR buffer = new byte[blockSize]();

CK_BYTE_PTR bufferEncryptedData = new byte[blockSize]();

CK_RV rv = 0;

rv = pFunctionList->C_EncryptInit(hSession, &ckm_DES3, hKey);

for (int i = 0; i < numberofBlocks; i++)

{

int tmpblockSize = (i == numberofBlocks - 1) ? fileSize % blockSize : blockSize;

memcpy(buffer, &file[i * blockSize], tmpblockSize);

pFunctionList->C_EncryptUpdate(hSession, buffer, blockSize, bufferEncryptedData, &EncrLen);

if (i == numberofBlocks - 1)

{

pFunctionList->C_EncryptFinal(hSession, bufferEncryptedData, &EncrLen);

}

memcpy(&pEncryptedData[i * blockSize], bufferEncryptedData, blockSize);

}

printf("\nEncrypted data: \n");

for (int i = 0; i < encrSize; i++) printf("%c", pEncryptedData[i]);

rv = pFunctionList->C_DecryptInit(hSession, &ckm_DES3, hKey);

for (int i = 0; i < numberofBlocks; i++)

{

memcpy(bufferEncryptedData, &pEncryptedData[i * blockSize], blockSize);

rv = pFunctionList->C_DecryptUpdate(hSession, bufferEncryptedData, blockSize, buffer, &DecrLen);

if (i == numberofBlocks - 1)

{

pFunctionList->C_DecryptFinal(hSession, buffer, &DecrLen);

}

memcpy(&pDecrData[i * blockSize], buffer, blockSize);

}

pDecrData[fileSize] = '\0'; // Добавляем терминатор строки

printf("\nDecrypted Data: \n%s\n", pDecrData);

pFunctionList->C_Logout(hSession);

pFunctionList->C_CloseSession(hSession);

delete[] buffer;

delete[] bufferEncryptedData;

delete[] pEncryptedData;

delete[] pDecrData;

leave(NULL);

return 0;

}

Томск 2025

Соседние файлы в предмете Программно-аппаратные средства защиты информации