Лаба 2 ПАСЗИ
.docxМИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ
ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ АВТОНОМНОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ
ВЫСШЕГО ОБРАЗОВАНИЯ
«ЮЖНЫЙ ФЕДЕРАЛЬНЫЙ УНИВЕРСИТЕТ»
Лабораторная работа №2 по курсу ПАСЗИ:
Изучение аппаратных методов защиты информации с помощью смарт-карт e-Token PRO
Выполнили:
Ст.гр.КТсо4-2
Богданов К.И.
Доценко С.Е.
Принял:
асс. каф. БИТ, ИКТИБ ЮФУ
Маро Екатерина Александровна
Таганрог 2014 г.
Цель работы. Изучение основных возможностей защиты информации с помощью смарт-карт; применение методов криптографической защиты информации на примере смарт-карт e-Token PRO на практике; изучение области применяемости смарт-карт в России и в международной практике, оценке стойкости различных типов смарт-карт, возможных способах атак на контактные и бесконтактные смарт-карты.
-
Описание используемых в лабораторной работе функций eToken Pro.
-
Получить список доступных функций (GetFunctionList).
-
Выполнить инициализацию PKCS # 11 библиотеки (C_Initialize).
-
Получить список имеющихся слотов (C_GetSlotList).
-
Получить информацию о слоте (C_GetSlotInfo).
-
Получите информацию о токене (C_GetTokenInfo()).
-
Отобразить информацию о токене (см. определение CK_TOKEN_INFO для получения дополнительных сведений).
-
Открыть сессию работы с токеном (C_OpenSession)
-
Произвести авторизацию с пользовательским уровнем доступа (C_Login, PIN 1234567890).
-
Инициализировать параметры шифрования и генерации ключа.
-
10.Сгенерировать ключ шифрования (C_GenerateKey).
-
Инициализировать процедуру шифрования (C_EncryptInit) и зашифровать произвольный буфер с информацией (какой-либо строкой) с помощью функций e-Token PRO (C_Encrypt).
-
Проверить корректность выполненного шифрования (расшифровать данные) (C_DecryptInit, C_Decrypt).
-
Разлогиниться и закрыть сессию (C_Logout, C_CloseSession).
-
Листинг кода.
#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;
}