Передача данных по протоколу HTTPS с подписыванием всех параметров по алгоритму RSA (мотодом POST)

wcb-falcon

Новичок
Прошу помощи в реализации подписания алгоритмом RSA
на сервере через SSH были созданы файлы ключей:
private.pem и public.pem
При введении данных в форме идет обработка:
PHP:
$postarr = $_POST;
$newpost = '';
foreach($postarr as $el=>$value){
    $newpost .= (empty($newpost)?'':'&').$el.'='.urlencode($value);
}
$urlpost = base64_encode($newpost);
после чего получаем строку вида:
Y29tbWFuZD1wFuZD10cmVhD10cmVhD10cmVhbSUyOQ (обрезана для экономии места)

эти данные передаем на другой сервер (используя метод stream )
примерно так:
PHP:
$url_host = 'https://sayt.ru';
$script = 'test.php';
$post = http_build_query(array('param'=>$urlpost));
$c_options = array(
	'http' => array(
		'method'=>'POST',
		'header'=>"Content-type: application/x-www-form-urlencoded\r\n"
		. "Content-Length: " . strlen($post) . "\r\n",
		'content'=>$post
	)
);
$context = stream_context_create($c_options);
$fp = fopen($url_host.'/'.$script, 'r', false, $context);
fpassthru($fp);
echo $fp;
fclose($fp);
тоесть еслибы это был GET метод то в адресной строке было бы чтото вроде этого:
https://sayt.ru/test.php?param=Y29tbWFuZD1wFuZD10cmVhD10cmVhD10cmVhbSUyOQ

но это передача без подписи, а мне нужно подписать эти данные ключем из файла public.pem
чтобы в результате отправки получилось:
https://sayt.ru/test.php
?param=BASE64(НАБОР_ПАРАМЕТРОВ)
&signature=BASE64(RSA_SIGN(НАБОР_ПАРАМЕТРОВ))


Прошу помочь реализовать подпись данных перед отправкой.
Заранее спасибо.
 

wcb-falcon

Новичок
а что такое https?
HTTPS (Hypertext Transfer Protocol Secure) — расширение протокола HTTP, поддерживающее шифрование. Данные, передаваемые по протоколу HTTPS, «упаковываются» в криптографический протокол SSL или TLS, тем самым обеспечивается защита этих данных. В отличие от HTTP, для HTTPS по умолчанию используется TCP-порт 443.

В принципе я уже нашел решение (перечитав множество мануалов) завтра если обмен со сторонним ресурсом произойдет удачно то выложу алгоритм шифрования (может кому поможет при реализации подобного рода вещей)
 

wcb-falcon

Новичок
Возможно и так судить вам :)
вот что у меня получилось
Файл обработки формы script.php
PHP:
$url_host = 'https://sayt.ru';
$script = '/test.php';
if(!empty($_REQUEST)){
	$postarr = $_REQUEST;
	$post = '';
	foreach($postarr as $el=>$value){
			$post .= (empty($post)?'':'&').$el.'='.$value;
	}
	$post_param = $post;
	$post_param = base64_encode($post_param);
	$post_param = urlencode($post_param);
}
$my_fp = fopen("./my_private.pem", "r");
$my_priv_key = fread($my_fp, 4096);
fclose($my_fp);
$my_res = openssl_pkey_get_private($my_priv_key);
openssl_private_encrypt($post, $post_signature, $my_priv_key);
$post_signature = base64_encode($post_signature);
$post_signature = urlencode($post_signature);
$urlpost = $post_param.'&signature='.$post_signature;
if(isset($_POST['stream']) || isset($_POST['qk_stream'])){
	$post = http_build_query(array('param'=>$urlpost));
	$c_options = array (
		'http' => array (
			'method'=>'POST',
			'header'=>"Content-type: application/x-www-form-urlencoded\r\n"
				. "Content-Length: " . strlen($post) . "\r\n",
			'content'=>$post
		)
	);
	$context = stream_context_create($c_options);
	$fp = @fopen($url_host.$script, 'r', false, $context);
	if($fp){
		fpassthru($fp);
		echo $fp;
		fclose($fp);
	}else{
		die('<br><b>Warning:</b><br>'.$url_host.$script.'?param='.$urlpost);
	}
}
Файл приема переданных данных test.php
PHP:
header("Content-Type: text/html; charset=UTF-8");
iconv_set_encoding("internal_encoding", "UTF-8");
iconv_set_encoding("output_encoding", "Windows-1251");
header("Cache-Control: no-store, no-cache, must-revalidate");
header("Cache-Control: post-check=0, pre-check=0", false);
header("Connection: close");

if(!empty($_REQUEST)){
	$req = serialize($_REQUEST);
	
	$value = $_REQUEST['param'];
	$valarr = explode("signature=", $value);
	
	$param = $valarr[0];
	$param = urldecode($param);
	$param = base64_decode($param);
	$postarr = explode("&", $param);
	$postend = array();
	foreach($postarr as $val){
		$valtemp = explode("=", $val);
		$postend[$valtemp[0]] = $valtemp[1];
	}
	$param = $postend;
	
	$signature = $valarr[1];
	$signature = urldecode($signature);
	$signature = base64_decode($signature);
	if(getenv("REMOTE_ADDR")=='127.0.0.1'){ # Если я у себя тестирую
		$my_fp = fopen("./my_public.pem", "r");
	}else{ # если пришел запрос от партнера
		$my_fp = fopen("./you_public.pem", "r");
	}
	$my_pub_key = fread($my_fp, 4096);
	fclose($my_fp);
	$my_res = openssl_pkey_get_public($my_pub_key); 
	openssl_public_decrypt($signature, $signature_end, $my_pub_key); 
	$postarr = explode("&", $signature_end);
	$postend = array();
	foreach($postarr as $val){
		$valtemp = explode("=", $val);
		$postend[$valtemp[0]] = $valtemp[1];
	}
	$signature = $postend;

	echo '<h1>VSE_OK</h1>';
	# Подключение к БД и запись обработанной информации
	echo '<br>';
	var_dump($param);
	echo '<br>';
	var_dump($signature);
	echo '<br>';
}
При этом получился вот такой алгоритм передачи
algoritm.JPG
 
Сверху