Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
защита данных / Лабораторная работа №3.doc
Скачиваний:
46
Добавлен:
31.03.2015
Размер:
199.68 Кб
Скачать

Рекомендуемые для разработки программы средства языка Object Pascal

  1. Сбор информации о компьютере:

// получение в буфере lpBuffer длины nSize имени пользователя текущего сеанса

function GetUserName(lpBuffer: PChar; var nSize: DWORD): BOOL;

{ получение имени компьютера в буфере lpBuffer длины nSize>= MAX_COMPUTERNAME_LENGTH+1 }

function GetComputerName(lpBuffer: PChar; var nSize: DWORD): BOOL;

{ получение в буфере lpBuffer длины uSize >= MAX_PATH пути к каталогу с ОС Windows }

function GetWindowsDirectory(lpBuffer: PChar; uSize: UINT): UINT;

{ получение в буфере lpBuffer длины uSize >= MAX_PATH пути к системному каталогу Windows }

function GetSystemDirectory(lpBuffer: PChar; uSize: UINT): UINT;

// получение типа (nTypeFlag=0) или подтипа (nTypeFlag=1) клавиатуры

function GetKeyboardType(nTypeFlag: Integer): Integer;

{ получение количества кнопок мыши (nIndex=SM_CMOUSEBUTTONS), ширины (nIndex=SM_CXSCREEN) или высоты (nIndex=SM_CYSCREEN) экрана }

function GetSystemMetrics(nIndex: Integer): Integer;

{ получение в буфере lpBuffer длины nBufferLength строки с корневыми каталогами всех дисков, разделенных 0-символами; результат – длина полученной строки без заключительного 0-символа }

function GetLogicalDriveStrings(nBufferLength: DWORD; lpBuffer: PAnsiChar): DWORD;

{ получение в буфере *lpBuffer структуры типа MEMORYSTATUS с характеристиками памяти компьютера (поле dwTotalPhys содержит целое число, равное общему объему физической памяти в байтах) }

procedure GlobalMemoryStatus(var lpBuffer: TMemoryStatus);

{ получение информации об объеме текущего диска (lpRootPathName=NULL): количестве секторов в кластере (lpSectorsPerCluster), размере сектора (lpBytesPerSector), общем количестве кластеров (lpTotalNumberOfClusters), lpNumberOfFreeClusters=NULL }

function GetDiskFreeSpace(lpRootPathName: PChar; var lpSectorsPerCluster, lpBytesPerSector, lpNumberOfFreeClusters, lpTotalNumberOfClusters: DWORD): BOOL;

{ получение информации о текущем диске (lpRootPathName=NULL): метке тома (в буфере lpVolumeNameBuffer длины nVolumeNameSize), серийном номере (в переменной lpVolumeSerialNumber), файловой системе (в буфере lpFileSystemNameBuffer длины nFileSystemNameSize), lpMaximumComponentLength=NULL, lpFileSystemFlags=NULL }

function GetVolumeInformation(lpRootPathName: PChar;

lpVolumeNameBuffer: PChar; nVolumeNameSize: DWORD; lpVolumeSerialNumber: PDWORD; var lpMaximumComponentLength, lpFileSystemFlags: DWORD; lpFileSystemNameBuffer: PChar; nFileSystemNameSize: DWORD): BOOL;

  1. Получение и проверка электронной цифровой подписи (ЭЦП) (константы, типы данных и прототипы функций определены в файле wincrypt.pas):

THandle – тип данных для дескрипторов криптопровайдера, криптографического ключа, хеш-объекта

ALG_ID – тип данных для кодов криптографических алгоритмов

{ инициализация криптопровайдера: в *phProv записывается его дескриптор,

pszContainer=NULL, pszProvider=NULL, dwProvType=PROV_RSA_FULL,

dwFlags=0 или (если при первом запуске программы CryptAcquireContext возвращает FALSE) регистрация нового пользователя в криптопровайдере dwFlags= CRYPT_NEWKEYSET }

function CryptAcquireContext(var hProv:THandle;pszContainer,pszProvider:PChar;

dwProvType,dwFlags:Longint):Longbool;

{ создание в криптопровайдере с дескриптором hProv пары ключей ЭЦП (Algid=AT_SIGNATURE, dwFlags=0) и запись дескриптора открытого ключа в *phKey }

function CryptGenKey(hProv:THandle; Algid:ALG_ID; dwFlags:Longint; var phKey:THandle):Longbool;

{ получение у криптопровайдера с дескриптором hProv дескриптора открытого ключа ЭЦП (dwKeySpec=AT_SIGNATURE) в переменной *phUserKey (если функция возвращает FALSE, то пару ключей ЭЦП нужно создать с помощью функции CryptGenKey) }

function CryptGetUserKey(hProv:THandle; dwKeySpec:Longint; var phUserKey:THandle):Longbool;

{ создание пустого хеш-объекта (hProv – дескриптор инициализированного криптопровайдера, Algid – код алгоритма хеширования, hKey=0, dwFlags=0, в *phHash записывается дескриптор хеш-объекта) }

function CryptCreateHash(hProv:THandle; Algid:ALG_ID; hKey:THandle; dwFlags:Longint; var hHash:THandle):Longbool;

{ добавление в хеш-объект данных из буфера *pbData длины dwDataLen (hHash – дескриптор хеш-объекта, dwFlags=0) }

function CryptHashData(hHash:THandle; pbData:Pointer; dwDataLen,dwFlags: Longint): Longbool;

{ получение для хеш-объекта с дескриптором hHash ЭЦП в буфере pbSignature длины *pdwSigLen (после выполнения функции в эту переменную записывается фактическая длина ЭЦП); dwKeySpec=AT_SIGNATURE, sDescription=NULL, dwFlags=0 }

function CryptSignHash(hHash:THandle; dwKeySpec:Longint; sDescription:PChar; dwFlags:Longint; pbSignature: Pointer; var pdwSigLen: Longint): Longbool;

{ проверка ЭЦП из буфера *pbSignature длины dwSigLen для хеш-объекта с дескриптором hHash с помощью открытого ключа hPubKey (sDescription=NULL, dwFlags=0) }

function CryptVerifySignature(hHash:THandle; pbSignature:Pointer; dwSigLen:Longint; hPubKey:THandle; sDescription:PChar; dwFlags:Longint): Longbool;

// разрушение хеш-объекта с дескриптором hHash

function CryptDestroyHash(hHash:THandle):Longbool;

// разрушение ключа шифрования с дескриптором hKey

function CryptDestroyKey(hKey:THandle):Longbool;

// освобождение криптопровайдера с дескриптором hProv (dwFlags=0)

function CryptReleaseContext(hProv:THandle;dwFlags:Longint):Longbool;

  1. Работа с реестром Windows:

Класс TRegistry (определен в модуле registry):

  • конструктор без параметров;

  • свойства:

RootKey: HKEY (корневой раздел реестра, по умолчанию HKEY_CURRENT_USER);

CurrentKey: HKEY(текущий раздел реестра, только для чтения);

CurrentPath: string(путь к текущему разделу реестра, только для чтения).

  • методы:

{ открытие или (если CanCreate=true) при необходимости создание текущего раздела реестра Key }

function OpenKey(const Key: string; CanCreate: Boolean): Boolean;

{ запись (перезапись) в текущий раздел реестра значения параметра Name из буфера Buffer длины BufSize }

procedure WriteBinaryData(const Name: string; var Buffer; BufSize: Integer);

// запись и закрытие текущего раздела реестра

procedure CloseKey;

// проверка существования в реестре раздела Key

function KeyExists(const Key: string): Boolean;

{ чтение из текущего раздела реестра значения параметра Name в буфер Buffer длины BufSize }

function ReadBinaryData(const Name: string; var Buffer; BufSize: Integer): Integer;

  1. Отображение системного диалога для выбора папки (при установке программы) и получение полного пути к выбранной пользователем папке. Требуется подключение модуля Shlobj.

{ отображение системного диалога; структура lpbi содержит информацию для настройки диалога: функция возвращает указатель на созданный элемент, хранящий размещение выбранной пользователем папки; при отказе пользователя от выбора функция возвращает NULL }

function SHBrowseForFolder(var lpbi: TBrowseInfo): PItemIDList;

{ преобразование размещения папки pidl, полученного с помощью функции SHBrowseForFolder, в полный путь к этой паке в буфере pszPath длиной не менее MAX_PATH байт }

function SHGetPathFromIDList(pidl: PItemIDList; pszPath: PChar): BOOL;

{ освобождение памяти, выделенной при выполнении функции SHBrowseForFolder, указатель на которую данная функция возвратила в качестве результата }

function LocalFree(hMem: HLOCAL): HLOCAL;

Рекомендуемые для разработки программы средства языка Си++ и систем C++ Builder и Visual C++

  1. Сбор информации о компьютере:

// получение в буфере lpBuffer длины nSize имени пользователя текущего сеанса

BOOL GetUserName(LPTSTR lpBuffer, LPDWORD nSize);

/* получение имени компьютера в буфере lpBuffer длины nSize>= MAX_COMPUTERNAME_LENGTH+1 */

BOOL GetComputerName(LPTSTR lpBuffer, LPDWORD nSize);

/* получение в буфере lpBuffer длины uSize >= MAX_PATH пути к каталогу с ОС Windows */

UINT GetWindowsDirectory(LPTSTR lpBuffer,UINT uSize);

/* получение в буфере lpBuffer длины uSize >= MAX_PATH пути к системному каталогу Windows */

UINT GetSystemDirectory(LPTSTR lpBuffer, UINT uSize);

// получение типа (nTypeFlag=0) или подтипа (nTypeFlag=1) клавиатуры

int GetKeyboardType(int nTypeFlag);

/* получение количества кнопок мыши (nIndex=SM_CMOUSEBUTTONS), ширины (nIndex=SM_CXSCREEN) или высоты (nIndex=SM_CYSCREEN) экрана */

int GetSystemMetrics(int nIndex);

/* получение в буфере lpBuffer длины nBufferLength строки с корневыми каталогами всех дисков, разделенных 0-символами; результат – длина полученной строки без заключительного 0-символа */

DWORD GetLogicalDriveStrings(DWORD nBufferLength, LPTSTR lpBuffer);

/* получение в буфере *lpBuffer структуры типа MEMORYSTATUS с характеристиками памяти компьютера (поле dwTotalPhys содержит целое число, равное общему объему физической памяти в байтах) */

VOID GlobalMemoryStatus(LPMEMORYSTATUS lpBuffer);

/* получение информации об объеме текущего диска (lpRootPathName=NULL): количестве секторов в кластере (lpSectorsPerCluster), размере сектора (lpBytesPerSector), общем количестве кластеров (lpTotalNumberOfClusters), lpNumberOfFreeClusters=NULL */

BOOL GetDiskFreeSpace(LPCTSTR lpRootPathName, LPDWORD lpSectorsPerCluster, LPDWORD lpBytesPerSector, LPDWORD lpNumberOfFreeClusters, LPDWORD lpTotalNumberOfClusters);

/* получение информации о текущем диске (lpRootPathName=NULL): метке тома (в буфере lpVolumeNameBuffer длины nVolumeNameSize), серийном номере (в переменной *lpVolumeSerialNumber), файловой системе (в буфере lpFileSystemNameBuffer длины nFileSystemNameSize), lpMaximumComponentLength=NULL, lpFileSystemFlags=NULL */

BOOL GetVolumeInformation(LPCTSTR lpRootPathName, LPTSTR lpVolumeNameBuffer, DWORD nVolumeNameSize, LPDWORD lpVolumeSerialNumber, LPDWORD lpMaximumComponentLength, LPDWORD lpFileSystemFlags, LPTSTR lpFileSystemNameBuffer, DWORD nFileSystemNameSize);

  1. Получение и проверка электронной цифровой подписи (ЭЦП) (константы, типы данных и прототипы функций определены в файле wincrypt.h):

HCRYPTPROV, HCRYPTKEY, HCRYPTHASH – типы данных для дескрипторов криптопровайдера (CSP), криптографического ключа, хеш-объекта

ALG_ID – тип данных для кодов криптографических алгоритмов

/* инициализация криптопровайдера: в *phProv записывается его дескриптор,

pszContainer=NULL, pszProvider=NULL, dwProvType=PROV_RSA_FULL,

dwFlags=0 или (если при первом запуске программы CryptAcquireContext возвращает FALSE) регистрация нового пользователя в криптопровайдере dwFlags= CRYPT_NEWKEYSET */

BOOL CryptAcquireContext(HCRYPTPROV *phProv, LPCSTR pszContainer,

LPCSTR pszProvider, DWORD dwProvType, DWORD dwFlags);

/* создание в криптопровайдере с дескриптором hProv пары ключей ЭЦП (Algid=AT_SIGNATURE, dwFlags=0) и запись дескриптора открытого ключа в *phKey */

BOOL CryptGenKey(HCRYPTPROV hProv, ALG_ID Algid,

DWORD dwFlags, HCRYPTKEY *phKey);

/* получение у криптопровайдера с дескриптором hProv дескриптора открытого ключа ЭЦП (dwKeySpec=AT_SIGNATURE) в переменной *phUserKey (если функция возвращает FALSE, то пару ключей ЭЦП нужно создать с помощью функции CryptGenKey) */

BOOL CryptGetUserKey(HCRYPTPROV hProv, DWORD dwKeySpec,

HCRYPTKEY *phUserKey);

/* создание пустого хеш-объекта (hProv – дескриптор инициализированного криптопровайдера, Algid – код алгоритма хеширования, hKey=0, dwFlags=0, в *phHash записывается дескриптор хеш-объекта) */

BOOL CryptCreateHash(HCRYPTPROV hProv, ALG_ID Algid,

HCRYPTKEY hKey, DWORD dwFlags, HCRYPTHASH *phHash);

/* добавление в хеш-объект данных из буфера *pbData длины dwDataLen (hHash – дескриптор хеш-объекта, dwFlags=0) */

BOOL CryptHashData(HCRYPTHASH hHash, CONST BYTE *pbData,

DWORD dwDataLen, DWORD dwFlags);

/* получение для хеш-объекта с дескриптором hHash ЭЦП в буфере pbSignature длины *pdwSigLen (после выполнения функции в эту переменную записывается фактическая длина ЭЦП); dwKeySpec=AT_SIGNATURE, sDescription=NULL, dwFlags=0 */

BOOL CryptSignHash(HCRYPTHASH hHash, DWORD dwKeySpec,

LPCTSTR sDescription, DWORD dwFlags, BYTE *pbSignature,

DWORD *pdwSigLen);

/* проверка ЭЦП из буфера *pbSignature длины dwSigLen для хеш-объекта с дескриптором hHash с помощью открытого ключа hPubKey (sDescription=NULL, dwFlags=0) */

BOOL CryptVerifySignature(HCRYPTHASH hHash, BYTE *pbSignature,

DWORD dwSigLen, HCRYPTKEY hPubKey, LPCTSTR sDescription,

DWORD dwFlags);

// разрушение хеш-объекта с дескриптором hHash

BOOL CryptDestroyHash(HCRYPTHASH hHash);

// разрушение ключа шифрования с дескриптором hKey

BOOL CryptDestroyKey(HCRYPTKEY hKey);

// освобождение криптопровайдера с дескриптором hProv (dwFlags=0)

BOOL CryptReleaseContext(HCRYPTPROV hProv, DWORD dwFlags);

  1. Работа с реестром Windows в C++ Builder:

Класс TRegistry (определен в файле vcl\registry.hpp):

  • конструктор без параметров;

  • свойства:

HKEY RootKey (корневой раздел реестра, по умолчанию HKEY_CURRENT_USER);

HKEY CurrentKey (текущий раздел реестра, только для чтения);

AnsiString CurrentPath (путь к текущему разделу реестра, только для чтения).

  • методы:

/* открытие или (если CanCreate=true) при необходимости создание текущего раздела реестра Key */

bool OpenKey(const AnsiString Key, bool CanCreate);

/* запись (перезапись) в текущий раздел реестра значения параметра Name из буфера Buffer длины BufSize */

void WriteBinaryData(const AnsiString Name, void *Buffer, int BufSize);

// запись и закрытие текущего раздела реестра

void CloseKey();

// проверка существования в реестре раздела Key

bool KeyExists(const AnsiString Key);

/* чтение из текущего раздела реестра значения параметра Name в буфер Buffer длины BufSize */

int ReadBinaryData(const AnsiString Name, void *Buffer, int BufSize);

  1. Работа с реестром Windows в Visual C++:

Класс CWinApp:

  • поля:

LPCTSTR m_pszRegistryKey (текущий раздел реестра, предназначенный для хранения настроек приложения, по умолчанию внутри НКЕУ_CURRENT_USER\Software)

LPCTSTR m_pszProfileName (имя подраздела реестра внутри текущего раздела, по умолчанию совпадает с именем приложения)

  • методы:

/* запись в раздел lpszSection (внутри текущий раздел \ имя подраздела) параметра lpszEntry из буфера pData длины nBytes */

BOOL WriteProfileBinary ( LPCTSTR lpszSection, LPCTSTR lpszEntry, LPBYTE pData, UINT nBytes);

/* чтение значения параметра lpszEntry из раздела lpszSection (внутри текущий раздел \ имя подраздела) в буфер *ppData длины *pBytes */

BOOL GetProfileBinary ( LPCTSTR lpszSection, LPCTSTR lpszEntry, LPBYTE *ppData, UINT *pBytes);

/* Функция для выделения памяти под значение поля класса CWinApp при его изменении (создание дубликата строки strSource для возможности его освобождения деструктором класса) */

wchar_t *_wcsdup( const wchar_t *strSource);

  1. Отображение системного диалога для выбора папки (при установке программы) и получение полного пути к выбранной пользователем папке. Требуется подключение файла shlobj.h.

/* отображение системного диалога; структура *lpbi содержит информацию для настройки диалога: функция возвращает указатель на созданный элемент, хранящий размещение выбранной пользователем папки; при отказе пользователя от выбора функция возвращает NULL */

LPITEMIDLIST SHBrowseForFolder(LPBROWSEINFO lpbi);

// вариант предыдущей функции для Microsoft Visual Studio

PIDLIST_ABSOLUTE SHBrowseForFolder(LPBROWSEINFO lpbi);

/* преобразование размещения папки pidl, полученного с помощью функции SHBrowseForFolder, в полный путь к этой паке в буфере pszPath длиной не менее MAX_PATH байт */

BOOL SHGetPathFromIDList(LPCITEMIDLIST pidl, LPSTR pszPath);

// вариант предыдущей функции для Microsoft Visual Studio

BOOL SHGetPathFromIDList(PCIDLIST_ABSOLUTE pidl, LPTSTR pszPath);

/* освобождение памяти, выделенной при выполнении функции SHBrowseForFolder, указатель на которую данная функция возвратила в качестве результата */

HLOCAL LocalFree(HLOCAL hMem);

void CoTaskMemFree(LPVOID pv);