На главную

On-line справка по Win32 API

Написать письмо
БЕСПЛАТНАЯ ежедневная online лотерея! Выигрывай каждый день БЕСПЛАТНО!
Список всех статей A-B-C-D-E-F-G-H-I-J-K-L-M-N-O-P-Q-R-S-T-U-V-W-X-Y-Z | Скачать Вниз

Receiver Code Example



This section illustrates the code needed on the destination user side to implement the three-phase key exchange protocol. The details of the communication between sending user and the destination user are not shown, because these will be different for each implementation.

#include

HCRYPTPROV hProv = 0;

#define NAME_SIZE 256
BYTE pbDestName[NAME_SIZE];
DWORD dwDestNameLen;
BYTE pbSendName[NAME_SIZE];
DWORD dwSendNameLen;

HCRYPTKEY hSendPubKey = 0;
HCRYPTKEY hKeyA = 0;
HCRYPTKEY hKeyB = 0;

#define BLOB_SIZE 256
BYTE pbKeyBlob[BLOB_SIZE];
DWORD dwBlobLen;

#define HASH_SIZE 256
BYTE pbHash[HASH_SIZE];
DWORD dwHashLen;
BYTE pbSendHash[HASH_SIZE];
DWORD dwSendHashLen;
HCRYPTHASH hHash = 0;

// Get handle to the default provider.

CryptAcquireContext(&hProv, NULL, NULL, PROV_RSA_FULL, 0);

// Obtain the sending user's exchange public key. Import it into the
// CSP and place a handle to it in 'hSendPubKey'.
...

// Obtain the sending user's name. This is usually done at the
// same time the public key was obtained. Place this in
// 'pbSendName' and set 'dwSendNameLen' to the number of bytes in
// the name.
...

// Place the destination user's name in 'pbDestName' and set
// 'dwDestNameLen' to the number of bytes in the name.

...

// Receive a key blob containing session key A from the sending user
// and place it in 'pbKeyBlob'. Set 'dwBlobLen' to the number of
// bytes in the key blob.
...

// Import the key blob into the CSP.
CryptImportKey(hProv, pbKeyBlob, dwBlobLen, 0, 0, &hKeyA);

// Create a random session key (session key B). Because this key is
// going to be used solely for key exchange and not encryption, it
// does not matter which algorithm you specify here.
CryptGenKey(hProv, CALG_RC2, CRYPT_EXPORTABLE, &hKeyB);


// Export session key B into a simple key blob.
dwBlobLen = BLOB_SIZE;
CryptExportKey(hKeyB, hSendPubKey, SIMPLEBLOB, 0, pbKeyBlob, &dwBlobLen);

// Transmit key blob containing session key B to the sending user.
...

//
// Compute hash value and transmit it to the sending user.
//

// Create hash object.
CryptCreateHash(hProv, CALG_MD5, 0, 0, &hHash);

// Add session key A to hash.
CryptHashSessionKey(hHash, hKeyA, 0);

// Add destination user's name to hash.

CryptHashData(hHash, pbDestName, dwDestNameLen, 0);

// Add session key B to hash.
CryptHashSessionKey(hHash, hKeyB, 0);

// Add sending user name to hash.
CryptHashData(hHash, pbSendName, dwSendNameLen, 0);

// Add "phase 2" text to hash.
CryptHashData(hHash, "phase 2", 7, 0);

// Complete the hash computation and retrieve the hash value.
dwHashLen = HASH_SIZE;
CryptGetHashParam(hHash, HP_HASHVALUE, pbHash, &dwHashLen, 0);

// Destroy the hash object.
CryptDestroyHash(hHash);


// Transmit the hash value to the sending user.
...

// Wait for the sending user to respond.
...

// Receive a hash value from the sending user and place it in
// 'pbSendHashValue'. Set 'dwSendHashLen' to the number of bytes in
// the hash value.
...

//
// Verify hash value received from the sending user.
//

// Create hash object.
CryptCreateHash(hProv, CALG_MD5, 0, 0, &hHash);

// Add session key B to hash.
CryptHashSessionKey(hHash, hKeyB, 0);


// Add sending user's name to hash.
CryptHashData(hHash, pbSendName, dwSendNameLen, 0);

// Add destination user's name to hash.
CryptHashData(hHash, pbDestName, dwDestNameLen, 0);

// Add "phase 3" text to hash.
CryptHashData(hHash, "phase 3", 7, 0);

// Complete the hash computation and retrieve the hash value.
dwHashLen = HASH_SIZE;
CryptGetHashParam(hHash, HP_HASHVALUE, pbHash, &dwHashLen, 0);

// Destroy the hash object.
CryptDestroyHash(hHash));

//

// Compare the hash value received from the sending user with the
// hash value that we just computed. If they do not match, then
// terminate the protocol.
//

if(dwHashLen!=dwSendHashLen || memcmp(pbHash, pbSendHash, dwHashLen)) {
printf("Key exchange protocol failed in phase 3!\n");
printf("Aborting protocol!\n");
return;
}

//
// Use session key B to encrypt messages sent to the sender.
// Use session key A to decrypt messages received from the sender.

//
...

// Destroy session keys.
CryptDestroyKey(hKeyA);
CryptDestroyKey(hKeyB);

// Destroy handle to sending user's public key.
CryptDestroyKey(hSharedKey);

// Release provider handle.
CryptReleaseContext(hProv, 0);



Пригласи друзей и счет твоего мобильника всегда будет положительным!
Предыдущая статья
 
Сайт Народ.Ру Интернет
Следующая статья
Пригласи друзей и счет твоего мобильника всегда будет положительным!

Кодовый Пример Получателя



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

#include

HCRYPTPROV hProv = 0;

#define NAME_SIZE 256 BYTE pbDestName[NAME_SIZE];
DWORD dwDestNameLen;
БАЙТ pbSendName[NAME_SIZE];
DWORD dwSendNameLen;

HCRYPTKEY hSendPubKey = 0;
HCRYPTKEY hKeyA = 0;
HCRYPTKEY hKeyB = 0;

#define BLOB_SIZE 256 BYTE pbKeyBlob[BLOB_SIZE];
DWORD dwBlobLen;

#define HASH_SIZE 256 BYTE pbHash[HASH_SIZE];
DWORD dwHashLen;
БАЙТ pbSendHash[HASH_SIZE];
DWORD dwSendHashLen;
HCRYPTHASH hHash = 0;

// Получите ручку встроенному поставщику.

CryptAcquireContext(&hProv, НЕДЕЙСТВИТЕЛЬНЫЙ, НЕДЕЙСТВИТЕЛЬНЫЙ, PROV_RSA_FULL, 0);

// Получите посылку потребителя биржевого общественного ключа. Импортируйте это в // CSP и устанавливайте ручку, чтобы это в 'hSendPubKey.
...

// Получите имя потребителя посылки. Это обычно сделан в // том же времени, общественный ключ был получен. Установите это в // 'pbSendName и установленное 'dwSendNameLen в количество байтов в // имя.
...

// Установите имя потребителя расположения в 'pbDestName и установившее // 'dwDestNameLen в количество байтов в имени.

...

// Приемник ключевой содержащий сеансовый ключ капли from посылающий потребитель // и место это в 'pbKeyBlob. Установите 'dwBlobLen в число // байтов в ключевой капле.
...

// Импортируйте ключевую каплю в CSP.
CryptImportKey(hProv, pbKeyBlob, dwBlobLen, 0, 0, &hKeyA);

// Создайте произвольный сеансовый ключ (сеансовый ключ B). Поскольку эта клавиша является // ходить, которое нужно использоваться исключительно для ключевого обмена и не шифрования, это // не имеет значения какой алгоритм, который Вы определяете здесь.
CryptGenKey(hProv, CALG_RC2, CRYPT_EXPORTABLE, &hKeyB);


// Экспортируйте сеансовую клавишу B в простую ключевую каплю.
dwBlobLen = BLOB_SIZE;
CryptExportKey(hKeyB, hSendPubKey, SIMPLEBLOB, 0, pbKeyBlob, &dwBlobLen);

// Передайте ключевую содержащую сеансовую клавишу капли B на посылающий пользователя.
...

//
// Вычислите величину хэша и передавайте это на посылающий пользователя.
//

// Создайте объект хэша.
CryptCreateHash(hProv, CALG_MD5, 0, 0, &hHash);

// Добавьте сеансовой клавише to хэш.
CryptHashSessionKey(hHash, hKeyA, 0);

// Добавьте имя пользователя расположения, чтобы обсуждаться.

CryptHashData(hHash, pbDestName, dwDestNameLen, 0);

// Добавьте сеансовую клавишу B, чтобы обсуждаться.
CryptHashSessionKey(hHash, hKeyB, 0);

// Добавьте имя пользователя посылки обсуждаться.
CryptHashData(hHash, pbSendName, dwSendNameLen, 0);

// Добавьте текст "фазы 2", чтобы обсуждаться.
CryptHashData(hHash, "ФАЗА 2", 7, 0);

// Завершите вычисление хэша и извлекайте величину хэша.
dwHashLen = HASH_SIZE;
CryptGetHashParam(hHash, HP_HASHVALUE, pbHash, &dwHashLen, 0);

// Уничтожьте объект хэша.
CryptDestroyHash(hHash);


// Передача величина хэша посылающему пользователю.
...

// Ожидание посылающий пользователь, чтобы отвечать.
...

// Приемник величина хэша из посылающего пользователя и место это в // 'pbSendHashValue. Установите 'dwSendHashLen в количество байтов в // величина хэша.
...

//
// Проверьте величину хэша полученную из посылающего пользователя.
//

// Создайте объект хэша.
CryptCreateHash(hProv, CALG_MD5, 0, 0, &hHash);

// Добавьте сеансовую клавишу B, чтобы обсуждаться.
CryptHashSessionKey(hHash, hKeyB, 0);


// Добавьте имя пользователя посылки обсуждаться.
CryptHashData(hHash, pbSendName, dwSendNameLen, 0);

// Добавьте имя пользователя расположения, чтобы обсуждаться.
CryptHashData(hHash, pbDestName, dwDestNameLen, 0);

// Добавьте текст "фазы 3", чтобы обсуждаться.
CryptHashData(hHash, "ФАЗА 3", 7, 0);

// Завершите вычисление хэша и извлекайте величину хэша.
dwHashLen = HASH_SIZE;
CryptGetHashParam(hHash, HP_HASHVALUE, pbHash, &dwHashLen, 0);

// Уничтожьте объект хэша.
CryptDestroyHash(hHash));

//

// Сравнение величина хэша получала из посылающего пользователя с // величиной хэша, что мы только что вычислили. Если они не сочетаются, тогда // завершать протокол.
//

если(dwHashLen!=dwSendHashLen || memcmp(pbHash, pbSendHash, dwHashLen)) { printf(БИРЖЕВОЙ протокол "Key терпел неудачу в фазе 3!\n");
printf("Aborting protocol!\n");
возврат;
}

//
// Сеансовая клавиша Использования B, чтобы кодировать сообщения посланные в передатчик.
// Сеансовая клавиша Использования to декодировать сообщения полученные из передатчика.

//
...

// Уничтожьте сеансовые клавиши.
CryptDestroyKey(hKeyA);
CryptDestroyKey(hKeyB);

// Уничтожьте ручку в посылку пользователя общественной клавиши.
CryptDestroyKey(hSharedKey);

// Ручка поставщика Версии.
CryptReleaseContext(hProv, 0);



Вверх Version 1.3, Oct 26 2010 © 2007, 2010, mrhx Вверх
 mrhx software  Русский перевод OpenGL  Русский перевод Win32 API
 
Используются технологии uCoz