2013-11-16 4 views
1

У меня есть приложение C++, чтобы подписать и проверить некоторые данные, теперь я хочу, чтобы проверить данные в PHP, после мой C++ код для подписи данных:C++ DSS Подпись проверка в PHP

extern "C" __declspec(dllexport) BYTE* Sign(BYTE* bytdata) 
{ 
    // Private key blob 
    BYTE prKeyBlob[] = {7 , 2 , 0 , 0 , 0 , 34 , 0 , 0 , ...}; 

    HCRYPTPROV hProv = NULL; 
    HCRYPTKEY prKey; 
    HCRYPTHASH hHash; 
    DWORD SignLen; 

    if(CryptAcquireContext(&hProv, NULL, NULL, PROV_DSS, CRYPT_VERIFYCONTEXT)) 
// Creating cryptography provider 
    { 
     // Importing public key 
     if(!CryptImportKey(hProv, prKeyBlob, sizeof(prKeyBlob), 0, 0, &prKey)) 
      return NULL; 

     // Creating hash object 
     if(!CryptCreateHash(hProv, CALG_SHA, 0, 0, &hHash)) 
      return NULL; 

     if(!CryptHashData(hHash, bytdata, DATALEN, 0)) 
      return NULL; 

     // Signing hashed value 
     if(!CryptSignHash(hHash, AT_SIGNATURE, NULL, 0, NULL, &SignLen)) 
      return NULL; 

     BYTE* bytSign = (BYTE*)malloc(SignLen); 
     if(CryptSignHash(hHash, AT_SIGNATURE, NULL, 0, bytSign, &SignLen)) 
      return bytSign; 
     else 
      return NULL; 
    } 
    else 
     return NULL; 
} 

Я попробовал PHP openssl_verify(), но я не могу правильно подать открытый ключ; в C++ У меня есть байтовый массив открытого ключа blob, но я не знаю, как извлечь открытый ключ из этого массива и использовать его с php openssl.

function verify($data, $sign) 
{ 
    // fetch public key from certificate and ready it 
    $cert = file_get_contents('./key.pem'); 
    $pubkeyid = openssl_get_publickey($cert) or die("KEY ERROR"); 

    // state whether signature is okay or not 
    return openssl_verify($data, $sign, $pubkeyid, OPENSSL_ALGO_DSS1)?1:0; 
} 

Но я получаю "ошибка: 0906D06C: PEM подпрограммы: PEM_read_bio: нет линия старта" от openssl_get_publickey

моего содержания key.pem файла:

-----BEGIN PUBLIC KEY----- 
fkNkBaO1Y0ZruN8LD8BGm3IF00bbSNZN/ql8ak0duOjbzDP229rnkPFDIPihbO 
9Uw6369b3suwqvPY3w+VzwRKKfLG99KiMxMgF3H3IvJl8hyzQf6qJGJ9X 
sonzhrTqDeugT9fa2FnpY5pg+7g+6MqSRh1T0qTii9JFcwVf5r/o= 
-----END PUBLIC KEY----- 

Спасибо заранее.

+1

Это не форум, который позволяет вам получить реализацию бесплатно. Пожалуйста, покажите нам, что вы пробовали. «Я пробовал PHP openssl_verify(), но я не могу правильно подать открытый ключ» - это не описание ошибки. –

+0

Вопрос обновлен –

ответ

0

В документации PHP есть четкое указание, что не так. PHP извлекает открытый ключ из сертификата, если вы используете openssl_get_publickey. К сожалению, у вас нет сертификата, у вас есть только открытый ключ.

Итак, есть два варианта: создать (самозаверяющий?) Сертификат вокруг вашего открытого ключа или найти функцию на PHP, которая читает открытый ключ PEM. К сожалению, эта последняя функция, кажется, отсутствует в действии.

+0

Извините за поздний ответ, пропустил обновление .. –

+0

Благодарим вас за ответ. Моя проблема заключалась в том, что я не смог преобразовать свой публичный blob в pem или сертификат или наоборот, однако я изменил свой код на C++ и используется библиотека openssl для C++ для решения проблемы –

Смежные вопросы