|
| БЕСПЛАТНАЯ ежедневная online лотерея! Выигрывай каждый день БЕСПЛАТНО! |
|
|
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);
|
|
|
|
| |