Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Лаба 2 ПАСЗИ

.docx
Скачиваний:
26
Добавлен:
01.06.2015
Размер:
32.68 Кб
Скачать

МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ

ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ АВТОНОМНОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ

ВЫСШЕГО ОБРАЗОВАНИЯ

«ЮЖНЫЙ ФЕДЕРАЛЬНЫЙ УНИВЕРСИТЕТ»

Лабораторная работа №2 по курсу ПАСЗИ:

Изучение аппаратных методов защиты информации с помощью смарт-карт e-Token PRO

Выполнили:

Ст.гр.КТсо4-2

Богданов К.И.

Доценко С.Е.

Принял:

асс. каф. БИТ, ИКТИБ ЮФУ

Маро Екатерина Александровна

Таганрог 2014 г.

Цель работы. Изучение основных возможностей защиты информации с помощью смарт-карт; применение методов криптографической защиты информации на примере смарт-карт e-Token PRO на практике; изучение области применяемости смарт-карт в России и в международной практике, оценке стойкости различных типов смарт-карт, возможных способах атак на контактные и бесконтактные смарт-карты.

  1. Описание используемых в лабораторной работе функций eToken Pro.

  1. Получить список доступных функций (GetFunctionList).

  2. Выполнить инициализацию PKCS # 11 библиотеки (C_Initialize).

  3. Получить список имеющихся слотов (C_GetSlotList).

  4. Получить информацию о слоте (C_GetSlotInfo).

  5. Получите информацию о токене (C_GetTokenInfo()).

  6. Отобразить информацию о токене (см. определение CK_TOKEN_INFO для получения дополнительных сведений).

  7. Открыть сессию работы с токеном (C_OpenSession)

  8. Произвести авторизацию с пользовательским уровнем доступа (C_Login, PIN 1234567890).

  9. Инициализировать параметры шифрования и генерации ключа.

  10. 10.Сгенерировать ключ шифрования (C_GenerateKey).

  11. Инициализировать процедуру шифрования (C_EncryptInit) и зашифровать произвольный буфер с информацией (какой-либо строкой) с помощью функций e-Token PRO (C_Encrypt).

  12. Проверить корректность выполненного шифрования (расшифровать данные) (C_DecryptInit, C_Decrypt).

  13. Разлогиниться и закрыть сессию (C_Logout, C_CloseSession).

  1. Листинг кода.

#include "stdafx.h"

#include "stdlib.h"

#include "stdio.h"

#include <windows.h>

#include <conio.h>

#include "eTPkcs11.h"

#include "cryptoki.h"

#include <vector>

#include <iostream>

#include <cstdio>

#include <cstdlib>

#include <assert.h>

using namespace std;

CK_RV rv;

CK_FUNCTION_LIST_PTR pFunctionList;

CK_C_GetFunctionList pGFL = 0;

CK_INFO info;

CK_SLOT_ID_PTR pSlotList;

CK_ULONG pulCount=0;

CK_SLOT_INFO InfoSlot;

CK_TOKEN_INFO InfoToken;

CK_FLAGS flags=CKF_SERIAL_SESSION | CKF_RW_SESSION;

CK_VOID_PTR Application;

CK_SESSION_HANDLE Session;

CK_UTF8CHAR pin[]={"1234567890"};

CK_OBJECT_HANDLE hKey=0;

int _tmain(int argc, _TCHAR* argv[])

{

//загрузка PKCS#11 библиотеки

HINSTANCE hLib = LoadLibrary(TEXT("etpkcs11.DLL"));

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

if (hLib == NULL || pGFL == NULL || pGFL(&pFunctionList) != CKR_OK)

{

cout << "Something wrong!" << endl;

return 0;

}

else

{

cout << "Everything correct!" << endl;

}

//Инициализация токена

rv = pFunctionList -> C_Initialize (NULL_PTR);

if (rv!=CKR_OK)

{

cout << "ERROR of initialization!" << endl;

return 0;

}

// Получение информации о PKCS # 11 библиотеке

rv = pFunctionList -> C_GetInfo(&info);

if (rv!=CKR_OK)

{

cout << "ERROR of GetInfo!" << endl;

return 0;

}

printf ("Version %d. %d \n", (info).cryptokiVersion.major, (info).cryptokiVersion.minor);

cout << "Manufacturer ID: ";

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

{

printf ("%c",(info).manufacturerID[i]);

}

cout << "\n\n";

//Получение информации о всех слотах

rv=pFunctionList->C_GetSlotList(CK_FALSE, NULL_PTR, &pulCount);

if (rv!=CKR_OK)

{

cout << "ERROR of GetSlotList!" << endl;

}

else

{

cout << "GetSlotList correst!" << endl;

}

cout << "Number of slots " << pulCount << endl;

//Получение информации о слоте c токеном и её вывод

CK_ULONG slotCount=0;

pSlotList = (CK_SLOT_ID_PTR) malloc(slotCount*sizeof(CK_SLOT_ID));

rv = pFunctionList -> C_GetSlotList(CK_TRUE, pSlotList, &pulCount);

if (rv!=CKR_OK)

{

cout << "ERROR of GetSlotList with token!" << endl;

return 0;

}

if (pulCount == 0)

{

cout << "Slots with tokens not found!";

}

if (pulCount >= 1)

{

cout << "Number of slots with token is " << pulCount << endl;

cout << "Slot number with token " << *pSlotList << endl;

}

rv = pFunctionList -> C_GetSlotInfo(*pSlotList, &InfoSlot);

if (rv!=CKR_OK)

{

cout << "ERROR of getting info about slot with token!" << endl;

return 0;

}

cout << "\nInfo about slot\nDescription:" << endl;

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

{

printf ("%c",(InfoSlot).slotDescription[i]);

}

cout << "\nManufacturer ID:" << endl;

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

{

printf ("%c",(InfoSlot).manufacturerID[i]);

}

cout << "\n" << endl;

//Получение информации о токене и её вывод.

rv = pFunctionList -> C_GetTokenInfo(*pSlotList, &InfoToken);

if (rv != CKR_OK)

{

cout << "Error getting token info!" << endl;

return 0;

}

cout << "Token's name: " << endl;

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

{

printf ("%c",(InfoToken).label[i]);

}

cout << "\nToken's serial number: " ;

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

{

printf ("%c",(InfoToken).serialNumber[i]);

}

cout << "\n";

// Шифрование произвольного буфера с информацией

// Открытие сессии

rv = pFunctionList -> C_OpenSession(*pSlotList, flags, Application, NULL_PTR, &Session);

if (rv != CKR_OK)

{

cout << "Open session ERROR!" << endl;

return 0;

}

rv = pFunctionList -> C_Login(Session, CKU_USER, pin, sizeof(pin)-1);

if (rv != CKR_OK)

{

cout << "Login ERROR!" << endl;

return 0;

}

//Механизмы шифрования

CK_BYTE iv[8] = "87";

CK_MECHANISM mechanism = {CKM_DES_CBC_PAD, iv, sizeof(iv)};

CK_OBJECT_HANDLE hKey=0;

CK_MECHANISM mechKey;

CK_BBOOL token = FALSE;

CK_BBOOL isPrivate = TRUE;

CK_BBOOL derive = FALSE;

CK_BBOOL sensitive = FALSE;

CK_BBOOL encrypt = TRUE;

CK_BBOOL decrypt = TRUE;

CK_BBOOL sign = FALSE;

CK_BBOOL verify = FALSE;

CK_BBOOL wrap = FALSE;

CK_BBOOL unwrap = FALSE;

CK_BYTE id[] = {1};

CK_CHAR label[] = "test";

CK_DATE startDate;

CK_DATE endDate;

// Генерация ключей

mechKey.mechanism=CKM_DES_KEY_GEN;

memcpy(startDate.year, "2014", 4);

memcpy(startDate.month, "10", 2);

memcpy(startDate.day, "18", 2);

memcpy(endDate.year, "2014", 4);

memcpy(endDate.month, "12", 2);

memcpy(endDate.day, "31", 2);

CK_ATTRIBUTE keyTemplate[] =

{{CKA_TOKEN, &token, sizeof(token)},

{CKA_PRIVATE, &isPrivate, sizeof(isPrivate)},

{CKA_LABEL, label, sizeof(label)},

{CKA_ID, id, sizeof(id)},

{CKA_START_DATE, &startDate, sizeof(startDate)},

{CKA_END_DATE, &endDate, sizeof(endDate)},

{CKA_DERIVE, &derive, sizeof(derive)},

{CKA_SENSITIVE, &sensitive, sizeof(sensitive)},

{CKA_ENCRYPT, &encrypt, sizeof(encrypt)},

{CKA_DECRYPT, &decrypt, sizeof(decrypt)},

{CKA_SIGN, &sign, sizeof(sign)},

{CKA_VERIFY, &verify, sizeof(verify)},

{CKA_WRAP, &wrap, sizeof(wrap)},

{CKA_UNWRAP, &unwrap, sizeof(unwrap)},};

CK_ULONG keyTemplateCount = sizeof(keyTemplate) / sizeof(CK_ATTRIBUTE);

// Генерация ключа шифрования

rv=pFunctionList->C_GenerateKey(Session, &mechKey, keyTemplate, keyTemplateCount, &hKey);

if (rv!=CKR_OK)

{

cout << "ERROR of key generation" << endl;

return 0;

}

// Инициализация шифрования

rv = pFunctionList -> C_EncryptInit(Session, &mechanism, hKey);

if (rv != CKR_OK)

{

cout << "ERROR init encrypt" << endl;

return 0;

}

// Шифрование

CK_BYTE *Data=new CK_BYTE[256];// информация для шифрования

memset(Data, 1, 256);

CK_BYTE *outData= new CK_BYTE[256];

memset(outData, 1, 256);

CK_ULONG EncryptedDataLen;

rv = pFunctionList -> C_Encrypt(Session, Data, sizeof(Data), outData, &EncryptedDataLen);

printf ("Data for crypt %d \n", *Data);

printf ("Cryptodata %d \n", *outData);

rv = pFunctionList -> C_DecryptInit(Session, &mechanism, hKey);

if (rv != CKR_OK)

{

cout << "ERROR init decrypt" << endl;

return 0;

}

rv = pFunctionList -> C_Decrypt(Session, outData, EncryptedDataLen, outData, &EncryptedDataLen);

if (rv != CKR_OK)

{

cout << "ERROR decrypt" << endl;

return 0;

}

printf ("Result of crypt %d \n",*outData);

// завершение login

rv = pFunctionList -> C_Logout(Session);

rv = pFunctionList -> C_CloseSession(Session);

// Завершение работы с токеном

rv = pFunctionList -> C_Finalize (NULL_PTR);

cout << "GOODBYE!" << endl;

getchar();

return 0;

}