在php中使用openssl签名文件并在c ++中验证 [英] sign a file with openssl in php and verify in c++

查看:113
本文介绍了在php中使用openssl签名文件并在c ++中验证的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述


我写了一个web服务,服务器用php编写,客户端用c ++编写,我使用openssl包生成rsa对密钥以保证数据传输。

首先,我在php中编写了两个客户端服务器,用于准备服务,一切顺利。但是当我开始将客户端php代码转换为c ++时,我遇到了openssl方法的问题。

最大的问题是签名数据在php和c ++代码中都不匹配。

我获取md5数据并使用 openssl_sign 方法签署md5数据,然后在明文数据末尾附加符号并发送到客户端(过去已为客户端发送公钥)。在客户端我再次做了这个进步。但标志不能正确验证。



可能程序有什么问题?



请帮助,谢谢。



php side(webservice)代码:



Hi I wrote a webservice that server is written in php and client is written in c++, and I used openssl package for generating rsa pair key to secure data transferming.
At the first I wrote both client an server in php for preparing services and every things goes OK. but when I started transfer client php code into c++ I face into problems with openssl methods.
The big problem is that the signed data does not match in both php and c++ codes.
I get md5 of data and use openssl_sign method for signing md5 data and then append the sign at the end of plain data and send to client (In the past public key have been sent for client). in the client I did this progress again. but the sign dos not verify correctly.

What is wrong in may program?

please help, thanks.

php side (webservice) code:

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 ++方(客户端)代码:





and C++ side (client) Code:

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

	int length;

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


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

	// 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];
	char *signBuf2 = 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';

	unsigned char * key2;
	getPubKey(&key2);

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

	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;
}

推荐答案

cleartext)
cleartext)


msg_hash = md5(
msg_hash = md5(


cleartext);
cleartext);


这篇关于在php中使用openssl签名文件并在c ++中验证的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆