Длина ключа CryptoAPI
От: NetSlow  
Дата: 19.12.06 07:00
Оценка:
Такой вопрос: можно ли и если можно то как установить длину ключа для RC4?
Например полученного таким образом:
HCRYPTKEY hKey=0;
CryptGenKey(hProv, CALG_RC4, CRYPT_EXPORTABLE | CRYPT_ENCRYPT | CRYPT_DECRYPT, &hKey);

Да и еще вопрос по CryptoAPI может кто знает можно ли как-нибудь отключить появление окошка запроса разрешения н доступ к закрытому ключу, когда происходит импорт сессионного ключа ?
Re: Длина ключа CryptoAPI
От: SergH Россия  
Дата: 19.12.06 08:45
Оценка:
Здравствуйте, NetSlow, Вы писали:

NS>Такой вопрос: можно ли и если можно то как установить длину ключа для RC4?


В описании CryptDeriveKey написано, что старшие 16 бит параметра dwFlags задают длинну ключа. Насколько я помню, практика показывала, что это работает и для CryptGenKey. В описании самой CryptGenKey явным образом сказано только про ассимметричные алгоритмы, но есть ссылка на CryptDeriveKey, с комментарием, что про длину симметричных написано там...

NS>Например полученного таким образом:

NS>HCRYPTKEY hKey=0;
NS>CryptGenKey(hProv, CALG_RC4, CRYPT_EXPORTABLE | CRYPT_ENCRYPT | CRYPT_DECRYPT, &hKey);

После того, как он получен, изменить длину уже нельзя.

NS>Да и еще вопрос по CryptoAPI может кто знает можно ли как-нибудь отключить появление окошка запроса разрешения н доступ к закрытому ключу, когда происходит импорт сессионного ключа ?


Какая ОС, какой CSP, пример кода? У меня никаких окошек.
Делай что должно, и будь что будет
Re[2]: Длина ключа CryptoAPI
От: NetSlow  
Дата: 19.12.06 11:34
Оценка:
Спасибо, разобрался как менять длину ключа, правда жаль что она от 40 до 56 бит...

А вот может мне кто ответит на 2-й вопрос как убрать окошко запроса разрешения н доступ к закрытому ключу?
Re[3]: Длина ключа CryptoAPI
От: SergH Россия  
Дата: 19.12.06 11:38
Оценка:
Здравствуйте, NetSlow, Вы писали:

NS>Спасибо, разобрался как менять длину ключа, правда жаль что она от 40 до 56 бит...


Зависит от CSP. Для MS Enhanced — от 40 до 128

NS>А вот может мне кто ответит на 2-й вопрос как убрать окошко запроса разрешения н доступ к закрытому ключу?


Ещё раз повторяю вопрос.

Какая ОС, какой CSP, пример кода? У меня никаких окошек.
Делай что должно, и будь что будет
Re[4]: Длина ключа CryptoAPI
От: NetSlow  
Дата: 19.12.06 11:58
Оценка:
Здравствуйте, 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;
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.