2013-10-05 5 views
0

Я написал веб-сервис, который сервер написан на php, а клиент написан на C++, и я использовал пакет openssl для генерации ключа пары rsa для защиты передачи данных. На первом я написал как клиент сервер в php для подготовки сервисов, так и все идет хорошо. но когда я начал передавать клиентский php-код в C++, я сталкиваюсь с проблемами с методами openssl. Большая проблема заключается в том, что подписанные данные не совпадают ни с кодами php и C++. Я получаю md5 данных и использую метод openssl_sign для подписания данных md5, а затем добавляю знак в конце простых данных и отправляю клиенту (в прошлом открытый ключ был отправлен клиенту). в клиенте я сделал это снова. но знак dos не проверяется правильно.подписать файл с openssl в php и проверить в C++

Что не так в программе can?

помогите, спасибо.

PHP сторона (вебсервис) Код:

function sign($cleartext) 
$msg_hash = md5($cleartext); 
$sig  = ""; 
      $ok  = openssl_sign($msg_hash, $sig, $this->private_key); 
if ($ok == 1) 
{ 
    $signed_data = $cleartext . "----SIGNATURE:----" . base64_encode($sig); 
    //$signed_data = $this->encryptAES($signed_data, $this->password); 
    return base64_encode(mysql_real_escape_string($signed_data)); 
} 
elseif ($ok == 0) 
{ 
    $eroor = "bad"; 
    return base64_encode($eroor); 
} 
else 
{ 
    $eroor = "ugly, error checking signature"; 
    return base64_encode($eroor); 
} 
} 

и C++ сторона (клиент) Код:

int Crypto::rsaVerify(string msgStr, const char *pk) { 

int length; 

char *pkStr = new char[this->publicKey.length() + 1]; 
strcpy_s(pkStr, this->publicKey.length()+1,this->publicKey.c_str()); 

this->setPubKey((unsigned char *)pkStr,strlen(pkStr)); 

// Find and Splite Data 
size_t current = 0; 
string delimiters = "----SIGNATURE:----"; 
size_t next = msgStr.find(delimiters, current); 
string dataStr = msgStr.substr(current, next - current); 
char *msg = new char[dataStr.length() + 1]; 
strcpy_s(msg, dataStr.length()+1,dataStr.c_str()); 

// Find and Split sign 
string signData = msgStr.substr(next + delimiters.length(), msgStr.length()); 
Coding *codingObj = new Coding(); 
signData = codingObj->base64_decode(signData); 
char *signBuf = new char[signData.length() + 1]; 
strcpy_s(signBuf, signData.length()+1, signData.c_str()); 

unsigned char *dataMD5 = new unsigned char [MD5_DIGEST_LENGTH]; 
MD5((const unsigned char *)msg,strlen(msg),dataMD5); 

char md5String[MD5_DIGEST_LENGTH + 1]; 
AsciiString2HexString(dataMD5,(unsigned char *)md5String, MD5_DIGEST_LENGTH); 
md5String[MD5_DIGEST_LENGTH] = '\0'; 

char md5String1[MD5_DIGEST_LENGTH + 1]; 
AsciiString2HexString((unsigned char *)md5String1,(unsigned char *)md5String1, MD5_DIGEST_LENGTH); 
md5String1[MD5_DIGEST_LENGTH] = '\0'; 

unsigned char * key2; 
getPubKey(&key2); 

unsigned int signLen = 256;//strlen(md5String); 
char errorBuffer[120]; 

unsigned char message_digest[SHA_DIGEST_LENGTH]; 
SHA1((const unsigned char *)md5String1, strlen(md5String1), message_digest); 

if(RSA_verify(NID_sha1,(const unsigned char *)message_digest, SHA_DIGEST_LENGTH,(const unsigned char *)signBuf,signLen,this->keyPair)) 
{ 
    return 1; 
} 
else 
{ 
    ERR_error_string(ERR_get_error(), errorBuffer); 
} 

if(RSA_verify(NID_sha1,(const unsigned char *)md5String1, strlen(md5String1),(const unsigned char *)signBuf,signLen,this->keyPair)) 
{ 
    return 1; 
} 
else 
{ 
    ERR_error_string(ERR_get_error(), errorBuffer); 
} 

if(RSA_verify(NID_sha1,(const unsigned char *)md5String, strlen(md5String),(const unsigned char *)signBuf,signLen,this->keyPair)) 
{ 
    return 1; 
} 
else 
{ 
    ERR_error_string(ERR_get_error(), errorBuffer); 
} 

if(RSA_verify(NID_sha1,(const unsigned char *)dataMD5, strlen((char *)dataMD5),(const unsigned char *)signBuf,signLen,this->keyPair)) 
{ 
    return 1; 
} 
else 
{ 
    ERR_error_string(ERR_get_error(), errorBuffer); 
} 

return 0; 
} 


int Crypto::getPriKey(unsigned char **priKey) { 

BIO *bio = BIO_new(BIO_s_mem()); 
PEM_write_bio_RSAPrivateKey(bio, this->keyPair, NULL, NULL, NULL, NULL, NULL); 

int priKeyLen = BIO_pending(bio); 
*priKey = (unsigned char*)malloc(priKeyLen); 
if(priKey == NULL) return FAILURE; 

BIO_read(bio, *priKey, priKeyLen); 

// Insert the NUL terminator 
(*priKey)[priKeyLen-1] = '\0'; 

BIO_free_all(bio); 

return priKeyLen; 
} 

ответ

0

Может быть, потому что openssl_sign нужны данные как первый аргумент, а не хэш данных. По умолчанию хэш помещается этой функцией с помощью OPENSSL_ALGO_SHA1.

И, если хотите, предпочитаете SHA2, 256 бит и более. MD5 и SHA1 не рекомендуются для новых проектов ...