Здравствуйте, SergH, Вы писали:
SH>Здравствуйте, NetSlow, Вы писали:
NS>>Спасибо, разобрался как менять длину ключа, правда жаль что она от 40 до 56 бит...
SH>Зависит от CSP. Для MS Enhanced — от 40 до 128
NS>>А вот может мне кто ответит на 2-й вопрос как убрать окошко запроса разрешения н доступ к закрытому ключу?
SH>Ещё раз повторяю вопрос.
SH>Какая ОС, какой CSP, пример кода? У меня никаких окошек.
Ах да, прошу прощения не заметил:
ОС: WinXP HE SP2
CSP: MS_DEF_PROV
Вот код:
#include "stdafx.h"
#include <windows.h>
#include <Wincrypt.h>
#include <stdio.h>
#include <iostream>
#define PROV_NAME MS_DEF_PROV
#define PROV_TYPE PROV_RSA_FULL
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
HCRYPTPROV hProv;
HCRYPTKEY hKey=0, hPublicKey=0, hKeyPair=0, hSesKey=0;
DWORD dwEffectiveLen = CRYPT_KEY_LEN;
DWORD dwCipherMode = CRYPT_CIPHER_MODE;
int size;
try {
DWORD dwDataLen = 0;
BYTE * data ;
if(!CryptAcquireContext(&hProv,L"SecureGetSrv",PROV_NAME,PROV_TYPE,CRYPT_NEWKEYSET))//CRYPT_DELETEKEYSET
if(!CryptAcquireContext(&hProv,L"SecureGetSrv",PROV_NAME,PROV_TYPE,0))
throw CantGetHandleException("Can't get crypto provider handle exception!");
if (!CryptGetUserKey(hProv,AT_KEYEXCHANGE,&hKeyPair))
if (!CryptGenKey(hProv,AT_KEYEXCHANGE,CRYPT_EXPORTABLE | CRYPT_ENCRYPT | CRYPT_DECRYPT,&hKeyPair))
throw Exception("Can't gen key pair exception");
if (!CryptExportKey(hKeyPair,0,PUBLICKEYBLOB,NULL,NULL,&dwDataLen))
throw Exception("Can't receive export key length exception");
data = static_cast<BYTE*>(malloc(dwDataLen));
ZeroMemory(data,dwDataLen);
if (!CryptExportKey(hKeyPair,0,PUBLICKEYBLOB,NULL,data,&dwDataLen))
throw Exception("Can't export key exception");
if (!CryptDestroyKey(hKeyPair))
throw Exception("Can't destroy key pair");
if(!CryptReleaseContext(hProv,NULL))
throw Exception("Can't destroy hash exception!");
// client>
//<server
if(!CryptAcquireContext(&hProv,L"SecureGet",PROV_NAME,PROV_TYPE,CRYPT_NEWKEYSET))//CRYPT_DELETEKEYSET
if(!CryptAcquireContext(&hProv,L"SecureGet",PROV_NAME,PROV_TYPE,0))
throw CantGetHandleException("Can't get crypto provider handle exception!");
char net[1024];
memcpy(net,(const char*)data,dwDataLen);
free(data);
data = static_cast<BYTE*>(malloc(dwDataLen));
ZeroMemory(data,dwDataLen);
memcpy((char*)data,net,dwDataLen);
if (!CryptImportKey(hProv,data,dwDataLen,0,0,&hPublicKey))
throw Exception("Can't import public key exception");
if (!CryptGenKey(hProv, CALG_RC4, CRYPT_EXPORTABLE | CRYPT_ENCRYPT | CRYPT_DECRYPT, &hSesKey))
throw Exception("Can't gen key exception");
char str[] = "Test567dsfsdfsdfsdfsdfadfagfdhfdh";
cout << "Message: " << str << endl;
dwDataLen = strlen(str);
if (!CryptEncrypt(hSesKey,0,true,0,(BYTE*)str,&dwDataLen,strlen(str)))
throw Exception("Can't encrypt data exception");
cout << "Encrypted message: " << str << endl;
if (!CryptExportKey(hSesKey,hPublicKey,SIMPLEBLOB,0,0,&dwDataLen))
throw Exception("Error");
free(data);
data = static_cast<BYTE*>(malloc(dwDataLen));
ZeroMemory(data,dwDataLen);
if (!CryptExportKey(hSesKey,hPublicKey,SIMPLEBLOB,0,data,&dwDataLen))
throw Exception("Error");
if (!CryptDestroyKey(hPublicKey))
throw Exception("Can't destroy session key exception!");
if (!CryptDestroyKey(hSesKey))
throw Exception("Can't destroy key exception");
if(!CryptReleaseContext(hProv,NULL))
throw Exception("Can't destroy hash exception!");
DWORD size = strlen(str);
//server>
//<client
if(!CryptAcquireContext(&hProv,L"SecureGetSrv",PROV_NAME,PROV_TYPE,CRYPT_NEWKEYSET))//CRYPT_DELETEKEYSET
if(!CryptAcquireContext(&hProv,L"SecureGetSrv",PROV_NAME,PROV_TYPE,0))
throw CantGetHandleException("Can't get crypto provider handle exception!");
if (!CryptGetUserKey(hProv,AT_KEYEXCHANGE,&hKeyPair))
throw Exception("Can't gen key pair exception");
if (!CryptImportKey(hProv,data,sizeof(data),hKeyPair,0,&hSesKey))
throw Exception("Can't import session key exception");
if (!CryptDecrypt(hSesKey,0,true,NULL,(BYTE*)str,&size))
throw Exception("Can't decrypt data");
cout << "Decrypted message: " << str << endl;
if (!CryptDestroyKey(hSesKey))
throw Exception("Can't destroy session key exception");
if(!CryptReleaseContext(hProv,NULL))
throw Exception("Can't destroy hash exception!");
//client>
}
catch(...)
{
cout << "Error! " endl ;
}
return 0;
}